Recherche…


Paramètres

Paramètre Détails
string $to L'adresse email du destinataire
string $subject La ligne d'objet
string $message Le corps du mail
string $additional_headers Facultatif: en-têtes à ajouter à l'e-mail
string $additional_parameters Facultatif: arguments à transmettre à l'application d'envoi de courrier configurée dans la ligne de commande

Remarques

Le courrier électronique que j'envoie par mon script n'arrive jamais. Que devrais-je faire?

  • Assurez-vous que le rapport d'erreur est activé pour voir les erreurs.

  • Si vous avez accès aux fichiers journaux d'erreur de PHP, vérifiez-les.

  • La commande mail() configurée correctement sur votre serveur ? (Si vous êtes sur un hébergement partagé, vous ne pouvez rien changer ici.)

  • Si les courriels disparaissent, démarrez un compte de messagerie avec un service de messagerie libre doté d'un dossier de courrier indésirable (ou utilisez un compte de messagerie ne faisant aucun filtrage du courrier indésirable). De cette façon, vous pouvez voir si l'e-mail n'est pas envoyé ou peut-être envoyé en tant que spam.

  • Avez-vous vérifié l'adresse "from:" que vous avez utilisée pour d'éventuels mails "retournés à l'expéditeur"? Vous pouvez également configurer une adresse de renvoi séparée pour les messages d'erreur.

Le courrier électronique que j'envoie est filtré en tant que spam. Que devrais-je faire?

  • Est-ce que l'adresse de l'expéditeur ("From") appartient à un domaine qui s'exécute sur le serveur à partir duquel vous envoyez le courrier électronique? Sinon, changez cela.

    N'utilisez jamais les adresses d'expéditeur comme [email protected] . Utilisez la reply-to si vous avez besoin de réponses pour arriver à une adresse différente.

  • Votre serveur est-il sur une liste noire? C'est une possibilité lorsque vous êtes sur un hébergement partagé lorsque vos voisins se comportent mal. La plupart des fournisseurs de listes noires, comme Spamhaus , ont des outils qui vous permettent de rechercher l'adresse IP de votre serveur. Il existe également des outils tiers tels que MX Toolbox.

  • Certaines installations de PHP nécessitent de définir un cinquième paramètre sur mail () pour ajouter une adresse d'expéditeur. Voyez si cela pourrait être le cas pour vous.

  • Si tout échoue, envisagez d'utiliser Mail -as-a-service, tel que Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue ou SendGrid, pour n'en nommer que quelques-uns. Ils ont tous des API qui peuvent être appelées en PHP.

Envoi d'e-mails - Les bases, plus de détails et un exemple complet

Un e-mail typique comporte trois composants principaux:

  1. Un destinataire (représenté comme une adresse e-mail)
  2. Un sujet
  3. Un corps de message

L'envoi de courrier en PHP peut être aussi simple que d'appeler la fonction intégrée mail() . mail() prend jusqu'à cinq paramètres, mais les trois premiers sont tout ce qui est requis pour envoyer un courrier électronique (bien que les quatre paramètres soient couramment utilisés comme cela sera démontré ci-dessous). Les trois premiers paramètres sont:

  1. L'adresse email du destinataire (chaîne)
  2. Le sujet de l'e-mail (chaîne)
  3. Le corps de l'e-mail (chaîne) (par exemple le contenu de l'e-mail)

Un exemple minimal ressemblerait au code suivant:

mail('[email protected]', 'Email Subject', 'This is the email message body');

L'exemple simple ci-dessus fonctionne bien dans des circonstances limitées, telles que le codage en dur d'une alerte par courrier électronique pour un système interne. Cependant, il est courant de placer les données transmises en tant que paramètres pour mail() variables mail() afin de rendre le code plus propre et plus facile à gérer (par exemple, générer dynamiquement un courrier électronique à partir d'une soumission de formulaire).

En outre, mail() accepte un quatrième paramètre qui vous permet d'envoyer des en-têtes de courrier supplémentaires avec votre courrier électronique. Ces en-têtes peuvent vous permettre de définir:

  • la From nom et adresse e - mail , l'utilisateur verra
  • la Reply-To l' adresse e - mail de réponse de l'utilisateur sera envoyé à
  • autres en-têtes non-standards comme X-Mailer qui peuvent dire au destinataire que cet email a été envoyé 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
]);

Le cinquième paramètre facultatif peut être utilisé pour transmettre des indicateurs supplémentaires en tant qu'options de ligne de commande au programme configuré pour être utilisé lors de l'envoi de courrier, comme défini par le paramètre de configuration sendmail_path . Par exemple, cela peut être utilisé pour définir l'adresse de l'expéditeur de l'enveloppe lors de l'utilisation de sendmail / postfix avec l'option -f sendmail.

$fifth  = '[email protected]';

Bien que l'utilisation de mail() puisse être assez fiable, il n'est en aucun cas garanti qu'un courrier électronique soit envoyé lors de l'appel de mail() . Pour voir s'il y a une erreur potentielle lors de l'envoi de votre courrier électronique, vous devez capturer la valeur de retour de mail() . TRUE sera renvoyé si le courrier a été accepté avec succès pour la livraison. Sinon, vous recevrez FALSE .

$result = mail($to, $subject, $message, $headers, $fifth);

REMARQUE : Bien que mail() puisse renvoyer TRUE , cela ne signifie pas que l'e-mail a été envoyé ou que l'e-mail sera reçu par le destinataire. Cela indique uniquement que le courrier a été transmis avec succès au système de messagerie de votre système.

Si vous souhaitez envoyer un e-mail HTML, vous n'avez pas beaucoup de travail à faire. Tu dois:

  1. Ajoutez l'en MIME-Version tête MIME-Version
  2. Ajouter l'en Content-Type tête Content-Type
  3. Assurez-vous que votre contenu e-mail est 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
]);

Voici un exemple complet d'utilisation de la fonction mail() de 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.
  
}

Voir également

Documentation officielle

Questions relatives au débordement de pile

Mailers alternatifs

Serveurs de messagerie

Rubriques connexes

Envoi de courrier électronique HTML à l'aide de 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);

Ce n'est pas très différent d' envoyer ensuite un e-mail en texte brut . Les principales différences étant que le corps du contenu est structuré comme un document HTML, deux autres en-têtes doivent être inclus pour que le client de messagerie sache trender le courrier électronique au format HTML. Elles sont:

  • Version MIME: 1.0
  • Type de contenu: text / html; jeu de caractères = UTF-8

Envoi d'e-mails en texte brut avec PHPMailer

Texte de base Email

<?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;
}

Ajout de destinataires supplémentaires, destinataires CC, destinataires 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;
}   

Envoi de courrier électronique avec une pièce jointe à l'aide de 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-Encodings

Les encodages disponibles sont 7bit , 8bit , binary , quoted-printable , base64 , ietf-token et x-token . Parmi ces codages, lorsqu'un en-tête a un type de contenu multipart , le Content-Transfer-Encoding ne doit pas avoir d'autre valeur que 7bit , 8bit ou binary, comme indiqué dans la section 6.4 de la RFC 2045.

Notre exemple choisit le codage 7 bits, qui représente les caractères US-ASCII, pour l'en-tête multipart car, comme indiqué dans la section 6 de la RFC 2045, certains protocoles ne prennent en charge que cet encodage. Les données contenues dans les limites peuvent alors être codées sur une base partielle (RFC 2046, section 5.1). Cet exemple fait exactement cela. La première partie, qui contient le message text / plain, est définie comme étant 8 bits, car il peut être nécessaire de prendre en charge des caractères supplémentaires. Dans ce cas, le jeu de caractères Latin1 (iso-8859-1) est utilisé. La deuxième partie est la pièce jointe et est donc définie comme une application / un flux d'octets codé en base64. Puisque base64 transforme les données arbitraires dans la plage de 7 bits, il peut être envoyé sur des transports restreints (RFC 2045, section 6.2).

Envoi de courrier électronique HTML à l'aide de 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;
}   

Envoi d'e-mails avec une pièce jointe à l'aide de 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;
}   

Envoi d'e-mails en texte brut à l'aide de Sendgrid

Texte de base Email

<?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);

Ajout de destinataires supplémentaires, destinataires CC, destinataires 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);

Envoi de courrier électronique avec une pièce jointe à l'aide de 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);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow