PHP
Wysyłać email
Szukaj…
Parametry
Parametr | Detale |
---|---|
string $to | Adres e-mail odbiorcy |
string $subject | Temat |
string $message | Treść wiadomości e-mail |
string $additional_headers | Opcjonalnie: nagłówki do dodania do wiadomości e-mail |
string $additional_parameters | Opcjonalnie: argumenty przekazywane do skonfigurowanej aplikacji wysyłającej pocztę w wierszu polecenia |
Uwagi
E-mail wysyłany przez mój skrypt nigdy nie dociera. Co powinienem zrobić?
Upewnij się, że masz włączone raportowanie błędów, aby zobaczyć błędy.
Jeśli masz dostęp do plików dziennika błędów PHP, sprawdź je.
Czy polecenie
mail()
poprawnie skonfigurowane na twoim serwerze ? (Jeśli korzystasz z hostingu współdzielonego, nie możesz tutaj nic zmienić.)Jeśli wiadomości e-mail po prostu znikają, załóż konto e-mail w usłudze Freemail, która zawiera folder spamu (lub użyj konta pocztowego, które w ogóle nie filtruje spamu). W ten sposób możesz sprawdzić, czy wiadomość e-mail nie jest wysyłana, czy może wysyłana, ale filtrowana jako spam.
Czy sprawdziłeś adres „z:” użyty dla możliwych wiadomości „zwróconych do nadawcy”? Możesz także skonfigurować osobny adres zwrotny dla wiadomości o błędach.
Wysyłana przeze mnie wiadomość e-mail jest filtrowana jako spam. Co powinienem zrobić?
Czy adres nadawcy („Od”) należy do domeny działającej na serwerze, z którego wysyłasz wiadomość e-mail? Jeśli nie, zmień to.
Nigdy nie używaj adresów nadawców, takich jak
[email protected]
. Skorzystaj zreply-to
jeśli potrzebujesz odpowiedzi, aby dotrzeć na inny adres.Czy twój serwer znajduje się na czarnej liście? Jest to możliwe, gdy korzystasz z hostingu współdzielonego, gdy sąsiedzi źle się zachowują. Większość dostawców czarnej listy, takich jak Spamhaus , posiada narzędzia, które pozwalają sprawdzić adres IP twojego serwera. Istnieją również narzędzia innych firm, takie jak MX Toolbox.
Niektóre instalacje PHP wymagają ustawienia piątego parametru na mail () w celu dodania adresu nadawcy. Sprawdź, czy może tak być w Twoim przypadku.
Jeśli wszystko inne zawiedzie, rozważ użycie e-maila jako usługi, takiej jak Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue lub SendGrid - aby wymienić tylko kilka - zamiast tego. Wszystkie mają interfejsy API, które można wywoływać za pomocą PHP.
Wysyłanie wiadomości e-mail - podstawy, więcej szczegółów i pełny przykład
Typowy e-mail składa się z trzech głównych elementów:
- Odbiorca (reprezentowany jako adres e-mail)
- Temat
- Treść wiadomości
Wysyłanie poczty w PHP może być tak proste, jak wywołanie wbudowanej funkcji mail()
. mail()
zajmuje do pięciu parametrów, ale pierwsze trzy są wystarczające do wysłania wiadomości e-mail (chociaż te cztery parametry są powszechnie używane, jak pokazano poniżej). Pierwsze trzy parametry to:
- Adres e-mail odbiorcy (ciąg znaków)
- Temat e-maila (ciąg)
- Treść wiadomości e-mail (ciąg znaków) (np. Treść wiadomości e-mail)
Minimalny przykład przypominałby następujący kod:
mail('[email protected]', 'Email Subject', 'This is the email message body');
Prosty powyższy przykład działa dobrze w ograniczonych okolicznościach, takich jak zakodowanie na stałe powiadomienia e-mail dla systemu wewnętrznego. Jednak częste jest umieszczanie danych przekazywanych jako parametry dla mail()
w zmiennych, aby kod był czystszy i łatwiejszy w zarządzaniu (na przykład dynamiczne budowanie wiadomości e-mail po przesłaniu formularza).
Dodatkowo mail()
akceptuje czwarty parametr, który pozwala na wysyłanie dodatkowych nagłówków wiadomości e-mail. Te nagłówki umożliwiają ustawienie:
-
From
nazwisko i adres e-mail użytkownik zobaczy -
Reply-To
adres email odpowiedź użytkownika zostanie wysłany do - dodatkowe niestandardowe nagłówki, takie jak
X-Mailer
które informują odbiorcę, że ten e-mail został wysłany za pośrednictwem PHP
$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
]);
Opcjonalnego piątego parametru można użyć do przekazania dodatkowych flag jako opcji wiersza poleceń do programu skonfigurowanego do użycia podczas wysyłania poczty, zgodnie z ustawieniem konfiguracji sendmail_path
. Na przykład można tego użyć do ustawienia adresu nadawcy koperty podczas korzystania z sendmail / postfix z opcją -f
sendmail.
$fifth = '[email protected]';
Chociaż użycie mail()
może być dość niezawodne, nie ma żadnej gwarancji, że wiadomość e-mail zostanie wysłana po wywołaniu mail()
. Aby sprawdzić, czy istnieje potencjalny błąd podczas wysyłania wiadomości e-mail, należy przechwycić wartość zwracaną z mail()
. TRUE
zostanie zwrócone, jeśli poczta została pomyślnie zaakceptowana do dostarczenia. W przeciwnym razie otrzymasz FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
UWAGA : Mimo że mail()
może zwrócić wartość TRUE
, nie oznacza to, że wiadomość e-mail została wysłana ani że wiadomość zostanie odebrana przez odbiorcę. Wskazuje tylko, że poczta została pomyślnie przekazana do systemu pocztowego systemu.
Jeśli chcesz wysłać wiadomość e-mail w formacie HTML, nie musisz wykonywać zbyt wiele pracy. Musisz:
- Dodaj nagłówek
MIME-Version
- Dodaj nagłówek
Content-Type
- Upewnij się, że treść e-maila to HTML
$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
]);
Oto pełny przykład użycia funkcji mail()
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.
}
Zobacz też
Oficjalna dokumentacja
Powiązane pytania dotyczące przepełnienia stosu
- Formularz pocztowy PHP nie kończy wysyłania wiadomości e-mail
- Jak upewnić się, że wiadomości e-mail wysyłane programowo nie są automatycznie oznaczane jako spam?
- Jak używać SMTP do wysyłania wiadomości e-mail
- Ustawianie koperty z adresu
Alternatywne przesyłki pocztowe
Serwery e-mail
Powiązane tematy
Wysyłanie wiadomości e-mail w formacie HTML za pomocą poczty ()
<?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);
Nie różni się to niczym od wysłania zwykłego e-maila . Kluczowe różnice w treści są takie, jak w dokumencie HTML. Istnieją dwa dodatkowe nagłówki, które należy uwzględnić, aby klient poczty e-mail mógł traktować wiadomość e-mail jako HTML. Oni są:
- Wersja MIME: 1.0
- Content-Type: text / html; charset = UTF-8
Wysyłanie zwykłego e-maila za pomocą PHPMailer
Podstawowy e-mail tekstowy
<?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;
}
Dodawanie dodatkowych odbiorców, odbiorców CC, odbiorców BCC
<?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;
}
Wysyłanie wiadomości e-mail z załącznikiem za pomocą poczty ()
<?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.
}
Kodowanie-przesyłanie treści
Dostępne są 7BIT kodowania, 8bit, binarny, quoted-printable, base64, IETF-żeton, a x-żeton. Spośród tych kodowań, gdy nagłówek ma wieloczęściowy typ treści, kodowanie-przesyłanie-kodowanie treści nie może mieć innej wartości niż 7- bitowa , 8- bitowa lub binarna, jak podano w RFC 2045, sekcja 6.4.
Nasz przykład wybiera kodowanie 7-bitowe, które reprezentuje znaki US-ASCII, dla nagłówka wieloczęściowego, ponieważ, jak zauważono w sekcji 6 RFC 2045, niektóre protokoły obsługują tylko to kodowanie. Dane w granicach mogą być następnie kodowane na zasadzie części po części (RFC 2046, sekcja 5.1). Ten przykład robi dokładnie to. Pierwsza część, która zawiera wiadomość tekstową / zwykłą, jest zdefiniowana jako 8-bitowa, ponieważ może być konieczne wsparcie dodatkowych znaków. W takim przypadku używany jest zestaw znaków Latin1 (iso-8859-1). Druga część to załącznik, a zatem jest zdefiniowana jako aplikacja / strumień oktetu zakodowany w standardzie base64. Ponieważ base64 przekształca dowolne dane w zakres 7-bitowy, można je przesyłać ograniczonymi transportami (RFC 2045, sekcja 6.2).
Wysyłanie wiadomości e-mail w formacie HTML za pomocą 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;
}
Wysyłanie wiadomości e-mail z załącznikiem za pomocą 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;
}
Wysyłanie zwykłego e-maila za pomocą Sendgrid
Podstawowy e-mail tekstowy
<?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);
Dodawanie dodatkowych odbiorców, odbiorców CC, odbiorców BCC
<?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);
Wysyłanie wiadomości e-mail z załącznikiem za pomocą 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);