Discussion:
[Postfixbuch-users] Offtopic - Mail aus PHP mit Attachment senden
Christian Garling
2014-04-17 10:44:09 UTC
Permalink
Hallo Liste,

hat nicht direkt mit Postfix zu tun, vielleicht kann trotzdem jemand
helfen. Meine Kollegen aus der Entwicklung haben Mailversand mit
Attachment in eine unserer PHP Applikationen implementiert. Sie nutzen
dafür folgenden Code:

$fileToAttach = 'test.zip';

$boundary = md5(date('r', time()));
$fileSize = filesize($fileToAttach);
$fd = fopen($fileToAttach, 'r');
$fileContent = fread($fd, $fileSize);
$content = chunk_split(base64_encode($fileContent));

$mailHeader = 'Reply-To: '.$doNotReplyTo."\n";
$mailHeader .= "MIME-Version: 1.0\r\n";
$mailHeader .= 'Content-Type: multipart/mixed;
boundary="'.$boundary.'"'."\r\n\r\n";
$mailHeader .= 'Content-Type:text/plain; charset=UTF-8'."\r\n";
$mailHeader .= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
$mailHeader .= '--'.$boundary."\r\n";
$mailHeader .= 'Content-Type: application/octet-stream;
name="'.$fileToAttach.'"'."\"\r\n";
$mailHeader .= 'Content-Transfer-Encoding: base64'."\r\n";
$mailHeader .= 'Content-Disposition: attachment;
filename="'.$fileToAttach.'"'."\r\n\r\n";
$mailHeader .= $content;
$mailHeader .= '--'.$boundary."\r\n";

mail($toMail, $subject, $body, $mailHeader);

Die daraus resultierende Mail beinhaltet das Attachment base64 codiert
im Body der Mail, das Attachment ist so nicht verwendbar. Was machen die
Jungs verkehrt?

Gruß, Christian
Markus Heinze
2014-04-17 11:31:48 UTC
Permalink
Moin moin
Post by Christian Garling
Hallo Liste,
hat nicht direkt mit Postfix zu tun, vielleicht kann trotzdem jemand
helfen. Meine Kollegen aus der Entwicklung haben Mailversand mit
Attachment in eine unserer PHP Applikationen implementiert. Sie nutzen
$fileToAttach = 'test.zip';
$boundary = md5(date('r', time()));
$fileSize = filesize($fileToAttach);
$fd = fopen($fileToAttach, 'r');
$fileContent = fread($fd, $fileSize);
$content = chunk_split(base64_encode($fileContent));
$mailHeader = 'Reply-To: '.$doNotReplyTo."\n";
$mailHeader .= "MIME-Version: 1.0\r\n";
$mailHeader .= 'Content-Type: multipart/mixed;
boundary="'.$boundary.'"'."\r\n\r\n";
$mailHeader .= 'Content-Type:text/plain; charset=UTF-8'."\r\n";
$mailHeader .= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
$mailHeader .= '--'.$boundary."\r\n";
$mailHeader .= 'Content-Type: application/octet-stream;
name="'.$fileToAttach.'"'."\"\r\n";
$mailHeader .= 'Content-Transfer-Encoding: base64'."\r\n";
$mailHeader .= 'Content-Disposition: attachment;
filename="'.$fileToAttach.'"'."\r\n\r\n";
$mailHeader .= $content;
$mailHeader .= '--'.$boundary."\r\n";
mail($toMail, $subject, $body, $mailHeader);
Schaut Euch einfach mal die übergebenen Parameter an und dann in welcher
Variable der Content ist, warum heissen die wohl header und body ...
Ausserdem werden Zeilen mit "\n" und nicht mit "\r\n" separiert
ausserdem sollte jede Zeile nicht mehr als 70 Zeichen enthalten.
Desweiteren ist UTF-8 mit 7Bit zu encoden sehr sportlich

Naja ich würd einfach mir ne MultipartMail entsprechend der Anforderung
mit einem Standarmailclient an mich selbst senden, den Quellcode
anschauen und danach header und body programmieren, wem das nicht liegt
eine fertige Klasse aus dem Netz laden, fertig.
Post by Christian Garling
Die daraus resultierende Mail beinhaltet das Attachment base64 codiert
im Body der Mail, das Attachment ist so nicht verwendbar. Was machen
die Jungs verkehrt?
Gruß, Christian
Wolfgang Murth
2014-04-17 11:49:50 UTC
Permalink
Hallo Christian,
Post by Christian Garling
Die daraus resultierende Mail beinhaltet das Attachment base64 codiert
im Body der Mail, das Attachment ist so nicht verwendbar. Was machen
die Jungs verkehrt?
Ich verwende für PHP Projekte PHPMailer. Einfacher gehts nicht.
Siehe https://github.com/PHPMailer/PHPMailer

Gruß Wolfgang
Beat Jucker
2014-04-17 12:54:55 UTC
Permalink
Post by Wolfgang Murth
Post by Christian Garling
Die daraus resultierende Mail beinhaltet das Attachment base64
codiert im Body der Mail, das Attachment ist so nicht verwendbar. Was
machen die Jungs verkehrt?
Ich verwende für PHP Projekte PHPMailer. Einfacher gehts nicht.
Auch ich würde auf eine highlevel Funktion/Class zurückgreifen -
insbesondere wenn man die entsprechenden RFC nicht kennt respektive
adäquat anwendet. Boundaries verwendet man, um multipart Meldungen
zusammenzubasteln. RFC1341 beschreibt das letzte Boundary wie folgt:

" The encapsulation boundary following the last body part is a
distinguished delimiter that indicates that no further body parts will
follow. Such a delimiter is identical to the previous delimiters, with
the addition of two more hyphens at the end of the line"

In deinem Fall also für das letzte Boundary: $mailHeader .=
'--'.$boundary.'--';

Da du aber keine multipart Meldung versendest, bräuchte es nicht einmal
Boundaries.

Zudem gibt es bei deinem PHP Script eine Vermischung von Header und
Body: $mailHeader .= $content;

Gruss
-- Beat
Christian Garling
2014-04-17 13:03:39 UTC
Permalink
Hallo,

ich habe schon die verschiedenen Antworten weitergereicht und auch
ausdrücklich dazu geraten, eine fertige Lösung zu nutzen.

Danke!

Christian
Post by Beat Jucker
Post by Wolfgang Murth
Post by Christian Garling
Die daraus resultierende Mail beinhaltet das Attachment base64
codiert im Body der Mail, das Attachment ist so nicht verwendbar.
Was machen die Jungs verkehrt?
Ich verwende für PHP Projekte PHPMailer. Einfacher gehts nicht.
Auch ich würde auf eine highlevel Funktion/Class zurückgreifen -
insbesondere wenn man die entsprechenden RFC nicht kennt respektive
adäquat anwendet. Boundaries verwendet man, um multipart Meldungen
" The encapsulation boundary following the last body part is a
distinguished delimiter that indicates that no further body parts will
follow. Such a delimiter is identical to the previous delimiters, with
the addition of two more hyphens at the end of the line"
In deinem Fall also für das letzte Boundary: $mailHeader .=
'--'.$boundary.'--';
Da du aber keine multipart Meldung versendest, bräuchte es nicht
einmal Boundaries.
Zudem gibt es bei deinem PHP Script eine Vermischung von Header und
Body: $mailHeader .= $content;
Gruss
-- Beat
Loading...