PHP Mailroutine - Verlust von Mails

Benutzer-2472

abgemeldet
1 Mai 2006
32.694
1.621
Ich habe vor einiger Zeit eine kleine Funktion für den Mailversand geschrieben und in 80% der Fälle kommen die Mails auch zügig und sauber an. Allerdings kommen einige Mail nicht bei den Empfängern an und ich hab keine Ahnung warum.

Hat jemand eine Idee was mit den Mails passiert ist?

PHP:
function write_mail($mail, $subject, $content){
	$header = '';
	$returnmail="no-reply@losewette.de";

	// mailer
	$header .= 'X-Mailer: Losewette.de'."\r\n";

   // tofrom
   $header .= 'From: Losewette.de<'.$returnmail.'>' . "\r\n";

   $content = [...];

	mail($mail, "Losewette :: ".$subject, $content, $header);
}

Content hab ich mal draußen gelassen.

PHP:
write_mail("cybo@....com", "test", "irgendwas");
Klappt wunderbar, aber einige andere z.b. GMX oder sogar auf meine eigene domain (cyboswelt) kommen nicht an.

Hab ich irgendwelche relevanten Daten im Header vergessen, so dass die Mails geblockt werden?

Edit: cyboswelt.de blockt, GMX blockt, Gmail funzt :ugly:
 
Ein paar Sachen fallen mir spontan auf, wo du nachgucken könntest:

  • From-Header den benutzerdefinierten Name in Anführungszeichen stecken, ein Space rein bevor die eMail-Adresse kommt.

  • \r\n als Zeilenumbruch mögen afair einige Server nicht. Besser: nur \n
Bei obigem Angaben bin ich mir nicht 100%ig sicher; kann also auch genau andersrum sein. Aber du hastn Ansatzpunkt, wo du mal die Standards durchgucken kannst.

Vielleicht zum Probieren: PHPMailer. Wenn du - wie gesagt: auf deine eigene Domain - das Verhalten reproduzieren kannst, dann sende doch mal ne Mail mit PHPMailer und guck, obs dann geht.
Kann ich uneingeschränkt empfehlen: Nur Instanz anlegen, benötigte Header-Zeilen setzen und ab damit. Den Rest erledigt PHPMailer. Wenn gewünscht, kannst du damit auch echtes SMTP einsetzen.
 
Beide Tipps bringen es nicht - PHP Mailer ist natürlich ne Idee, aber es ist halt merkwürdig, denn die Funktion hat einige Zeit sehr gute Dienste geleistet und auf einmal kommt auf bestimmten Diensten nichts mehr an, merkwürdig!
 
Genügt ja, PHPMailer zum Ausschluss zu verwenden. Vielleicht landest du nur im Spam, weil "X-Mailer: Losewette.de" nicht so toll is.

Was anderes, was ich hier grad seh und seeehr ungewöhnlich is: Du sendest ne Mail, hast aber keine To-Header. Vielleicht werden deine Mails deshalb verworfen. Ich weiß nicht, inwiefern mail() dir das abnimmt.
 
...aber es ist halt merkwürdig, denn die Funktion hat einige Zeit sehr gute Dienste geleistet und auf einmal kommt auf bestimmten Diensten nichts mehr an, merkwürdig!
Anbieter rüsten halt ab und zu mal die Spamfilter auf. :mrgreen: ;) Und wenn GayMX nicht klappt, dann dürfte ja online.de und web.de auch nicht klappen.
 
Genügt ja, PHPMailer zum Ausschluss zu verwenden. Vielleicht landest du nur im Spam, weil "X-Mailer: Losewette.de" nicht so toll is.

Was anderes, was ich hier grad seh und seeehr ungewöhnlich is: Du sendest ne Mail, hast aber keine To-Header. Vielleicht werden deine Mails deshalb verworfen. Ich weiß nicht, inwiefern mail() dir das abnimmt.

To hab ich bisher noch nie verwendet, da ich von den Leuten teilweise keine Namen habe - bei einem Newsletter trägt man zumeist ja nur die Addi ein und nicht seine Kontaktdaten.

Ich habs auch mal mit einem anderen Absender versucht, allerdings bringt es das auch nicht :think:

Anbieter rüsten halt ab und zu mal die Spamfilter auf. :mrgreen: ;) Und wenn GayMX nicht klappt, dann dürfte ja online.de und web.de auch nicht klappen.
Web.de geht durch, t-online hab ich leider keine testaddi zur Verfügung. Klar upadten die ab und an ihren Schutz, aber so viel kann ab meiner Funktion nicht falsch sein ;)
 
Ich schick dir mal meine t-online Adresse, dann kann ich dir sagen ob sie ankommt oder nicht und ob sie im Spamfilter landet (den ich eigentlich auch abrufe)

E-Mail Adresse hab ich dir geschickt :)
 
Schau dir mal die Tipps von SpamAssassin an, wie du deine Mails aufbauen solltest, damit sie möglichst nicht als Spam erkannt werden:
https://wiki.apache.org/spamassassin/AvoidingFpsForSenders
[...]

PHP:
$absender = 'Losewette.de <benachrichtigung@losewette.de>';
/* Rueckantwort */
$reply = 'Losewette.de <benachrichtigung@losewette.de>';
/* Betreff */
$subject = 'Losewette :: Infomail';

/* Baut Header der Mail zusammen */
$headers .= 'From:' . $absender . "\n";
$headers .= 'Reply-To:' . $reply . "\n"; 
$headers .= 'X-Mailer: PHP/' . phpversion() . "\n"; 
$headers .= 'X-Sender-IP: ' . $REMOTE_ADDR . "\n"; 
$headers .= "Content-type: text/html\n";

mail("example@example.com", $subject, $message, $headers);

Die Idee an sich ist nicht schlecht, zumal der T-online Test ergeben hat, dass die Mail zwar ankam, aber direkt im Spam gelandet ist. Blöderweise sehe ich keine sinnvolle Möglichkeit mehr da noch mehr zu schrauben. Ich gebe alles ehrlich an, schreibe keine komischen @, n00b, Vi***a ... Sachen und schick sogar die IP mit.

*ratlos*
 
Mir fällt jetzt eigentlich nur noch auf, dass du noch immer keinen "To:"-Header setzt... (kann doch auch ruhig "reciepient@example.com <reciepient@example.com>" sein - also ohne echten Namen)

Außerdem hab ich irgendwas in Erinnerung, dass Mails, die direkt über mail() versendet werden, schon mal von Haus aus einen höheren Spam-Score bekommen, als solche, die über SMTP verschickt werden. Vielleicht wäre auch das noch ein Ansatzpunkt...
 
Mir fällt gerade auf, dass auch in der PHP-Doku der "To:"-Header nicht explizit gesetzt wird. Offenbar macht das mail() dann intern...
 
Mir fällt gerade auf, dass auch in der PHP-Doku der "To:"-Header nicht explizit gesetzt wird. Offenbar macht das mail() dann intern...

Jepp, ich bin relativ 1:1 am Manual geblieben, auf gmail läufts wunderbar, aber cyboswelt. (z.b.) nimmt die Mail nicht an, ich kriege aber auch keine Nachricht wo die Mail verblieben ist, sonst könnte ich ja die Spampunkte abarbeiten :/
 
Mir fällt gerade auf, dass auch in der PHP-Doku der "To:"-Header nicht explizit gesetzt wird. Offenbar macht das mail() dann intern...
Korrekt.
PHP:
fprintf(sendmail, "To: %s\n", to);
fprintf(sendmail, "Subject: %s\n", subject);
if (hdr != NULL) {
    fprintf(sendmail, "%s\n", hdr);
}
fprintf(sendmail, "\n%s\n", message);
ret = pclose(sendmail);
Quelle: PHP 6.0 Build 201001202130 /ext/standard/mail.c ll. 306-312

Dort sieht man auch schön, dass \n als Zeilendelimiter benutzt wird.
 
Es lag nur halb am Quellcode. Da kann man sich nun drüber auslassen, ob mein Quellcode unvollständig war oder der Server atyptisch konfiguriert :mrgreen:

PHP:
mail($mail, $subject, $content, $header,'-f '.$returnmail);

Falls mal irgendwer sonst ne Möglichkeit sucht ;)