sascha: grafik bei mail anzeigen

Hallo,

wenn ich in perl beim mailbefehl folgenden zusatz ergänze:
 "Content-type: text/html\n";

müßte ich doch eigentlich den text als html senden.
bei reinem text geht das auch.
wie ist das aber bei grafiken?
kann ich die als link einfügen?
<img src=....

bei mir wird dann ímmer nur ein kleines kästchen angezeigt, als
ob da ne grafik wäre?

hat vielleicht jemand einen sonntagstipp :-)
sascha

  1. Moin!

    Hallo,

    wenn ich in perl beim mailbefehl folgenden zusatz ergänze:
    "Content-type: text/html\n";

    müßte ich doch eigentlich den text als html senden.
    bei reinem text geht das auch.
    wie ist das aber bei grafiken?
    kann ich die als link einfügen?
    <img src=....

    bei mir wird dann ímmer nur ein kleines kästchen angezeigt, als
    ob da ne grafik wäre?

    hat vielleicht jemand einen sonntagstipp :-)

    Perl hat Module für sowas. Nutze sie! CPAN existiert und bietet eine Suchfunktion.

    Es wird ansonsten sehr aufwendig, eine den RFCs entsprechende Mail mit Bild-Attachment selbst herzustellen - würde zwar grundsätzlich gehen, aber du willst ja wohl auch, dass man die Mail überall empfangen kann.

    Ach ja, noch was: Bilder in Mails werden nicht mit Garantie angezeigt. Wenn sie nicht als Attachment enthalten sind, ist die Chance zur Anzeige vielleicht 0,1%, wenn sie als Attachment enthalten sind, steigt sie auf gefühlt 20%. Der Grund ist simpel: Kein Mailprogramm lädt ohne Zustimmung des Users ein Bild mit evtl. eindeutiger ID in der URL aus dem Internet nach, weil er damit bei Spam-Mails eine Lesebestätigung liefern würde. Und außerdem gibt es ja nicht nur normale Mailprogramme (die evtl. die Mail sowieso nicht als HTML anzeigen), sondern auch sehr viele Webmail-Oberflächen. Und die haben nochmal andere Ansichten über die Darstellung von Mails.

    Deshalb ist das simpelste: Mails nur als text/plain senden.

    - Sven Rautenberg

    1. Moin Moin!

      Deshalb ist das simpelste: Mails nur als text/plain senden.

      Full ack.

      Perl hat Module für sowas. Nutze sie! CPAN existiert und bietet eine Suchfunktion.

      Sehr einfach mit MIME::Lite. Das ist zwar nicht die reine Lehre der Modularität, aber durchaus bewähert.

      Ach ja, eine der ersten Aktionen des aufrufenden Scripts sollte

      MIME::Lite->send('smtp',$mailserver,AuthUser=>$login, AuthPass=>$password);

      sein, also z.B.

      MIME::Lite->send('smtp','mail.example.com',AuthUser=>'joe.average@example.com', AuthPass=>'t0ps3cr3t');

      Damit wird das Versenden über SMTP global aktiviert. Das Default-Verhalten, mit sendmail herumzufummeln, funktioniert bestenfalls auf Unix-Systemen, und selbst dort nicht überall.

      Ältere Versionen von MIME::Lite sind ein wenig dämlich, sie erwarten bei der Installation(!) und im Betrieb, dass nicht-Windows-Systeme über ein Programm namens sendmail verfügen. Fehlt es, wird das Programm gnadenlos abgeschossen. Abhilfe: Neueste Version installieren oder dafür sorgen, dass irgendwo ein Dummy-Programm namens sendmail existiert. Der folgende Zweizeiler oder ein Symlink auf /bin/true reichen aus:

        
      #!/bin/sh  
      exit 0  
      
      

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Nein, MIME::Lite soll nicht mehr für neue Projekte eingesetzt werden. Aus erster Hand: http://stackoverflow.com/questions/338896/what-is-the-best-perl-module-for-sending-email/414253#414253

        aber durchaus bewähert.

        Alexander, du bist unbelehrbar, meine Ausführungen in </archiv/2010/2/t195606/#m1310304> hast du unbeachtet gelassen. Ich möchte, dass du es ab sofort unterlässt, M::L zu bewerben, weil damit unweigerlich Datenverlust einhergeht. "Bewährt" ist das genaue Gegenteil.

        1. Moin Moin!

          Ich möchte, dass du es ab sofort unterlässt, M::L zu bewerben

          Und ich möchte ein Pony.

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Mahlzeit Alexander (HH),

            Ich möchte, dass du es ab sofort unterlässt, M::L zu bewerben

            Und ich möchte ein Pony.

            Dann geh' zum Friseur ...

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:& n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        2. Moin Moin!

          Nein, MIME::Lite soll nicht mehr für neue Projekte eingesetzt werden. Aus erster Hand: http://stackoverflow.com/questions/338896/what-is-the-best-perl-module-for-sending-email/414253#414253

          Hmm, brian d foy. In Sachen Perl definitiv nicht der Ahnungsloseste. Aber was hat der mit MIME::Lite zu tun, außer dass er Bücher über Perl und einige Perl-Module geschrieben hat? Unter "aus erster Hand" verstehe ich Äußerungen von einem der Autoren bzw. Maintainer, bevorzugt vom aktuellen.

          Wenn Dir MIME::Lite dermaßen gegen den Strich geht, dann nimm doch Kontakt mit Ricardo Signes auf und bitte ihn, MIME::Lite vom CPAN zu löschen oder ganz deutlich als "deprecated" zu markieren.

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Hmm

            Wer lesen kann, ist klar im Vorteil. Der Beitrag stammt von rjbs.

            vom CPAN zu löschen oder … als "deprecated" zu markieren

            Nein. Das entspricht nicht den Prinzipien in der Community, eine übernommene Distro einzuschläfern. Wieso weißt du das nicht? Schließlich ist M::L im Produktiveinsatz. Der Ansatz der Aufklärung, so wie ich sie verfolge, und modernen Ersatz aufzuzeigen, ist der richtige.

            Ich kann mal spaßeshalber den Spieß umdrehen: Wenn Dir MIME::Lite dermaßen gut gefällt, wieso holst du dir kein Commitbit und behebst die Fehler? Wie? Code nicht wartbar? Neu schreiben und umsatteln einfacher? Ach was.

  2. So geht's:

      
    use 5.010;  
    use utf8;  
    use strictures;  
    use Courriel::Builder qw(build_email subject from to plain_body html_body attach);  
      
    my $email = build_email(  
        subject('Überraschung'),  
        from('sascha <sascha@invalid>'),  
        to('Empfänger 1 <empfaenger1@invalid>', 'empfaenger2@invalid'),  
        plain_body(  
            content     => 'Glückwunsch zur Kettensäge',  
            encoding    => '8bit',  
        ),  
        html_body(  
            content     => '<p><img src="cid:chainsaw.png"> Glückwunsch zur Kettensäge</p>',  
            encoding    => '8bit',  
            attach(  
                file        => '/usr/share/pixmaps/chainsaw.png',  
                content_id  => 'chainsaw.png',  
            ),  
            attach(  
                file        => '/usr/share/pixmaps/terminal.png',  
                content_id  => 'terminal.png',  
            ),  
        ),  
    );  
      
    say $email->as_string;  
    
    

    Die serialisierte Nachricht sieht in der Struktur so aus:

    Subject: =?UTF-8?B?w5xiZXJyYXNjaHVuZw==?=
        From: sascha sascha@invalid
        To: =?UTF-8?B?RW1wZsOkbmdlcg==?= 1 empfaenger1@invalid,
          empfaenger2@invalid
        Date: Mon, 26 Sep 2011 13:18:05 -0000
        Message-Id: 1317043085.adE5ecB2.14895@notruescotsman
        MIME-Version: 1.0
        Content-Type: multipart/alternative; boundary=1317043085.1812871.14895

    --1317043085.1812871.14895
        Content-Transfer-Encoding: 8bit
        Content-Type: text/plain; charset=UTF-8

    Glückwunsch zur Kettensäge
        --1317043085.1812871.14895
        Content-Type: multipart/related; boundary=1317043085.70Ff70.14895

    --1317043085.70Ff70.14895
        Content-Transfer-Encoding: 8bit
        Content-Type: text/html; charset=UTF-8

    <p><img src="cid:chainsaw.png"> Glückwunsch zur Kettensäge</p>
        --1317043085.70Ff70.14895
        Content-ID: <terminal.png>
        Content-Disposition: attachment; filename=terminal.png
        Content-Transfer-Encoding: base64
        Content-Type: image/png; charset=binary

    iVBORw0KGgo…

    --1317043085.70Ff70.14895
        Content-ID: <chainsaw.png>
        Content-Disposition: attachment; filename=chainsaw.png
        Content-Transfer-Encoding: base64
        Content-Type: image/png; charset=binary

    iVBORw0KGgo…

    --1317043085.70Ff70.14895--

    --1317043085.1812871.14895--

    Du kannst sie mit Email::Sender verschicken.

    Siehe http://htmlemailboilerplate.com/ für eine brauchbare Vorlage für den HTML-Teil.

    1. hi,

      my $email = build_email(
          subject('Überraschung'),

      Jow, der Rest sieht auch ganz ordentlich aus. Warum ich hier was schreibe: Genau an der Stelle macht MIME::Lite nämlich nüschd, das habe ich mir gestern abend angeschaut. Aber eine Frage habe ich dennoch:

      Subject: =?UTF-8?B?w5xiZXJyYXNjaHVuZw==?=

      ist Base64, der text/plain-Body jedoch 8bit (Transfer-Encoding). Kommen damit alle eMail-Clients klar?

      Also ich würde sicherheitshalber den Subject-Header wenigstens genauso encoden, wie den text/plain-Body: beides quoted-printable.

      Hotti