Nick: Kleines HTML-Mail Problem mit Perl/MIME::Lite

Hi Board,
Hab da ein kleines Problem.
Ich würde gern HTML-Mails verschicken, die bei Empfängern, die keine HTML-Mails anzeigen, einen Text ausgeben (z.B. wenn die HTML-Ansicht ausgeschalten ist) und gleichzeitig noch eine Textdatei mitschicken.

So.. das ist das was ich will.
Das schaff ich auch, aber nicht ganz so wie ich das will.

Ich nutze das Modul MIME::Lite und mache das im Prinzip folgendermassen:

$msg = MIME::Lite->new(
To =>$empfaenger,
From =>$from,
Subject =>$subject,
Type =>'multipart/alternative'
);

$msg->attach(
Type => 'text/plain',
Data => $plaininhalt,
);

$msg->attach(
Type => 'text/html; charset=iso-8859-1',
Data => $htmlinhalt
);

$msg->attach(
Type =>'text/plain',
Data =>"$textinhalt",
Filename => "testletter.txt",
Disposition => 'attachment'
);

Das Problem nun dabei:
In Outlook Express sieht das genauso aus, wie ich mir das vorstelle. Der $plaininhalt wird ausgegeben wenn HTML-Ansicht deaktiviert ist, die Datei wird angehängt und in Ihr steht $textinhalt und angezeigt wird $htmlinhalt.

Anders jetzt z.B. bei web.de . Dort fehlt das Attachment. Ändere ich jetzt auf multipart/mixed ist zwar das Attachment mit dabei, aber $plaininhalt und $htmlinhalt werden auf einer Seite ausgegeben.. ebenso bei Outlook.
Wie schaff ich's denn dass bei möglichst allen Mail-Anbietern das genauso aussieht wie gewünscht?

Gruß,
nick

  1. Halihallo Nick

    Hi Board

    Forum, bitte. Nicht Board!

    Ich würde gern HTML-Mails verschicken, die bei Empfängern, die keine HTML-Mails anzeigen, einen Text ausgeben (z.B. wenn die HTML-Ansicht ausgeschalten ist) und gleichzeitig noch eine Textdatei mitschicken.

    multipart/mixed
      |
      +-- multipart/alternative
      |     |
      |     +-- text/html
      |     |
      |     +-- text/plain
      |
      +-- text/plain, attached

    Das einfach mit MIME-Lite umsetzen. Ggf. auf Module von MIME-Tools
    zurückgreifen, da man da die Parts logisch über OO-Interface
    aufbauen kann, was ich persönlich stilvoller finde...

    Wie schaff ich's denn dass bei möglichst allen Mail-Anbietern das genauso aussieht wie gewünscht?

    Versuche es mit dem obengenannten, sollte funktionieren.

    Probleme gabs bei mir erst in Verbindung mit Attachments, alternative
    und dazu noch ein multipart/related für HTML-Darstellung inklusive
    beigelegter Ressourcen, also etwa folgendes:

    multipart/mixed
      |
      +-- multipart/alternative
      |     |
      |     +-- multipart/related
      |     |     |
      |     |     +-- text/html
      |     |     |
      |     |     +-- image/gif
      |     |
      |     +-- text/plain
      |
      +-- application/x-octet-stream, irgendein Attachment halt...

    Daran bin ich dann gescheitert, falls sowas mal jemand hinbekommen
    hat, würde mich die Lösung interessieren!
      |
      +-- </archiv/2004/2/73236/#m421824>, wieder einmal :-)

    Viele Grüsse

    Philipp

    1. Halihallo Nick

      Hi Philipp,

      Forum, bitte. Nicht Board!

      ist doch dasselbe?

      multipart/mixed
        |
        +-- multipart/alternative
        |     |
        |     +-- text/html
        |     |
        |     +-- text/plain
        |
        +-- text/plain, attached

      Das einfach mit MIME-Lite umsetzen. Ggf. auf Module von MIME-Tools
      zurückgreifen, da man da die Parts logisch über OO-Interface
      aufbauen kann, was ich persönlich stilvoller finde...

      Wie kann ich denn eine derartige, naja Baumstruktur mit MIME::Lite
      verwirklichen? Geht das überhaupt?
      MIME::Entity kann ich leider nicht verwenden und mit MIME::Lite
      haut's nicht hin.
      Sollte das doch gehen, wäre ich sehr dankbar, wenn Du mir bitte
      nochmal einen Tipp, am besten ein Codebeispiel geben könntest, wie
      du das gedacht hast?

      Viele Grüsse

      ebenso

      Philipp

      Nick

      1. Halihallo Nick

        Forum, bitte. Nicht Board!
        ist doch dasselbe?

        http://aktuell.de.selfhtml.org/artikel/gedanken/foren-boards/index.htm
        Nicht ganz :-)

        Wie kann ich denn eine derartige, naja Baumstruktur mit MIME::Lite
        verwirklichen? Geht das überhaupt?

        Jep.

        MIME::Entity kann ich leider nicht verwenden und mit MIME::Lite
        haut's nicht hin.

        Naja, es ist auch nicht nötig MIME::Entity zu verwenden. Wie ich
        soeben bemerkt habe, kann man es auch mit MIME-Lite tun. Ich hatte
        seither nur Erfahrungen mit dem MIME-Tools (MIME::Entity,
        MIME::Parser, ...)

        Sollte das doch gehen, wäre ich sehr dankbar, wenn Du mir bitte
        nochmal einen Tipp, am besten ein Codebeispiel geben könntest, wie
        du das gedacht hast?

        Normalerweise wird hier nie kompletter Quelltext gepostet, aber da
        ich dies zum Testen gemacht habe, muss ich ihn dir ja nicht
        vorenthalten:

        #!/usr/bin/perl

        use strict;
        use warnings;

        use MIME::Lite;
        use Net::SMTP;

        my $host = 'mail.smtp_host.de';

        my $entity = MIME::Lite->new(
            From => 'philipp.hasenfratz@gmx.net',
            To  => 'philipp.hasenfratz@gmx.net',
            Subject => 'Test multipart/mixed with alternative',
            Type => 'multipart/mixed',
        );

        my $alt = $entity->attach(
            Type => 'multipart/alternative',
        );

        $alt->attach(
            Type => 'text/plain',
            Data => 'hello world in text',
        );

        $alt->attach(
            Type => 'text/html',
            Data => 'hello world in <b>html</b>',
        );

        $entity->attach(
            Type => 'text/plain',
            Disposition => 'attachment; filename=hello.txt',
            Data => 'hello world in text and as attachment',
        );

        print $entity->as_string();

        my $smtp = new Net::SMTP( $host, Timeout=>60, Debug=>1 );
        unless (defined $smtp) {
            for ( my $i=0; $i < 5; $i++ ) {
                $smtp = new Net::SMTP( $host, Timeout=>60, Debug=>1 );
                if (defined $smtp) { last; }
            }
        }

        unless (defined $smtp) {
            die("cannot open connection to SMTP server @\ $host");
        }

        $smtp->mail( 'philipp.hasenfratz@gmx.net' );
        $smtp->to( 'philipp.hasenfratz@gmx.net' );
        $smtp->data();
        $smtp->datasend($entity->as_string());
        $smtp->dataend();
        $smtp->quit();

        Viele Grüsse

        Philipp

        1. Halihallo Nick

          Hi Philipp

          http://aktuell.de.selfhtml.org/artikel/gedanken/foren-boards/index.htm
          Nicht ganz :-)

          Man lernt nie aus :-)

          my $alt = $entity->attach(
              Type => 'multipart/alternative',
          );

          Achso geht das. Ich hatte nämlich in der Art rumprobiert, fand aber keine Möglichkeit, in diesem Fall $alt und $entity irgendwie zu verknüpfen.
          Es funktioniert auf jeden Fall, danke Dir für die Hilfe. Werd mir das noch näher anschauen.

          Philipp

          Gruß,
          Nick