Korrekter E-Mail Header?

Prophet05

Erfahrenes Mitglied
Wie sieht ein korrekter E-Mail Header aus?

Also welche angaben sind Pflicht welche sollten trotzdem drinne sein. In welcher Form sollten die Werte der einzelnen Parameter gesetzt werden?

So grundsätzliches wie Date, To, From, Cc, Bcc ist mir schon klar aber was gehört da sonst noch so rein?

mfg Prophet
 
Ich setz bei mir folgende (in der Reihenfolge wie aufgezaehlt):
  • To
  • Subject
  • User-Agent
  • MIME-Version
  • Content-Type
  • From
  • Cc
  • Bcc
  • X-Priority
  • Importance
  • Content-Class
  • Content-Transfer-Encoding
  • Content-Disposition
  • Content-Description (bei Anhaengen)
Durch Anhaenge kann es auch dazu kommen, dass die Content-* Parameter mehrfach vorkommen.

Meine lustige, kleine Klasse die das ganze bewerkstelligt (nicht ganz sauberes OOP, aber immerhin funktioniert sie ;) )
PHP:
<?php
class email
{
	public $id;
	public $to;
	public $subject;
	public $body;
	public $from;
	public $cc;
	public $bcc;
	public $attachedfiles;

	public function __construct($to,$subject,$body,$from="",$cc="",$bcc="")
	{
		$this->id=md5(uniqid());
		$this->to=$to;
		$this->subject=$subject;
		$this->body=$body;
		$this->from=$from;
		$this->cc=$cc;
		$this->bcc=$bcc;
		$this->attachedfiles=array();
	}

	public function destroy()
	{
		if (file_exists("mailtemp/".$this->id))
			{
				for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
					{
						unlink("mailtemp/".$this->id."/".$this->attachedfiles[$attachment]);
					}
				rmdir("mailtemp/".$this->id);
			}
	}

	private function composemail()
	{
		$body=imap_8bit($this->body);
		$body.="\n\n";
		/*for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				$body.="\t".imap_8bit("<<".$this->attachedfiles[$attachment].">>");
			}*/
		$boundary="----".$this->id;
		$mail="";
		$mail.="Content-class: urn:content-classes:message";
		$mail.="\nUser-Agent: Free WebMail";
		$mail.="\nMIME-Version: 1.0";
		if (!empty($this->attachedfiles))
			{
				$mail.="\nContent-Type: multipart/mixed;\n\tboundary=\"".$boundary."\"";
			}
		if (!empty($this->from))
			{
				$mail.="\nFrom: ".$this->from;
			}
		if (!empty($this->cc))
			{
				$mail.="\nCc: ".$this->cc;
			}
		if (!empty($this->bcc))
			{
				$mail.="\nBcc: ".$this->bcc;
			}
		$mail.="\nX-Priority: 3 (Normal)";
		$mail.="\nImportance: Normal";
		if (!empty($this->attachedfiles))
			{
				$mail.="\n\n--".$boundary;
			}
		$mail.="\nContent-Type: text/plain;\n\tcharset=\"iso-8859-1\"";
		$mail.="\nContent-Transfer-Encoding: quoted-printable";
		$mail.="\nContent-Disposition: inline";
		$mail.="\n\n".$body;
		if (!empty($this->attachedfiles))
			{
				$mail.="\n\n--".$boundary;
			}
		for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				$file=fopen("mailtemp/".$this->id."/".$this->attachedfiles[$attachment],"r");
				$content=fread($file,filesize("mailtemp/".$this->id."/".$this->attachedfiles[$attachment]));
				fclose($file);
				$encodedfile=chunk_split(base64_encode($content));
				$mail.="\nContent-Type: application/octet-stream;\n\tname=\"".$this->attachedfiles[$attachment]."\"";
				$mail.="\nContent-Transfer-Encoding: base64";
				$mail.="\nContent-Description: ".$this->attachedfiles[$attachment];
				$mail.="\nContent-Disposition: attachment;\n\tfilename=\"".$this->attachedfiles[$attachment]."\"";
				$mail.="\n\n".$encodedfile."\n\n--".$boundary;
			}
		if (!empty($this->attachedfiles))
			{
				$mail.="--";
			}
		return $mail;
	}

	public function attachfile($tempfile,$filename)
	{
		if (!file_exists("mailtemp/".$this->id))
			{
				mkdir("mailtemp/".$this->id);
			}
		move_uploaded_file($tempfile,"mailtemp/".$this->id."/".$filename);
		$this->attachedfiles[]=$filename;
	}

	public function removeattachment($filename)
	{
		unlink("mailtemp/".$this->id."/".$filename);
		$newattachedfiles=array();
		for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				if ($this->attachedfiles[$attachment]!=$filename)
					{
						$newattachedfiles[]=$this->attachedfiles[$attachment];
					}
			}
		$this->attachedfiles=$newattachedfiles;
		unset($newattachedfiles);
	}

	public function showmail()
	{
		$mail="To: ".$this->to."\n";
		$mail.="Subject: ".$this->subject."\n";
		$mail.=$this->composemail();
		return $mail;
	}

	public function send()
	{
		imap_mail($this->to,$this->subject,"",$this->composemail());
	}
}

function mailstring($mailobject)
{
	return rawurlencode(serialize($mailobject));
}

function mailobject($mailstring)
{
	return unserialize(stripslashes(rawurldecode($mailstring)));
}
?>
 
Danke!

Ich schreibe zwar selbst an einer Klasse aber mir fehlten halt noch die Header-Daten...

Aus andere Quelle habe ich erfahren das es auch noch die Attriute:
  • Reply-To
  • Return-Path
  • Delivered-To
  • Received
  • Message-ID
gibt. Kennst du die Kannst du mir näheres dazu sagen? Oder erklären warum du sie nicht verwendest?

Ich habe auch gelesen das alle X-* Werte nicht notwendig sind stimmt das?

mfg Prophet05

EDIT:

Wofür ist Content-Disposition? Welche werte sind möglich?
Weshalb setzt du bei anhängen Content-Type auf multipart/mixed?
Wofür ist Content-class? Welche werte sind möglich?
 
Zuletzt bearbeitet:
Mit Reply-To kann eine eMail-Adresse angegeben werden an die geantwortet werden soll.
Das macht eigentlich nur Sinn wenn diese anders ist als die Absender-Adresse.

Ich hab mich bei den Headern groesstenteils an eMails orientiert die ich mir aus Outlook, Outlook Express, KMail und von GMX geschickt hab.

Bei der Content-Disposition kenne ich 2 Werte: inline und attachment.
inline ist fuer den eigentlichen Message-Body, attachment fuer Anhaenge.
eMails mit Anhaengen haben den Content-Type multipart/mixed, reine Textmails haben text/plain.
Es gibt auch noch multipart/alternative, dies enthaelt die eMail 2 mal. Einmal als text/plain und einmal als text/html. Solche Mails hab ich z.B. von Outlook Express bekommen.

Die Content-Class hab ich mir auch aus den Headern der analysierten eMails abgeguckt, daher kann ich dazu leider keine naehere Info liefern.

X-Priority und Importance sind absolut optional, meines Wissens hauptsaechlich dazu da um im Mail-Client ein entsprechendes Symbol darzustellen. Ob sie Einfluss auf der Verarbeitung der eMail im Server haben kann ich nicht sagen.

Allgemein ist es wirklich hilfreich einen lokalen Mailserver (wie z.b. Postfix) zu haben sodass man direkt in die Mailbox-Files schauen kann. Die Analyse von eMails welche aus diversen Programmen verschickt wurden ist ungemein aufschlussreich.

Weiterhin sind die folgenden RFCs auch nicht uninteressant:
RFC2821 - Simple Mail Transfer Protocol
RFC2822 - Internet Message Format
RFC2045 - Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies
RFC2046 - Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types
RFC2047 - MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text
RFC2048 - Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures
RFC2049 - Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples
 
Ok ich habe die RFC Richtlinien weitestgehend verstanden... Die erforderlichen MIME-Type angagen habe ich eingefügt. Auch alle anderen notwendigen Header attribute habe ich mitlerweile zusammengesucht und mit werten gefüllt. Ich habe jedoch immernoch einige Lücken bei denen mir der Sinn bzw. die benötigten werte ein Rätsel sind:

- Message-ID / Content-ID : Woher bekomme ich diese Eindeutige ID? Zwar ist diese angabe in RFC 2045 beschrieben jedoch ohne zu sagen wie ich den wert bestimme...
- Content-Class / Conent-Disposition : Beide werden in den RFC richtlinien nirgends genannt. Ich verstehe also weder ihren sinn noch welche werte ich ihnen zuweisen muss.
 
Zuletzt bearbeitet:
Ich habe noch weitere erkundigungen angestellt. Und mir noch mal die komplette RFC 2822 durchgelsen. Das Format der Message ID muss "<" msg-id "@" msg-id ">" dabei ist es egal woher diese id stammt es kommt nur darauf an das sie einzigartig ist. Ich erstelle den ersten teil jetzt immer mit deiner kombination von md5(uniqid()) und den zweiten setzte ich entsprechend dem einsatz der klasse mit einem lessbaren wert...

Content-Class / Conent-Disposition kommen in keinem der Standards vor (sie werden nicht einmal ansatzweise genannt). Ich würde sie an deiner Stelle herausnehmen sie erfüllen scheinbar keinerlei zweck...

Desweiteren ist mir bei deinem Script aufgefallen das du im Content-Type nicht immer charset und boundary definierst. Beide werden von den RFC-Standard stark empholen!

Noch mal für alle die sich auch mit dem Theme beschäftigen:

RFC 2822 - Definition des Grundsätzlichen Layouts einer E-Mail
RFC 2045, 2046, 2047, 2048, 2049 - Definition der MIME-Beschreibung. Wird in RFC 2822 zwar nicht weiter erwähnt jedoch wird hier gesagt das auch dies zum Header einer jeden E-Mail gehören sollte...
RFC 822 - Grundsätzliche Syntax spezifikationen...

Vielen Danke für die Hilfe!

mfg Prophet05
 
Zuletzt bearbeitet:
Die Boundary wird meines Wissens nach nur benoetigt wenn es sich um eine Multipart-Message handelt. Also z.B. bei Dateianhaengen. Dadurch werden die einzelnen Abschnitte der Mail eindeutig voneinander getrennt.
Wie gesagt, ich hab mich an eMails orientiert die ich mir aus diversen Programmen selbst zugeschickt habe, und dieser Weg hat mich zum Erfolg gefuehrt.
Die RFCs habe ich nicht ganz genau gelesen sondern nutze diese eher nur mal um was nachzuschlagen. So auch bei meinen HTTP- und FTP-Implementationen in PHP. Dort hab ich hauptsaechlich mit Ethereal den Traffic analysiert und dann etwas im RFC nachgeschlagen.
 
Ok, ich habe mich streng an die RFCs gehalten... Mit Dateianhängen habe ich mich nicht beschäftigt implementiere ich auch nicht in meiner klasse.

Auf jeden fall vielen dank!
 
Zurück