PHP
Email schicken
Suche…
Parameter
Parameter | Einzelheiten |
---|---|
string $to | Die E-Mail-Adresse des Empfängers |
string $subject | Die Betreffzeile |
string $message | Der Körper der E-Mail |
string $additional_headers | Optional: Header, die der E-Mail hinzugefügt werden sollen |
string $additional_parameters | Optional: Argumente, die in der Befehlszeile an die konfigurierte E-Mail-Sendeanwendung übergeben werden sollen |
Bemerkungen
E-Mail, die ich durch mein Skript schicke, kommt nie an. Was soll ich machen?
Stellen Sie sicher, dass die Fehlerberichterstattung aktiviert ist, um Fehler anzuzeigen.
Wenn Sie Zugriff auf die Fehlerprotokolldateien von PHP haben, überprüfen Sie diese.
Ist der Befehl
mail()
auf Ihrem Server ordnungsgemäß konfiguriert ? (Wenn Sie sich auf Shared Hosting befinden, können Sie hier nichts ändern.)Wenn E-Mails nur verschwinden, starten Sie ein E-Mail-Konto mit einem Freemail-Dienst, der über einen Spam-Ordner verfügt (oder verwenden Sie ein E-Mail-Konto, das überhaupt keine Spam-Filterung vornimmt). Auf diese Weise können Sie sehen, ob die E-Mail nicht versendet wird oder vielleicht versendet, sondern als Spam gefiltert wird.
Haben Sie die Absender-E-Mail-Adresse "Von:", die Sie für mögliche E-Mails verwendet haben, überprüft? Sie können auch eine separate Bounce-Adresse für Fehlermails einrichten.
Die E-Mail, die ich versende, wird als Spam gefiltert. Was soll ich machen?
Gehört die Absenderadresse ("Von") zu einer Domäne, die auf dem Server ausgeführt wird, von dem aus Sie die E-Mail senden? Wenn nicht, ändere das.
Verwenden Sie niemals Absenderadressen wie
[email protected]
. Verwenden Siereply-to
wenn Sie Antworten benötigen, um an eine andere Adresse zu gelangen.Befindet sich Ihr Server auf einer schwarzen Liste? Dies ist eine Möglichkeit, wenn Sie sich auf Shared Hosting befinden, wenn sich Nachbarn schlecht benehmen. Die meisten Blacklist-Anbieter wie Spamhaus verfügen über Tools, mit denen Sie die IP Ihres Servers nachschlagen können. Es gibt auch Tools von Drittanbietern wie MX Toolbox.
Bei einigen PHP-Installationen müssen Sie einen fünften Parameter auf mail () setzen, um eine Absenderadresse hinzuzufügen. Sehen Sie, ob dies für Sie der Fall sein könnte.
Wenn alles andere fehlschlägt, sollten Sie E-Mail-as-a-Service wie Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue oder SendGrid verwenden, um nur einige zu nennen. Sie verfügen alle über APIs, die mit PHP aufgerufen werden können.
E-Mail senden - Die Grundlagen, weitere Details und ein vollständiges Beispiel
Eine typische E-Mail besteht aus drei Hauptkomponenten:
- Ein Empfänger (als E-Mail-Adresse dargestellt)
- Ein Thema
- Ein Nachrichtentext
Das Senden von E-Mails in PHP kann so einfach wie das Aufrufen der integrierten Funktion mail()
. mail()
nimmt bis zu fünf Parameter an, aber nur die ersten drei werden benötigt, um eine E-Mail zu senden (obwohl die vier Parameter üblicherweise verwendet werden, wie unten gezeigt wird). Die ersten drei Parameter sind:
- E-Mail-Adresse des Empfängers (Zeichenfolge)
- Der Betreff der E-Mail (Zeichenfolge)
- Der Körper der E-Mail (String) (zB der Inhalt der E-Mail)
Ein minimales Beispiel würde dem folgenden Code ähneln:
mail('[email protected]', 'Email Subject', 'This is the email message body');
Das einfache Beispiel oben funktioniert gut, wenn ein E-Mail-Alarm für ein internes System hart codiert ist. Es ist jedoch üblich, die übergebenen Daten als Parameter für mail()
in Variablen zu platzieren, um den Code sauberer und einfacher zu verwalten (z. B. das dynamische Erstellen einer E-Mail aus einer Formularübermittlung).
Darüber hinaus akzeptiert mail()
einen vierten Parameter, mit dem Sie zusätzliche E-Mail-Header mit Ihrer E-Mail senden können. Mit diesen Kopfzeilen können Sie Folgendes festlegen:
- der
From
Namen und E - Mail - Adresse wird der Benutzer sehen - Die
Reply-To
EReply-To
Mail-Adresse, an die der Benutzer eine Antwort sendet - zusätzliche Nicht-Standard-Header wie
X-Mailer
die dem Empfänger mitteilen können, dass diese E-Mail über PHP gesendet wurde
$to = '[email protected]'; // Could also be $to = $_POST['recipient'];
$subject = 'Email Subject'; // Could also be $subject = $_POST['subject'];
$message = 'This is the email message body'; // Could also be $message = $_POST['message'];
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
Der optionale fünfte Parameter kann verwendet werden, um zusätzliche Flags als Befehlszeilenoptionen an das Programm zu übergeben, das für das Senden von E-Mail konfiguriert ist, wie in der Konfigurationseinstellung sendmail_path
definiert. Dies kann beispielsweise verwendet werden, um die Absenderadresse des Umschlags festzulegen, wenn sendmail / postfix mit der Option -f
sendmail verwendet wird.
$fifth = '[email protected]';
Obwohl die Verwendung von mail()
ziemlich zuverlässig sein kann, ist es keinesfalls garantiert, dass eine E-Mail gesendet wird, wenn mail()
aufgerufen wird. Um festzustellen, ob beim Senden Ihrer E-Mail ein potenzieller Fehler auftritt, sollten Sie den Rückgabewert von mail()
erfassen. TRUE
wird zurückgegeben, wenn die Mail erfolgreich zur Zustellung angenommen wurde. Andernfalls erhalten Sie FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
HINWEIS : Obwohl mail()
möglicherweise TRUE
, bedeutet dies nicht , dass die E-Mail gesendet wurde oder dass die E-Mail vom Empfänger empfangen wird. Es zeigt nur an, dass die Mail erfolgreich an das Mail-System Ihres Systems übergeben wurde.
Wenn Sie eine HTML-E-Mail senden möchten, müssen Sie nicht mehr viel Arbeit erledigen. Du musst:
- Fügen Sie den
MIME-Version
Header hinzu - Fügen Sie den
Content-Type
Header hinzu - Stellen Sie sicher, dass Ihr E-Mail-Inhalt HTML ist
$to = '[email protected]';
$subject = 'Email Subject';
$message = '<html><body>This is the email message body</body></html>';
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'MIME-Version: 1.0',
'Content-Type: text/html; charset=ISO-8859-1',
'X-Mailer: PHP/' . PHP_VERSION
]);
Hier ist ein vollständiges Beispiel für die Verwendung der mail()
Funktion von PHP
<?php
// Debugging tools. Only turn these on in your development environment.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
// Special mail settings that can make mail less likely to be considered spam
// and offers logging in case of technical difficulties.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
// The components of our email
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
// Send the email
$result = mail($to, $subject, $message, $headers);
// Check the results and react accordingly
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Siehe auch
Offizielle Dokumentation
Verwandte Fragen zum Stapelüberlauf
- Das PHP-E-Mail-Formular schließt das Versenden von E-Mails nicht ab
- Wie stellen Sie sicher, dass E-Mails, die Sie programmgesteuert senden, nicht automatisch als Spam markiert werden?
- So verwenden Sie SMTP zum Senden von E-Mails
- Umschlag von Adresse einstellen
Alternative Mailer
E-Mail-Server
Verwandte Themen
Senden von HTML-E-Mails mit mail ()
<?php
$to = '[email protected]';
$subject = 'Sending an HTML email using mail() in PHP';
$message = '<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>';
$headers = implode("\r\n", [
"From: John Conde <[email protected]>",
"Reply-To: [email protected]",
"X-Mailer: PHP/" . PHP_VERSION,
"MIME-Version: 1.0",
"Content-Type: text/html; charset=UTF-8"
]);
mail($to, $subject, $message, $headers);
Dies ist nicht viel anders als das Senden einer Nur-Text-E-Mail . Der Hauptunterschied besteht darin, dass der Inhaltskörper wie ein HTML-Dokument strukturiert ist. Außerdem müssen zwei zusätzliche Header eingefügt werden, damit der E-Mail-Client die E-Mail als HTML ausgeben kann. Sie sind:
- MIME-Version: 1.0
- Inhaltstyp: Text / HTML; Zeichensatz = UTF-8
Senden von Nur-Text-E-Mails mit PHPMailer
Grundlegende Text-E-Mail
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Mailer Error: " . $mail->ErrorInfo;
}
Hinzufügen weiterer Empfänger, CC-Empfänger, BCC-Empfänger
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Senden einer E-Mail mit einer Anlage mithilfe von mail ()
<?php
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
/* Attachment content transferred in Base64 encoding
MUST be split into chunks 76 characters in length as
specified by RFC 2045 section 6.8. By default, the
function chunk_split() uses a chunk length of 76 with
a trailing CRLF (\r\n). The 76 character requirement
does not include the carriage return and line feed */
$content = chunk_split(base64_encode($content));
/* Boundaries delimit multipart entities. As stated
in RFC 2046 section 5.1, the boundary MUST NOT occur
in any encapsulated part. Therefore, it should be
unique. As stated in the following section 5.1.1, a
boundary is defined as a line consisting of two hyphens
("--"), a parameter value, optional linear whitespace,
and a terminating CRLF. */
$prefix = "part_"; // This is an optional prefix
/* Generate a unique boundary parameter value with our
prefix using the uniqid() function. The second parameter
makes the parameter value more unique. */
$boundary = uniqid($prefix, true);
// headers
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION,
'MIME-Version: 1.0',
// boundary parameter required, must be enclosed by quotes
'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
"Content-Transfer-Encoding: 7bit",
"This is a MIME encoded message." // message for restricted transports
]);
// message and attachment
$message = implode("\r\n", [
"--" . $boundary, // header boundary delimiter line
'Content-Type: text/plain; charset="iso-8859-1"',
"Content-Transfer-Encoding: 8bit",
$message,
"--" . $boundary, // content boundary delimiter line
'Content-Type: application/octet-stream; name="RenamedFile.pdf"',
"Content-Transfer-Encoding: base64",
"Content-Disposition: attachment",
$content,
"--" . $boundary . "--" // closing boundary delimiter line
]);
$result = mail($to, $subject, $message, $headers); // send the email
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Content-Transfer-Kodierungen
Die verfügbaren Kodierungen sind 7bit, 8bit, binär, quoted-printable, Base64, ietf-Token, und x-Token. Wenn ein Header einen mehrteiligen Content-Type hat, darf die Content-Transfer-Encoding keinen anderen Wert als 7bit , 8bit oder binär haben, wie in RFC 2045, Abschnitt 6.4 angegeben.
In unserem Beispiel wird die 7-Bit-Codierung, die US-ASCII-Zeichen darstellt, für den mehrteiligen Header ausgewählt, da einige Protokolle, wie in Abschnitt 6 von RFC 2045 erwähnt, nur diese Codierung unterstützen. Daten innerhalb der Grenzen können dann Teil für Teil codiert werden (RFC 2046, Abschnitt 5.1). Dieses Beispiel macht genau das. Der erste Teil, der die Text- / Klartextnachricht enthält, ist mit 8 Bit definiert, da möglicherweise zusätzliche Zeichen unterstützt werden müssen. In diesem Fall wird der Zeichensatz Latin1 (iso-8859-1) verwendet. Der zweite Teil ist der Anhang und wird daher als Base64-codierter Application / Octet-Stream definiert. Da base64 beliebige Daten in den 7-Bit-Bereich transformiert, können diese über eingeschränkte Transporte gesendet werden (RFC 2045, Abschnitt 6.2).
Senden von HTML-E-Mails mit PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->isHTML(true);
$mail->Body = "<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>";
$mail->AltBody = "This paragraph is not bold.\n\nThis text is not italic.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Senden von E-Mails mit einem Anhang mithilfe von PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email with an attachment using PHPMailer.";
// Add Static Attachment
$attachment = '/path/to/your/file.pdf';
$mail->AddAttachment($attachment , 'RenamedFile.pdf');
// Add Second Attachment, run-time created. ie: CSV to be open with Excel
$csvHeader = "header1,header2,header3";
$csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3";
$mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel');
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Senden von Nur-Text-E-Mails mit Sendgrid
Grundlegende Text-E-Mail
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$sendgrid->send($email);
Hinzufügen weiterer Empfänger, CC-Empfänger, BCC-Empfänger
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setHtml("<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>");
$personalization = new Personalization();
$email = new Email("Recepient Name", "[email protected]");
$personalization->addTo($email);
$email = new Email("RecepientCC Name", "[email protected]");
$personalization->addCc($email);
$email = new Email("RecepientBCC Name", "[email protected]");
$personalization->addBcc($email);
$email->addPersonalization($personalization);
$sendgrid->send($email);
Senden einer E-Mail mit einer Anlage mithilfe von Sendgrid
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
$content = chunk_split(base64_encode($content));
$attachment = new Attachment();
$attachment->setContent($content);
$attachment->setType("application/pdf");
$attachment->setFilename("RenamedFile.pdf");
$attachment->setDisposition("attachment");
$email->addAttachment($attachment);
$sendgrid->send($email);