Envoyer un e-mail à l'aide du serveur SMTP GMail à partir d'une page PHP


389

J'essaie d'envoyer un e-mail via le serveur SMTP de GMail à partir d'une page PHP, mais j'obtiens cette erreur:

échec d'authentification [SMTP: le serveur SMTP ne prend pas en charge l'authentification (code: 250, réponse: mx.google.com à votre service, [98.117.99.235] TAILLE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Quelqu'un peut-il aider? Voici mon code:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>

Réponses:


357
// Pear Mail Library
require_once "Mail.php";

$from = '<fromaddress@gmail.com>';
$to = '<toaddress@yahoo.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'johndoe@gmail.com',
        'password' => 'passwordxxx'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}

141
c'est quoi Mail.php?? d'où puis-je obtenir ce fichier?
Zain Shaikh

18
quelqu'un pourrait-il me donner un lien où je peux obtenir le fichier Mail.php. Parce que je l'ai essayé et que ça ne marcherait pas Merci
Yoosuf

11
Où sont les symboles @ dans cet exemple ci-dessus? Je n'en vois pas un seul dedans!
darkAsPitch

6
Je crois que myaccount.gmail.com est identique à myaccount@gmail.com dans les normes de messagerie.
Vol Sherwin

3
Vous n'avez pas besoin d'inclure @gmail si vous avez spécifié le serveur. Tapez simplement le myaccountnom d'utilisateur.
Jack

106

En utilisant Swift mailer , il est assez facile d'envoyer un courrier via les informations d'identification Gmail:

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>

2
Cela a fonctionné "au premier" en modifiant simplement les adresses GMAIL_USERNAME, GMAIL_PASSWORD et From et To. Aucune autre solution n'a fonctionné pour moi. Merci.
Marco Muciño

7
Je suis d'accord, Swift Mailer est une solution de courrier électronique beaucoup plus facile que de jouer avec la poire. N'oubliez pas d'activer l'extension php_openssl de PHP.
Soth

1
Belle solution en utilisant SwiftMailer! +1
Amal Murali

1
arrrgh. icant mettre swiftmailer au travail. je ne sais pas comment utiliser ce "compositeur" alors j'ai juste téléchargé le zip swiftmailer depuis github puis j'ai activé open_ssl puis fourni mon email et mon mot de passe gmail mais cela n'a toujours pas fonctionné.
boi_echos

3
ah désolé pour ma stupidité. vous devez ouvrir votre compte gmail car un e-mail vous demande d'activer "application moins sécurisée". alors son heheh fonctionne maintenant
boi_echos


33

Je ne recommande pas Pear Mail. Il n'a pas été mis à jour depuis 2010. Lisez également les fichiers source; le code source est presque obsolète, écrit en style PHP 4 et de nombreuses erreurs / bugs ont été postés (Google it). J'utilise Swift Mailer.

Swift Mailer s'intègre dans n'importe quelle application Web écrite en PHP 5, offrant une approche orientée objet flexible et élégante pour envoyer des e-mails avec une multitude de fonctionnalités.

Envoyez des e-mails en utilisant SMTP, sendmail, postfix ou une implémentation de transport personnalisée de votre choix.

Serveurs de soutien qui nécessitent un nom d'utilisateur et un mot de passe et / ou un cryptage.

Protégez-vous contre les attaques par injection d'en-tête sans supprimer le contenu des données de demande.

Envoyez des e-mails HTML / multiparties conformes MIME.

Utilisez des plugins événementiels pour personnaliser la bibliothèque.

Gérez les pièces jointes volumineuses et les images intégrées / intégrées avec une faible utilisation de la mémoire.

Il s'agit d'une source ouverte et gratuite que vous pouvez télécharger Swift Mailer et télécharger sur votre serveur. (La liste des fonctionnalités est copiée à partir du site Web du propriétaire).

L'exemple de travail de Gmail SSL / SMTP et Swift Mailer est ici ...

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}

J'espère que ça aide. Bon codage ... :)


1
Cela ne fonctionne plus, je reçois toujours le message de retour "535-5.7.8 Nom d'utilisateur et mot de passe non acceptés". Mes informations d'identification sont correctes et j'ai défini "Autoriser les applications moins sécurisées" sur ON. Quelqu'un connaît une solution à cela?
AndrewB

Swift ne semble pas fonctionner en PHP 5.x - ne comprend pas le ?? fusionner - explose juste.
HerrimanCoder

28
<?php
date_default_timezone_set('America/Toronto');

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = "gdssdh";
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
//$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
$mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port       = 465;                   // set the SMTP port for the GMAIL server
$mail->Username   = "user@gmail.com";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('contact@prsps.in', 'PRSPS');

//$mail->AddReplyTo("user2@gmail.com', 'First Last");

$mail->Subject    = "PRSPS password";

//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "user2@yahoo.co.in";
$mail->AddAddress($address, "user2");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

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

?>

Pourquoi définissez-vous l'hôte deux fois et lequel est le bon?
Emile Bergeron

Où puis-je obtenir le fichier class.phpmailer.php ?? Coller du code uniquement n'est pas si utile, veuillez inclure plus de description sur le code!
GeneCode

Bien qu'une partie de la syntaxe soit obsolète, PHPMailer a fini par être la meilleure solution pour moi, +1
zoltar

20

SwiftMailer peut envoyer des e-mails à l'aide de serveurs externes.

voici un exemple qui montre comment utiliser un serveur Gmail:

require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

//Connect to localhost on port 25
$swift =& new Swift(new Swift_Connection_SMTP("localhost"));


//Connect to an IP address on a non-standard port
$swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));


//Connect to Gmail (PHP5)
$swift = new Swift(new Swift_Connection_SMTP(
    "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));

14

Le code tel qu'indiqué dans la question nécessite deux modifications

$host = "ssl://smtp.gmail.com";
$port = "465";

Le port 465 est requis pour une connexion SSL.


6

Envoyer du courrier à l'aide de la bibliothèque phpMailer via Gmail Veuillez télécharger les fichiers de la bibliothèque depuis Github

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');
require '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

5

J'ai aussi eu ce problème. J'ai défini les paramètres corrects et activé des applications moins sécurisées, mais cela n'a toujours pas fonctionné. Enfin, j'ai activé ce https://accounts.google.com/UnlockCaptcha , et cela a fonctionné pour moi. J'espère que ça aidera quelqu'un.



4

Pour installer Mail.php de PEAR dans Ubuntu, exécutez l'ensemble de commandes suivant:

    sudo apt-get install php-pear
    sudo pear install mail
    sudo pear install Net_SMTP
    sudo pear install Auth_SASL
    sudo pear install mail_mime

0

J'ai une solution pour les comptes GSuite qui n'a pas le suffixe "@ gmail.com". Je pense également que cela fonctionnera pour les comptes GSuite avec @ gmail.com, mais je ne l'ai pas essayé. Vous devez d'abord avoir les privilèges de modifier l'option "allos¿w less secure app" pour votre compte GSuite. Si vous avez les privilèges (vous pouvez vérifier dans les paramètres du compte-> sécurité), vous devez désactiver "l'authentification à deux étapes" aller à la fin de la page et définir "oui" pour autoriser les applications moins sécurisées. C'est tout. Si vous n'avez pas les privilèges pour modifier ces options, la solution pour ce fil ne fonctionnera pas. Consultez https://support.google.com/a/answer/6260879?hl=en pour apporter des modifications à l'option "autoriser moins ...".


0

J'ai essayé la suggestion proposée par @shasi kanth, mais cela n'a pas fonctionné. J'ai lu la documentation et peu de modifications ont été apportées. J'ai donc réussi à envoyer du courrier via Gmail à l'aide de ce code, où le fournisseur / autoload.php est obtenu par le compositeur avec le compositeur requiert "swiftmailer / swiftmailer: ^ 6.0":

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>

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.