Ist das der richtige Weg, um E-Mail senden mit PHP?
Ich bin ein bisschen besorgt, wenn diese Funktion sendet E-Mails, werden korrekt erkannt, auf den meisten E-Mail-und webmail-clients, wie es soll, speziell die, die ich bin sehr besorgt über diese Zweifel:
- Sind die UTF-8-Erklärungen und Anhänge gut zusammen?
- Brauche ich quoted_printable_decode()? Wenn ja, wo?
- Content-Transfer-Encoding: 7 oder 8 bit? Ich habe immer gesehen 7 aber da ich sende einen UTF-8-codierte E-mail-ich bin mir nicht sicher.
- Sollte ich mb_send_mail() oder E-mail() ist genug?
EDIT: ich weiß nicht warum, aber der code wird nicht angezeigt richtig, ich habe es zur Verfügung @ http://gist.github.com/104818
EDIT 2: ich bin mir bewusst, dass andere alternativen (Bibliotheken) für E-Mail-handling, sondern wegen meiner eigenen Neugier und wissen ich möchte nur wissen, ob dieser code ist 100% gut ist, oder ob es buggy ist.
function Email($name, $from, $to, $subject, $message, $bcc = null, $attachments = null)
{
ini_set('SMTP', 'localhost');
ini_set('sendmail_from', $from);
$name = filter_var($name, FILTER_SANITIZE_STRING);
$from = filter_var($from, FILTER_SANITIZE_EMAIL);
$subject = filter_var($subject, FILTER_SANITIZE_STRING);
$boundary = '_Boundary_' . md5(microtime(true) . mt_rand(0, PHP_INT_MAX));
$headers = array
(
'MIME-Version: 1.0',
'Content-Type: multipart/mixed; boundary="Mixed' . $boundary . '"',
'Date: ' . date('r', time()),
'From: "' . $name . '" <' . $from . '>',
'Reply-To: "' . $name . '" <' . $from . '>',
'Return-Path: "' . $name . '" <' . $from . '>',
'X-Mailer: PHP ' . phpversion(),
'X-Priority: 2',
'X-MSMail-Priority: High',
'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'],
);
if (is_null($to) === false)
{
if (is_array($to) === false)
{
$to = explode(',', $to);
}
foreach ($to as $key => $value)
{
$to[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
}
$to = implode(', ', array_filter($to));
}
if (is_null($bcc) === false)
{
if (is_array($bcc) === false)
{
$bcc = explode(',', $bcc);
}
foreach ($bcc as $key => $value)
{
$bcc[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
}
$headers[] = 'BCC: ' . implode(', ', array_filter($bcc));
}
if (is_null($attachments) === false)
{
settype($attachments, 'array');
foreach ($attachments as $key => $value)
{
if (is_file($value) === true)
{
$attachments[$key] = array
(
'',
'--Mixed' . $boundary,
'Content-Type: application/octet-stream; name="' . basename($value) . '"',
'Content-Disposition: attachment; filename="' . basename($value) . '"',
'Content-Transfer-Encoding: base64',
'',
trim(chunk_split(base64_encode(file_get_contents($value)))),
);
$attachments[$key] = implode("\n", $attachments[$key]);
}
else
{
unset($attachments[$key]);
}
}
$attachments = implode("\n", $attachments) . "\n";
}
$message = array
(
'This is a multi-part message in MIME format.',
'',
'--Mixed' . $boundary,
'Content-Type: multipart/alternative; boundary="Alt' . $boundary . '"',
'',
'--Alt' . $boundary,
'Content-Type: text/plain; charset="UTF-8"',
'Content-Disposition: inline',
'Content-Transfer-Encoding: 8bit',
'',
trim(strip_tags($message, '<a>')),
'',
'--Alt' . $boundary,
'Content-Type: text/html; charset="UTF-8"',
'Content-Disposition: inline',
'Content-Transfer-Encoding: 8bit',
'',
trim($message),
'',
'--Alt' . $boundary . '--',
$attachments,
'--Mixed' . $boundary . '--',
);
if (@mail($to, stripslashes($subject), implode("\n", $message), implode("\n", $headers)) === true)
{
return true;
}
return false;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während das funktionieren sollte, würde ich dringend empfehlen, eine vorgefertigte E-Mail - /SMTP-Klasse, wie Zend_Mail. Während ich nicht denke, dass die ganze Zend Framework ist das cat ' s Pyjamas, ich habe eine sehr gute Meinung von Ihre E-mail-handling-code.
EDIT: ich sollte auch hinzufügen, dass die Verwendung eines vordefinierten E-Mail - /SMTP-Klasse wird abstract fast alle von der Komplexität/Struktur von multi-part-E-Mails.
Update 2009-05-06: Beantworten Ihre Frage direkt.
Sehen Sie anständig genug.
Nicht. Würden Sie wollen, um
quoted_printable_decode()
nur, wenn Sie das Dekodieren einer E-Mail-Nachricht. Nicht, wenn Sie Codierung ein. Sollten Siequoted_printable_encode()
? Ich werde zu diskutieren, diese weiter.Verwenden Sie nur einen 8-bit-Codierung, wenn Sie wissen, dass die Ziel-SMTP-server es unterstützen können. Aber, da Sie die Weitergabe Ihrer E-Mail aus dem lokalen MTA, ich würde nicht empfehlen den Wert. Der Standardwert ist 7-bit-Kodierung, aber es hat seinen eigenen Satz von Einschränkungen: - bis zu 998 Bytes pro Zeile des code-range 1-127 mit CR und LF nur erscheinen dürfen als Teil der CRLF Zeilenende (http://tools.ietf.org/html/rfc2045#section-2.7).
Ich würde empfehlen, die "Quoted-Printable" ( http://tools.ietf.org/html/rfc2045#section-6.7 ) Content-Transfer-Encoding. Wo du anrufst
trim(strip_tags($message, '<a>'))
undtrim($message)
Sie möchten, umschließen Sie diese mitquoted_printable_encode(trim(...))
.Wenn Sie wissen, Sie sind nicht gehen, um Umgang mit Multibyte-Nachrichten (Japanisch, Koreanisch, Chinesisch, etc.) dann
mail()
sollte ausreichen.Nun habe ich beantwortet Ihre ersten Fragen, lassen Sie mich Ihnen sagen, wo einige Probleme vorhanden sind.
null
im$to
,$bcc
,$attachments
bevor Sie Sie weiter verarbeiten, jedoch, Sie sind nicht etwas zu tun, wenn Sie tatsächlichnull
. Also, wenn Sie geschehen, erhalten Sie einenull
für$to
Sie gar nicht verarbeiten, die Variablen, aber Sie weiterhin eine E-Mail sendennull
.Als jetzt, das ist alles, ich werde in zu gehen, aber ich bin immer noch zu empfehlen ist eine vorgefertigte Lösung, als Sie hatte eine Menge Benutzer/die Zeit, bugs.
Ich bin für die Roll-your-own in den meisten Situationen, aber wenn es um die E-mail würde ich wärmstens empfehlen, so dass es leichter auf sich selbst und etwas wie Swift Mailer oder PHPMailer (in dieser Reihenfolge, für mein Geld).
Als side-bonus (und vorausgesetzt, dass Sie angeben, reply-to, etc), Sie haben auch viel weniger Chancen, als spam markiert werden.