PHP
Email verzenden
Zoeken…
parameters
Parameter | Details |
---|---|
string $to | Het e-mailadres van de ontvanger |
string $subject | De onderwerpregel |
string $message | De inhoud van de e-mail |
string $additional_headers | Optioneel: headers om toe te voegen aan de e-mail |
string $additional_parameters | Optioneel: argumenten om door te geven aan de geconfigureerde e-mailverzendtoepassing op de opdrachtregel |
Opmerkingen
E-mail die ik via mijn script verzend, komt nooit aan. Wat moet ik doen?
Zorg ervoor dat foutrapportage is ingeschakeld om fouten te zien.
Als u toegang hebt tot PHP's foutenlogboekbestanden, controleer deze dan.
Is de opdracht
mail()
correct geconfigureerd op uw server ? (Als u op shared hosting bent, kunt u hier niets veranderen.)Als e-mails gewoon verdwijnen, start u een e-mailaccount met een freemailservice die een map met spam heeft (of gebruikt u een e-mailaccount die helemaal geen spamfiltert). Op deze manier kunt u zien of de e-mail niet wordt verzonden of misschien wordt verzonden, maar als spam wordt gefilterd.
Hebt u het e-mailadres "van:" dat u hebt gebruikt voor mogelijke e-mails "teruggestuurd naar afzender" gecontroleerd? U kunt ook een afzonderlijk bounce-adres instellen voor foutmails.
De e-mail die ik verzend, wordt als spam gefilterd. Wat moet ik doen?
Behoort het afzenderadres ("Van") tot een domein dat wordt uitgevoerd op de server vanwaar u het e-mailbericht verzendt? Zo niet, verander dat dan.
Gebruik nooit afzenderadressen zoals
[email protected]
. Gebruikreply-to
als u antwoorden nodig hebt om op een ander adres aan te komen.Staat uw server op een zwarte lijst? Dit is een mogelijkheid wanneer u op shared hosting bent wanneer buren zich slecht gedragen. De meeste blacklist-providers, zoals Spamhaus , hebben hulpmiddelen waarmee u het IP-adres van uw server kunt opzoeken. Er zijn ook tools van derden zoals MX Toolbox.
Voor sommige PHP-installaties moet een vijfde parameter worden ingesteld voor mail () om een afzenderadres toe te voegen. Kijk of dit voor u het geval kan zijn.
Als al het andere faalt, kunt u overwegen e-mail-as-a-service zoals Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue of SendGrid te gebruiken - om er maar een paar te noemen -. Ze hebben allemaal API's die kunnen worden aangeroepen met PHP.
E-mail verzenden - De basis, meer details en een volledig voorbeeld
Een typische e-mail heeft drie hoofdcomponenten:
- Een ontvanger (weergegeven als een e-mailadres)
- Een vak
- Een berichttekst
E-mail verzenden in PHP kan net zo eenvoudig zijn als het oproepen van de ingebouwde functie mail()
. mail()
duurt maximaal vijf parameters, maar de eerste drie zijn voldoende om een e-mail te verzenden (hoewel de vier parameters vaak worden gebruikt, zoals hieronder wordt aangetoond). De eerste drie parameters zijn:
- Het e-mailadres van de ontvanger (string)
- Het onderwerp van de e-mail (string)
- De inhoud van de e-mail (tekenreeks) (bijvoorbeeld de inhoud van de e-mail)
Een minimaal voorbeeld lijkt op de volgende code:
mail('[email protected]', 'Email Subject', 'This is the email message body');
Het eenvoudige voorbeeld hierboven werkt goed in beperkte omstandigheden, zoals het hardcoderen van een e-mailwaarschuwing voor een intern systeem. Het is echter gebruikelijk om de doorgegeven gegevens als parameters voor mail()
in variabelen te plaatsen om de code schoner en eenvoudiger te beheren te maken (bijvoorbeeld dynamisch een e-mail samenstellen van een formulierverzending).
Bovendien accepteert mail()
een vierde parameter waarmee u extra e-mailkoppen bij uw e-mail kunt ontvangen. Met deze headers kunt u instellen:
- de
From
naam en e-mailadres die de gebruiker ziet - het
Reply-To
e-mailadres waarnaar de reactie van de gebruiker wordt verzonden - extra niet-standaard headers zoals
X-Mailer
die de ontvanger kunnen vertellen dat deze e-mail is verzonden via 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
]);
De optionele vijfde parameter kan worden gebruikt om extra vlaggen als opdrachtregelopties door te geven aan het programma dat is geconfigureerd om te worden gebruikt bij het verzenden van e-mail, zoals gedefinieerd door de configuratie-instelling sendmail_path
. Dit kan bijvoorbeeld worden gebruikt om het adres van de -f
te stellen bij het gebruik van sendmail / postfix met de optie -f
sendmail.
$fifth = '[email protected]';
Hoewel het gebruik van mail()
behoorlijk betrouwbaar kan zijn, is het geenszins gegarandeerd dat een e-mail wordt verzonden wanneer mail()
wordt aangeroepen. Om te zien of er een mogelijke fout is bij het verzenden van uw e-mail, moet u de retourwaarde van mail()
vastleggen mail()
. TRUE
wordt geretourneerd als de e-mail met succes is geaccepteerd voor levering. Anders ontvang je FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
OPMERKING : hoewel mail()
TRUE
, betekent dit niet dat de e-mail is verzonden of dat de e-mail door de ontvanger wordt ontvangen. Het geeft alleen aan dat de e-mail met succes is overgedragen aan het e-mailsysteem van uw systeem.
Als u een HTML-e-mail wilt verzenden, hoeft u niet veel meer te doen. Je moet:
- Voeg de kop
MIME-Version
- Voeg de kop
Content-Type
- Zorg ervoor dat uw e-mailinhoud HTML is
$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 is een volledig voorbeeld van het gebruik van PHP's mail()
functie
<?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.
}
Zie ook
Officiële documentatie
Gerelateerde stapeloverloopvragen
- PHP e-mailformulier is niet voltooid bij het verzenden van e-mail
- Hoe zorg je ervoor dat e-mail die je programmatisch verzendt niet automatisch als spam wordt gemarkeerd?
- Hoe SMTP te gebruiken om e-mail te verzenden
- Envelop instellen vanaf adres
Alternatieve mailers
E-mailservers
Gerelateerde onderwerpen
HTML-e-mail verzenden met 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);
Dit is niet veel anders dan het verzenden van een gewone e-mail . De belangrijkste verschillen zijn dat de inhoud is gestructureerd als een HTML-document en er zijn twee extra headers die moeten worden opgenomen, zodat de e-mailclient weet dat de e-mail als HTML moet worden verzonden. Zij zijn:
- MIME-versie: 1.0
- Inhoudstype: text / html; charset = UTF-8
E-mail met tekst zonder opmaak verzenden met PHPMailer
Basistekst 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;
}
Extra ontvangers, CC-ontvangers, BCC-ontvangers toevoegen
<?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;
}
E-mail verzenden met een bijlage E-mail gebruiken ()
<?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-coderingen
De beschikbare coderingen zijn 7bit , 8bit , binair , quoted-printable , base64 , ietf-token en x-token . Van deze coderingen, wanneer een header heeft een multipart Content-Type, de Content-Transfer-Encoding mag geen andere dan 7bit, 8bit, of binaire waarde zoals vermeld in RFC 2045, paragraaf 6.4.
Ons voorbeeld kiest de 7bit-codering, die US-ASCII-tekens vertegenwoordigt, voor de multipart-header omdat, zoals opgemerkt in RFC 2045 paragraaf 6, sommige protocollen alleen deze codering ondersteunen. Gegevens binnen de grenzen kunnen vervolgens per onderdeel worden gecodeerd (RFC 2046, paragraaf 5.1). Dit voorbeeld doet precies dit. Het eerste deel, dat het tekst / gewone bericht bevat, is gedefinieerd als 8bit, omdat het mogelijk nodig is om extra tekens te ondersteunen. In dit geval wordt de tekenset Latin1 (iso-8859-1) gebruikt. Het tweede deel is de bijlage en wordt dus gedefinieerd als een base64-gecodeerde applicatie / octet-stream. Aangezien base64 willekeurige gegevens omzet in het 7bit-bereik, kan deze via beperkte transporten worden verzonden (RFC 2045, sectie 6.2).
HTML-e-mail verzenden met 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;
}
E-mail verzenden met een bijlage via 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;
}
E-mail met tekst zonder opmaak verzenden met Sendgrid
Basistekst 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);
Extra ontvangers, CC-ontvangers, BCC-ontvangers toevoegen
<?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);
E-mail verzenden met een bijlage via 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);