PHP Email mit Anhang

creamycewie

Mitglied
Hi, derzeit nutze ich folgendes Script um Emails zu versenden:

PHP:
// Email verschicken
							
							$betreff = "Ihre Registrierung bei Modius.at";
							$nachricht = "
Mein text
";
							$header = "From: me@you.at" . "\r\n" .
								"Reply-To: me@you.at" . "\r\n" . "Content-Type: text/html; charset=UTF-8\r\n" . "Content-Transfer-Encoding: 8bit\r\n" .
								"X-Mailer: PHP/" . phpversion();
							
							mail($email, $betreff, $nachricht, $header);

Wie kann ich hier eine Nachricht anhängen, welche ich mit
<form method="post" action="Send.php" enctype="multipart/form-data">

<input type="file" name="attachment" /><br />
<br />
<input type="submit" value="absenden"/>

anhänge?

Und kann ich die $email auch mit mehreren adressen füllen?

danke & LG
 
Mit Anhängen zu versenden ist eigentlich recht einfach.. also wenn man weiß, wie das im Quelltext aussieht: erstmal musst du deine ganze E-Mail als multipart/mixed definieren und dann eine Boundary:
Code:
... (andere E-Mail-Kopfzeilen)
Content-Type: multipart/mixed; boundary="**1" (bei den **1 packst du am besten einen SHA1-Hash hin)

--**1
Content-Type: multipart/alternative; boundary="**2" (andere Boundary)

--**2
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

(hier kommt dein Inhalt rein)

--**2--

--**1
Content-Type: (MIME-Typ deiner Datei); name="(Dateiname)"
Content-Disposition: attachment; filename="(Dateiname)"
Content-Transfer-Encoding: base64

(Base64-kodierter Inhalt deiner Datei)

--**1--
 
Hi. Soweit so gut, allerdings leider unverständlich.
Was müsst ich hier einsetzen wenn ich eine PDF-Datei versenden will, welche ich zuerst mit
HTML:
<form method="post" action="Send.php" enctype="multipart/form-data">

<input type="file" name="attachment" /><br />
<br />
<input type="submit" value="absenden"/>
hochgeladen hab
 
Die "Faulen" unter uns (so wie ich z.B.) müssen das Rad aber nicht neu erfinden:
http://phpmailer.worxware.com/
(z.B.)

Ich setze diese Bibliothek bei einigen Projekten ein (u.a. Newsletter-Versand). Der Aufbau ist extrem simpel: Klasse(n) includen, Variablen setzen (im folgnden ein Newsletter-Beispiel sowohl als Text und HTML mit eingebetteten Bildern und Anhang eines Flyers):

PHP:
require("phpmailer/class.phpmailer.php");  

$mail = new PHPMailer();  
$mail->clearAllRecipients(); 		                         // Alle (bisherigen) Empfänger löschen
   
$mail->IsSMTP();                                                      // der Klasse mitteilen, SMTP zu nutzen
$mail->Host     = "smtp.deinedomain.de";               // SMTP server  
   
$mail->From     = "newsletter@deinedomain.de"; 
$mail->FromName = "deinedomain Newsletter"; 
$mail->AddAddress("empfaengeradresse@anderedomain.tld", "Registrierte Newsletter");  
$mail->AddBCC('noch_eine_mailadresse_im_bcc_angeben@empfaengerdomain.tld'); 

// Einlesen der Inhalte 
$filename="em7.html";
$filename_nohtm="em7.txt";
$handle=fopen($filename, "r");
$contents=fread($handle, filesize($filename));
fclose($handle);
$handle=fopen($filename_nohtm, "r");
$altcontents=fread($handle, filesize($filename_nohtm));
fclose($handle);

$mail->AddEmbeddedImage('images/newsletter_header12-11.jpg', 'bild0', 'newsletter_header12-11.jpg'); 
$mail->AddAttachment('images/referenz_20.jpg', 'referenz_20.jpg', 'base64', 'application/octet-stream'); 

$mail->Subject  = "Newsletter Dezember 2011";  
$mail->Body     = $contents; 
$mail->AltBody  = $altcontents;
$mail->WordWrap = 80;  
$mail->IsHTML(true);   
 if(!$mail->Send()) {  
	echo 'Nachricht konnte nicht versandt werden.';  
	echo 'Mailer error: ' . $mail->ErrorInfo;  
} else {  
       echo 'Nachricht wurde versandt.';  
}

Das war's. Obiges Beispiel ist schon etwas "komplizierter". Wer Bilder in HTML-Mails einbinden will, sollte sich das übliche Verfahren (z.B. bild0, bild1 usw.) genauer anschauen. Nachladen von Bildern halte ich (aus Sicht des Empfängers) für keine gute Idee.
Wer nur reine Textmails damit versenden möchte, kann sich das Einlesen per fread() sparen und gibt den Text/Inhalt einfach im Script an.
Gegenüber mail() ist der Versand über smtp auch schneller.... allerdings nur dann, wenn man auch viele Mails verschickt (eben Newsletter z.B.).

Greetz
CW
 
Hmmm, das geht alles zu tief, ich will nur mein bestehendes Script um den Dateianhang, welchen ich mittels POST übergeben hab (liegt NICHT IN NEM VERZEICHNISS) erweitern.

Fällt dazu niemandem was ganz simples ein?
 
Hi, versuchs mal hiermet:

PHP:
<?php
$empfaenger = "empfaenger@mailadresse.xy"; // Empfänger E-Mail Adresse
$betreff = "E-Mail mit Anhang"; // Betreff

$dateiname = "bild.gif"; // Dateiname
$dateiname_mail = "anhang.gif";

$id = md5(uniqid(time()));
$dateiinhalt = fread(fopen($dateiname, "r"), filesize($dateiname));

 // Absender Name und E-Mail Adresse
$kopf = "From: Manfred Mustermann <meine@mailadresse.xy>\n";
$kopf .= "MIME-Version: 1.0\n";
$kopf .= "Content-Type: multipart/mixed; boundary=$id\n\n";
$kopf .= "This is a multi-part message in MIME format\n";
$kopf .= "--$id\n";
$kopf .= "Content-Type: text/plain\n";
$kopf .= "Content-Transfer-Encoding: 8bit\n\n";
$kopf .= "E-Mail mit Anhang"; // Inhalt der E-Mail (Body)
$kopf .= "\n--$id";
// Content-Type: image/gif, image/jpeg, image/png 
$kopf .= "\nContent-Type: image/gif; name=$dateiname_mail\n";
$kopf .= "Content-Transfer-Encoding: base64\n";
$kopf .= "Content-Disposition: attachment; filename=$dateiname_mail\n\n";
$kopf .= chunk_split(base64_encode($dateiinhalt));
$kopf .= "\n--$id--";
mail($empfaenger, $betreff, "", $kopf); // E-Mail versenden
?>
 
@GodSinner,

danke, doch was müsst ich hier für $dateiname eingeben?
bzw. wie kann ich auslesen, welchen Dateinamen die Geuppte Datei hat?
mittels
PHP:
$_FILES['datei1'] ['tmp_name']
?


danke schonmal und LG
 
Hi, falls du mich mit GodSinner meintest, so meine antwort.

Du hast die Möglichkeit mit ['filename'] den derzeitigen Namen zu ermitteln.

Dann wäre das Script wie folgt anzupassen:

PHP:
$dateiname = $_FILES['attachment']['name'];


$_FILES['attachment']['tmp_name'] #enthält den namen der datei in einem temporeren Verzeichnis.
$_FILES['attachment']['name']     #enthält den namen den die datei vor dem upload hatte


lg
 
Ich habs nun folgend versucht:

PHP:
<?php

error_reporting(E_ALL);
$empfaenger = "meinemail@me.de"; // Empfänger E-Mail Adresse
$betreff = "Test"; // Betreff

$dateiname = $_FILES['attachment']['tmp_name']; // Dateiname
$dateiname_mail = "test.pdf";

$id = md5(uniqid(time()));
$dateiinhalt = fread(fopen($dateiname, "r"), filesize($dateiname));

 // Absender Name und E-Mail Adresse
$kopf = "From: test <test@mde.de>\n";
$kopf .= "MIME-Version: 1.0\n";
$kopf .= "Content-Type: multipart/mixed; boundary=$id\n\n";
$kopf .= "This is a multi-part message in MIME format\n";
$kopf .= "--$id\n";
$kopf .= "Content-Type: text/plain\n";
$kopf .= "Content-Transfer-Encoding: 8bit\n\n";
$kopf .= "Testnachricht"; // Inhalt der E-Mail (Body)
$kopf .= "\n--$id";
// Content-Type: image/gif, image/jpeg, image/png 
$kopf .= "\nContent-Type: image/gif; name=$dateiname_mail\n";
$kopf .= "Content-Transfer-Encoding: base64\n";
$kopf .= "Content-Disposition: attachment; filename=$dateiname_mail\n\n";
$kopf .= chunk_split(base64_encode($dateiinhalt));
$kopf .= "\n--$id--";
mail($empfaenger, $betreff, "", $kopf); // E-Mail versenden

header ("Location: admin.php?page=5");
?>

Ich erhalte keinen Fehler, allerdings auch keine Email.

woran liegt das?
 
hast du auch in Zeile 2 den empfäger geändert?

wenn ja, dann nichh mal das header raus und lass die alle variablen anzeigen um zu sehen ob sie richtig belegt wurden.
 
Zurück