2016-09-06 1 views
0

Ich arbeite an einem Server, der viele Perl-Bibliotheken fehlt, so dass ich mit MIME :: Lite bleiben. Ja, ich sollte etwas anderes benutzen, aber es liegt nicht unter meiner Kontrolle.Perl MIME :: Lite verschachtelte Grenzen

Insgesamt muss das E-Mail-Paket "multipart/mixed" sein. Es wird die Klartext-Version, HTML-Version und einen Anhang haben. Das Problem ist, es zeigt BEIDE Text und HTML-Version im E-Mail-Text.

Ich möchte immer noch "multipart/alternative" unterstützen, so dass es entweder Klartext oder HTML zeigt. Da ich jedoch einen Anhang benötige, sollte die gesamte E-Mail "multipart/mixed" mit einem inneren Grenzabschnitt mit "multipart/alternativ" für text/html-Versionen sein.

Obwohl ich hatte es funktioniert, aber es fällt die Anlage wegen der gesamten E-Mail-Paket wurde "multipart/alternative". Einige E-Mails in meinem Posteingang überprüfen, und ich bemerkte, dass Sie zuerst "gemischt" haben können, dann haben Sie innen "Alternative". Wie ein div in einem div :)

Hier ist mein aktueller Code Schnipsel (schauen Sie bitte für meine Kommentare Definieren der Grenze):

my $type = 'multipart/mixed'; 

sub sendMail { 
    my($from, $to, $subject, $messageHtml, $messageText, $type, %attachment) = @_; 

    my $msg = MIME::Lite->new(
      From  => $from, 
      To  => $to, 
      Subject => $subject, 
      Type  => $type, # multipart/mixed 
    ); 

    # -- start new boundary and multipart/alternative 
    if ($messageText ne '') { 
     $msg->attach(
       Type => 'text/plain; charset=UTF-8', 
       Encoding => 'quoted-printable', 
       Data => $messageText, 
     ); 
    } 

    if ($messageHtml ne '') { 
     $msg->attach(
       Type => 'text/html; charset=UTF-8', 
       Encoding => 'quoted-printable', 
       Data => $messageHtml, 
     ); 
    } 
    # -- end new boundary 

    if (%attachment) { 
     $msg->attach(
       Type  => $attachment{"type"}, 
       Encoding => 'base64', 
       Path  => $attachment{"path"}, 
       Filename => $attachment{"filename"}, 
       Disposition => 'attachment' 
     ); 
    } 

    if ($debugmode) { 
     my $result = ''; 
     $msg->print($result); 
     print $result; 
     exit; 
    } 

    if ($msg->send) { 
     return 1; 
    } 

    return 0; 
} 

ich den Code ändern, würde zu überprüfen, ob HTML und Nur-Text war bestanden. Ich bin mir bewusst, dass ich keine Alternative brauche, wenn nur 1 von ihnen verwendet wird.

Auch hier muss ich die Klartext und HTML-Abschnitte, innerhalb ihrer eigenen Grenze als „multipart/alternative“

Antwort

3

Sie müssen sein, zuerst die Nachricht als multipart/mixed erstellen. In dieser Nachricht müssen Sie einen inneren Teil als multipart/alternative erstellen. Auf diesen inneren Teil sollten Sie die HTML- und Textteile anfügen. Und der Anhang sollte dem äußeren (gemischten) Teil hinzugefügt werden. Dies könnte mit Code wie folgt erreicht werden:

use strict; 
use warnings; 
use MIME::Lite; 

# main message is multipart/mixed 
my $msg = MIME::Lite->new(
    From => '[email protected]', 
    To  => '[email protected]', 
    Subject => 'some test message', 
    Type => 'multipart/mixed' 
); 

# inner part as multipart/alternative to include both HTML and text 
my $alternative = $msg->attach(
    Type => 'multipart/alternative', 
); 
$alternative->attach(
    Type => 'text/plain', 
    Data => 'some TEXT here' 
); 
$alternative->attach(
    Type => 'text/html', 
    Data => '<b>some HTML here</b>' 
); 

# attached image goes to main message 
$msg->attach(
    Type => 'image/gif', 
    Data => 'GIF89a....' 
); 

print $msg->as_string; 
+0

Hat gut funktioniert, danke. Diese Methode sollte in ihren Dokumenten sein :) Sie sagen jedoch, dass Sie eine andere Bibliothek verwenden sollten. Leider hatte ich keine Wahl. Vielen Dank für Ihre schnelle und prägnante Antwort. –

+0

@WadeShuler: eigentlich habe ich gerade die docs verfolgt. Der wichtige Teil der Dokumentation besteht darin, dass "attach" den neuen Teil zurückgibt und alternativ, dass Sie ein vollständiges Teil erstellen und anhängen können. Aber ein Beispiel für diesen komplexeren, aber typischen Anwendungsfall wäre in der Dokumentation nützlich. –