Envoi d'e-mails avec PHP depuis un serveur SMTP

132
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

J'ai du mal à envoyer des e-mails en PHP. Je reçois une erreur: SMTP server response: 530 SMTP authentication is required.

J'avais l'impression que vous pouvez envoyer des e-mails sans SMTP pour vérifier. Je sais que ce courrier sera probablement filtré, mais cela n'a pas d'importance pour le moment.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

C'est la configuration dans le php.inifichier. Comment dois-je configurer SMTP? Existe-t-il des serveurs SMTP qui ne nécessitent aucune vérification ou dois-je configurer un serveur moi-même?

Borut Flis
la source

Réponses:

169

Lorsque vous envoyez un e-mail via un serveur qui nécessite l'authentification SMTP, vous devez vraiment le spécifier et définir l'hôte, le nom d'utilisateur et le mot de passe (et peut-être le port s'il n'est pas celui par défaut - 25).

Par exemple, j'utilise généralement PHPMailer avec des paramètres similaires à ceux-ci:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$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';

$mail->send();

Vous pouvez en savoir plus sur PHPMailer ici: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
la source
21
+1 pour phpMailer - c'est l'alternative des personnes sensées à la mail()fonction intégrée de PHP .
SDC
8
Il convient de noter pour ceux qui trébuchent sur cette réponse que PHPMailer est également intégré à WordPress et peut être configuré à l'aide du 'phpmailer_init'crochet d'action. C'est un moyen pratique de configurer WordPress pour le courrier SMTP ou Amazon SES (qui prend en charge les connexions SMTP).
Matt van Andel
1
PHP Mailer est-il autorisé à être utilisé dans des scripts payants?
Luka
2
@Luka Oui, ça l'est. Selon leur fichier de licence, PHPMailer utilise la licence LGPL 2.1, qui permet une utilisation commerciale.
Alejandro le
Dois-je faire quelque chose de spécial pour utiliser ce code? Où dois-je mettre ça? Puis-je l'appeler avec un formulaire HTML5 avec une requête POST? Comment envoyer un e-mail une fois que j'ai créé cet objet PHPMailer?
Aaron Franke
53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

ou, pour plus de détails, lisez la suite .

Dipesh Parmar
la source
L'adresse IP que vous utilisez pour envoyer des e-mails n'est pas autorisée à 550-5.7.1 envoyer des e-mails directement à nos serveurs. J'obtiens cette erreur. tout ce que je veux, c'est un relais de messagerie ouvert.
Borut Flis
Je n'ai pas d'adresse IP statique. Connaissez-vous un relais de messagerie ouvert.
Borut Flis
1
Consultez également support.google.com/a/answer/176600?hl=fr pour les relais SMTP google.
fyrye
5
C'est la meilleure réponse aux php mail()problèmes de fonction godaddy - 2017 - ne devrait pas avoir à télécharger PHPMailer ou une autre ressource tierce - merci
soulshined
4
Le lien "LIRE SUR" est rompu
vladkras
46

Pour les utilisateurs d'Unix, mail () utilise en fait la commande Sendmail pour envoyer des e-mails. Au lieu de modifier l'application, vous pouvez modifier l'environnement. msmtp est un client SMTP avec une syntaxe CLI compatible Sendmail, ce qui signifie qu'il peut être utilisé à la place de Sendmail. Cela ne nécessite qu'une petite modification de votre php.ini.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Alors même la fonction modeste mail () peut fonctionner avec la qualité SMTP. C'est très utile si vous essayez de connecter une application existante à des services de messagerie comme sendgrid ou mandrill sans modifier l'application.

txyoji
la source
1
Excellente solution, utilisez-la sur plusieurs serveurs maintenant!
raice
3
Implémenter cela sur mes conteneurs Docker pour les applications qui n'utilisent pas de bibliothèque de diffusion.
Batandwa
Excellent chemin de migration de vanilla mail()à quelque chose qui prend en charge SMTP. Je vous remercie!
rinogo
MSMTP est également disponible pour Windows. Les téléchargements évidents ont la version 1.4. La version que j'ai trouvée quelque part est la 1.6.2. Je ne sais pas s'il existe un 1.8.6 pour Windows.
Bilbo
L'auteur a cessé de fournir des binaires Windows avant février 2016.
Bilbo
17

Le problème est que la mail()fonction PHP a une fonctionnalité très limitée. Il existe plusieurs façons d'envoyer du courrier depuis PHP.

  1. mail()utilise le serveur SMTP sur votre système. Il existe au moins deux serveurs que vous pouvez utiliser sous Windows: hMailServer et xmail . J'ai passé plusieurs heures à les configurer et à les monter. Le premier est plus simple à mon avis. À l'heure actuelle, hMailServer fonctionne sur Windows 7 x64.
  2. mail()utilise le serveur SMTP sur une machine distante ou virtuelle avec Linux. Bien sûr, un vrai service de messagerie comme Gmail ne permet pas de connexion directe sans informations d'identification ni clés. Vous pouvez configurer une machine virtuelle ou en utiliser une située sur votre réseau local. La plupart des distributions Linux ont un serveur de messagerie prêt à l'emploi. Configurez-le et amusez-vous. J'utilise par défaut exim4 sur Debian 7 qui écoute son interface LAN.
  3. Les bibliothèques de diffusion utilisent des connexions directes. Les librairies sont plus faciles à mettre en place. J'ai utilisé SwiftMailer et il envoie parfaitement le courrier du compte Gmail. Je pense que PHPMailer est assez bon aussi.

Quel que soit votre choix, je vous recommande d'utiliser une couche d'abstraction. Vous pouvez utiliser la bibliothèque PHP sur votre machine de développement exécutant Windows et simplement mail()fonctionner sur une machine de production avec Linux. La couche d'abstraction vous permet d'échanger les pilotes de messagerie en fonction du système sur lequel votre application s'exécute. Créez une MyMailerclasse abstraite ou une interface avec une send()méthode abstraite . Hérite de deux classes MyPhpMaileret MySwiftMailer. Mettre send()en œuvre la méthode de manière appropriée.

George Sovetov
la source
17

Voici un moyen de le faire avec PHP PEAR

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

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

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

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]', //your gmail account
        'password' => 'snip' // your password
    ));

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

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

Si vous utilisez Gmail SMTP, n'oubliez pas d'activer SMTP dans votre compte Gmail, sous Paramètres

EDIT: Si vous ne trouvez pas Mail.php sur debian / ubuntu, vous pouvez installer php-pear avec

sudo apt install php-pear

Ensuite, installez l'extension de messagerie:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Ensuite, vous devriez pouvoir le charger simplement require_once "Mail.php" sinon il se trouve ici:/usr/share/php/Mail.php

Bolli
la source
1
require_once ('/usr/share/somewhere/Mail.php');
10

Certains serveurs SMTP fonctionnent sans authentification, mais si le serveur nécessite une authentification, il n'y a aucun moyen de contourner cela.

Les fonctions de messagerie intégrées de PHP sont très limitées - la spécification du serveur SMTP n'est possible que dans WIndows. Sur * nix, mail()utilisera les binaires du système d'exploitation.

Si vous souhaitez envoyer un e-mail à un serveur SMTP arbitraire sur le net, envisagez d'utiliser une bibliothèque comme SwiftMailer . Cela vous permettra d'utiliser, par exemple, les serveurs sortants de Google Mail.

Pekka
la source
2

Dans les cas où vous hébergez un site Wordpress sous Linux et avez accès au serveur, vous pouvez éviter quelques maux de tête en installant msmtp qui vous permet d'envoyer via smtp à partir de la fonction standard de php mail (). msmtp est une alternative plus simple à postfix qui nécessite un peu plus de configuration.

Voici les étapes:

Installez msmtp

sudo apt-get install msmtp-mta ca-certificates

Créez un nouveau fichier de configuration:

sudo nano /etc/msmtprc

... avec les informations de configuration suivantes:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Vous devez remplacer les données de configuration représentées par tout ce qui se trouve entre "<" et ">" (inclus, supprimez-les). Pour l'hôte / nom d'utilisateur / mot de passe, utilisez vos informations d'identification normales pour envoyer des e-mails via votre fournisseur de messagerie.

Dites à PHP de l'utiliser

sudo nano /etc/php5/apache2/php.ini

Ajoutez cette seule ligne:

sendmail_path = /usr/bin/msmtp -t

La documentation complète peut être trouvée ici:

https://marlam.de/msmtp/

Peter Drinnan
la source
ssmtp est aussi une solution voir (guide français): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ
0

Pour une autre approche, vous pouvez prendre un fichier comme celui-ci:

From: Sunday <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day

Tuesday Wednesday

et envoyez comme ceci:

<?php
$a1 = ['[email protected]'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

https://php.net/function.curl-setopt

Steven Penny
la source