Comment envoyer un email en utilisant PHP?


312

J'utilise PHP sur un site Web et je souhaite ajouter une fonctionnalité d'e-mailing.

J'ai installé WAMPSERVER.

Comment envoyer un e-mail en utilisant PHP?


19
Lire le manuel
diEcho

Réponses:


443

L'utilisation de la mail()fonction PHP est possible. N'oubliez pas que la fonction de messagerie ne fonctionnera pas sur un serveur local.

<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?> 

Référence:


6
que faire si j'ai besoin d'envoyer un e-mail à partir du serveur local. Je veux dire, existe-t-il un moyen d'accéder au serveur de messagerie le plus proche et de lui envoyer du courrier pour moi? Je veux dire que je peux trouver l'adresse d'un serveur de messagerie Yahoo et que j'utilise ce serveur à des fins de diffusion ... est-ce possible?
user590849

19
Vous devez configurer SMTP sur votre serveur local. Jetez un œil à cet article similaire, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran

Bonjour @MuthuKumaran s'il y a du spam, y a-t-il une bonne solution pour le résoudre, répondez s'il vous plaît.
Muhammad Ashikuzzaman

@MuhammadAshikuzzaman Vous ne pouvez pas résoudre le problème de spam en PHP. Veuillez poser une nouvelle question sur le site StackExchange approprié si cela est toujours pertinent.
Uli Köhler

Comment s'assurer ou vérifier si cela fonctionne sur mon serveur local? Si ce n'est pas possible, suggérez quelques alternatives. Merci.
abhishah901

121

Vous pouvez également utiliser la classe PHPMailer sur https://github.com/PHPMailer/PHPMailer .

Il vous permet d'utiliser la fonction de messagerie ou d'utiliser un serveur smtp de manière transparente. Il gère également les e-mails et les pièces jointes HTML afin que vous n'ayez pas à écrire votre propre implémentation.

La classe est stable et elle est utilisée par de nombreux autres projets comme Drupal, SugarCRM, Yii et Joomla!

Voici un exemple de la page ci-dessus:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = 'from@example.com';
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$mail->isHTML(true);                                  // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

4
Si vous n'utilisez pas le compositeur:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

Si vous êtes intéressé par un e-mail au format html, assurez-vous de passer l' Content-type: text/html;en-tête. Exemple:

// multiple recipients
$to  = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';

// subject
$subject = 'Birthday Reminders for August';

// message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

Pour plus de détails, consultez la fonction de messagerie php .


Bonjour, j'ai fatigué ce code, j'ai ajouté 3 destinataires, un Hotmail, un Gmail et un email de mon site Web. J'ai tout reçu sauf sur Hotmail. Avez-vous une idée pourquoi cela ne fonctionne pas pour Hotmail?
antf

Veuillez vérifier le dossier spam dans ce cas.
Sumoanand

Je l'ai déjà fait, il n'est pas dans le spam, il n'atteint pas du tout. J'ai lu un peu plus sur le sujet et il semble que Hotmail nécessite un en-tête spécial ou qu'il ne permette pas à l'e-mail de passer sur leurs serveurs ... Je n'ai toujours pas trouvé la solution.
antf

J'ai résolu mon problème en utilisant PHPMailer et en saisissant mes données de compte de messagerie avec SSL dans l'objet de messagerie de PHPMailer.
antf

Que faire si le message contient du contenu HTML et php?

14

Consultez également le package de courrier PEAR Pear Mail Page

Elle semble être un peu plus robuste que la fonction mail () standard qui est intégrée (si la fonction standard n'est pas adéquate).

Voici un extrait de cette page montrant comment il est utilisé. Utilisation de PEAR Mail send ()

<?php
    include('Mail.php');

    $recipients = 'joe@example.com';

    $headers['From']    = 'richard@example.com';
    $headers['To']      = 'joe@example.com';
    $headers['Subject'] = 'Test message';

    $body = 'Test message';

    $smtpinfo["host"] = "smtp.server.com";
    $smtpinfo["port"] = "25";
    $smtpinfo["auth"] = true;
    $smtpinfo["username"] = "smtp_user";
    $smtpinfo["password"] = "smtp_password";


    // Create the mail object using the Mail::factory method
    $mail_object =& Mail::factory("smtp", $smtpinfo); 

    $mail_object->send($recipients, $headers, $body);
?> 

veuillez donner un lien de téléchargement de votre lien mail.php utilisé et de tout autre fichier associé dans un dossier. Merci
Muhammad Ashikuzzaman

1
@Ashik Le Mail.phpfichier référencé dans mon exemple fait partie du package Pear Mail. Si vous téléchargez et installez le package Pear Mail, vous pourrez l'inclure Mail.php. Si vous cliquez sur le lien «Pear Mail Page» ci-dessus, il y a un lien de téléchargement avec des instructions.
Kevin S

12

Pour la plupart des projets, j'utilise Swift mailer ces jours-ci. C'est une approche orientée objet très flexible et élégante pour l'envoi d'e-mails, créée par les mêmes personnes qui nous ont donné le framework Symfony populaire et le moteur de modèle Twig .


Utilisation de base:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Consultez la documentation officielle pour plus d'informations sur l'utilisation de Swift Mailer.


Salut. Vous avez dit Swift_MailTransportquand votre lien vers la documentation le disait Swift_SendmailTransport. Cela signifie-t-il que vous faisiez référence à une ancienne version de swift mailer ou qu'il s'agit d'une faute de frappe, ou peut-être que je comprends mal quelque chose? J'ai besoin d'installer une ancienne version de swift-mailer car je n'ai pas de php7 sur mon serveur. J'ai donc besoin de savoir si la documentation de la version actuelle irait avec une ancienne version du package. Merci.
Yevgeniy Afanasyev

1
@YevgeniyAfanasyev: Ma réponse était la bonne façon de faire les choses il y a 2 ans, mais Swift_MailTransport est déconseillé depuis Swiftmailer v5.4.5 . Quoi qu'il en soit, si vous ne pouvez pas utiliser PHP 7 pour votre projet, vous devriez opter pour Swiftmailer v5.4.9. C'est la dernière version stable qui prend toujours en charge PHP 5. Pour la documentation de la version v5.4.9 ou des détails sur les différences entre v5.4.9 et v6.0.2, vous pouvez contacter Fabien Potencier ou soulever un problème sur Github .
John Slegers

Merci beaucoup. Il n'y a donc pas de documentation disponible pour les anciennes versions, lorsque les distributions sont disponibles. Bon à savoir.
Yevgeniy Afanasyev

7

il s'agit d'une méthode très basique pour envoyer des e-mails en texte brut à l'aide de la fonction de messagerie.

<?php
$to = 'SomeOtherEmailAddress@Domain.com';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <SomeEmailAddress@Domain.com>";
mail($to,$subject,$message,$from);

7

Essaye ça:

<?php
$to = "somebody@example.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: somebodyelse@example.com";

mail($to,$subject,$txt,$headers);
?>

5

Exemple de code complet ..

Essayez-le une fois ..

<?php
// Multiple recipients
$to = 'johny@example.com, sally@example.com'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>

5

Pour les futurs lecteurs: essayez ceci si les autres réponses ne fonctionnent pas (comme ce fut le cas avec moi):

1.) Téléchargez PHPMailer , ouvrez le fichier zip et extrayez le dossier dans le répertoire de votre projet.

3.) Renommez le répertoire extrait en PHPMailer et écrivez le code ci-dessous à l'intérieur de votre script php (le script doit être en dehors du dossier PHPMailer )

<?php
// PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;
// Base files 
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// create object of PHPMailer class with boolean parameter which sets/unsets exception.
$mail = new PHPMailer(true);                              
try {
    $mail->isSMTP(); // using SMTP protocol                                     
    $mail->Host = 'smtp.gmail.com'; // SMTP host as gmail 
    $mail->SMTPAuth = true;  // enable smtp authentication                             
    $mail->Username = 'sender@gmail.com';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('sender@gmail.com', "Sender"); // sender's email and name
    $mail->addAddress('receiver@gmail.com', "Receiver");  // receiver's email and name

    $mail->Subject = 'Test subject';
    $mail->Body    = 'Test body';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) { // handle error.
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

5

La fonction PHP native mail()ne fonctionne pas pour moi. Il émet le message:

503 Ce serveur de messagerie nécessite une authentification lors d'une tentative d'envoi vers une adresse e-mail non locale

Donc, j'utilise habituellement PHPMailer package

J'ai téléchargé la version 5.2.23 depuis: GitHub .

Je viens de choisir 2 fichiers et de les mettre dans ma racine PHP source

class.phpmailer.php
class.smtp.php

En PHP, le fichier doit être ajouté

require_once('class.smtp.php');
require_once('class.phpmailer.php');

Après cela, c'est juste du code:

require_once('class.smtp.php');
require_once('class.phpmailer.php');
... 
//----------------------------------------------
// Send an e-mail. Returns true if successful 
//
//   $to - destination
//   $nameto - destination name
//   $subject - e-mail subject
//   $message - HTML e-mail body
//   altmess - text alternative for HTML.
//----------------------------------------------
function sendmail($to,$nameto,$subject,$message,$altmess)  {

  $from  = "yourcontact@yourdomain.com";
  $namefrom = "yourname";
  $mail = new PHPMailer();  
  $mail->CharSet = 'UTF-8';
  $mail->isSMTP();   // by SMTP
  $mail->SMTPAuth   = true;   // user and password
  $mail->Host       = "localhost";
  $mail->Port       = 25;
  $mail->Username   = $from;  
  $mail->Password   = "yourpassword";
  $mail->SMTPSecure = "";    // options: 'ssl', 'tls' , ''  
  $mail->setFrom($from,$namefrom);   // From (origin)
  $mail->addCC($from,$namefrom);      // There is also addBCC
  $mail->Subject  = $subject;
  $mail->AltBody  = $altmess;
  $mail->Body = $message;
  $mail->isHTML();   // Set HTML type
//$mail->addAttachment("attachment");  
  $mail->addAddress($to, $nameto);
  return $mail->send();
}

Il fonctionne comme un charme


2
Merci pour votre réponse. Vous avez la même suggestion que @norteo a indiqué dans sa réponse. Veuillez garder à l'esprit que la v5.2 est obsolète et ne reçoit pas de mises à jour de sécurité. Pour la v6, vous pouvez directement demander:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

La façon principale d'envoyer des e-mails depuis PHP est d'utiliser sa mail()fonction intégrée, mais il existe quelques SDK prêts à l'emploi qui peuvent faciliter l'intégration:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (fonctionne sur HTTP, donc le problème de bloc de port SMTP peut être évité)
  4. Envoyer un mail

PS Je suis employé chez Pepipost.


3
Vous travaillez chez Pepipost et vous placez Pepipost au n ° 3. +1
GeneCode

2
@GeneCode, si quelque chose est mieux, alors c'est le cas. Peu importe que vous soyez employé avec eux ou non :) Swiftmailer et PHPMailer, sont certainement l'un des meilleurs outils open source pour envoyer des e-mails (je les ai donc conservés en 1 et 2). Mais, en même temps, ils ont certaines limitations et bloqueurs que nous avons essayé de résoudre dans notre SDK Pepipost.
Dibya Sahoo


1

Envoyé l'e-mail avec ce script

<h2>Test Mail</h2>
<?php

if (!isset($_POST["submit"]))
  {
  ?>
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  From: <input type="text" name="from"><br>
  Subject: <input type="text" name="subject"><br>
  Message: <textarea rows="10" cols="40" name="message"></textarea><br>
  <input type="submit" name="submit" value="Click To send mail">
  </form>
  <?php
  }

else

  {

  if (isset($_POST["from"]))
    {
    $from = $_POST["from"]; // sender
    $subject = $_POST["subject"];
    $message = $_POST["message"];

    $message = wordwrap($message, 70);

    mail("Test@example.com",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

Une fois que vous avez appuyé sur le bouton Envoyer un e-mail, l'e-mail sera envoyé à Test@example.com


1
<?php
include "db_conn.php";//connection file
require "PHPMailerAutoload.php";// it will be in PHPMailer
require "class.smtp.php";// it will be in PHPMailer
require "class.phpmailer.php";// it will be in PHPMailer


$response = array();
$params = json_decode(file_get_contents("php://input"));

if(!empty($params->email_id)){

    $email_id = $params->email_id;
    $flag=false;
    echo "something";
    if(!filter_var($email_id, FILTER_VALIDATE_EMAIL))
    {
        $response['ERROR']='EMAIL address format error'; 
        echo json_encode($response,JSON_UNESCAPED_SLASHES);
        return;
    }
    $sql="SELECT * from sales where email_id ='$email_id' ";

    $result = mysqli_query($conn,$sql);
    $count = mysqli_num_rows($result);

    $to = "demo@gmail.com";
    $subject = "DEMO Subject";
    $messageBody ="demo message .";

    if($count ==0){
        $response["valid"] = false;
        $response["message"] = "User is not registered yet";
        echo json_encode($response);
        return;
    }

    else {

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true; // authentication enabled
        $mail->IsHTML(true); 
        $mail->SMTPSecure = 'ssl';//turn on to send html email
        // $mail->Host = "ssl://smtp.zoho.com";
        $mail->Host = "p3plcpnl0749.prod.phx3.secureserver.net";//you can use gmail 
        $mail->Port = 465;
        $mail->Username = "demousername@example.com";
        $mail->Password = "demopassword";
        $mail->SetFrom("demousername@example.com", "Any demo alert");
        $mail->Subject = $subject;

        $mail->Body = $messageBody;
        $mail->AddAddress($to);
        echo "yes";

        if(!$mail->send()) {
           echo "Mailer Error: " . $mail->ErrorInfo;
       } 
       else {
           echo "Message has been sent successfully";
      }
    }

}
else{
    $response["valid"] = false;
    $response["message"] = "Required field(s) missing";
    echo json_encode($response);
}


?>

Le code ci-dessus fonctionne pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.