web-dev-qa-db-fra.com

Envoi d'email avec PHP depuis un serveur SMTP

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

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

J'avais l'impression que vous pouvez envoyer un email sans vérifier le protocole SMTP. 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 = [email protected]

Ceci est la configuration dans le fichier php.ini. 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?

108
Borut Flis

Lorsque vous envoyez un courrier électronique via un serveur nécessitant une authentification SMTP, vous devez 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 ne s'agit pas du port par défaut - 25).

Par exemple, j'utilise habituellement PHPMailer avec des paramètres similaires à ceux-ci:

$mail = new PHPMailer();
$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

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

150
Ivo Pereira

Pour les utilisateurs Unix, mail () utilise actuellement Sendmail command pour envoyer un courrier électronique. Au lieu de modifier l'application, vous pouvez modifier l'environnement. msmtp est un client SMTP avec une syntaxe CLI compatible avec Sendmail, ce qui signifie qu'il peut être utilisé à la place de Sendmail. Cela nécessite seulement un petit changement dans votre php.ini.

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

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

41
txyoji
<?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....<BR/>";
?>

OU

CONTINUER À LIRE

38
Dipesh Parmar

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 

13
Bolli

Le problème est que la fonction PHP mail() a une fonctionnalité très limitée. Il existe plusieurs façons d’envoyer des messages à partir de 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 lever. 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 virtuelle ou distante avec Linux. Bien sûr, un service de messagerie réel tel que Gmail n'autorise pas les connexions directes sans identifiants 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 mailing utilisent des connexions directes. Les bibliothèques sont plus faciles à configurer. J'ai utilisé SwiftMailer et il envoie parfaitement des messages à partir d'un compte Gmail. Je pense que PHPMailer est très 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 la fonction mail() sur une machine de production avec Linux. La couche d'abstraction vous permet d'échanger des pilotes de messagerie en fonction du système sur lequel votre application est exécutée. Créez une classe ou une interface MyMailer abstraite avec la méthode abstraite send(). Hériter de deux classes MyPhpMailer et MySwiftMailer. Implémentez la méthode send() de manière appropriée.

12
George Sovetov

Certains serveurs SMTP fonctionnent sans authentification, mais si le serveur requiert une authentification, il n’ya aucun moyen de le contourner. 

Les fonctions de messagerie intégrées de PHP sont très limitées: il est uniquement possible de spécifier le serveur SMTP dans Windows. Sur * nix, mail() utilisera les fichiers binaires du système d'exploitation.

Si vous souhaitez envoyer un courrier électronique à un serveur SMTP arbitraire sur le réseau, envisagez d'utiliser une bibliothèque telle que SwiftMailer . Cela vous permettra d'utiliser, par exemple, les serveurs sortants de Google Mail. 

10
Pekka 웃

Si vous hébergez un site Wordpress sous Linux et que vous avez un accès au serveur, vous pouvez éviter quelques problèmes en installant msmtp, qui vous permet d'envoyer via smtp à partir de la fonction php mail () standard. msmtp est une alternative plus simple à postfix qui nécessite un peu plus de configuration. 

Voici les étapes:

Installer 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 <[email protected]>
password <password>
from <[email protected]>
syslog LOG_MAIL

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

Dites à PHP de l'utiliser

Sudo nano /etc/php5/Apache2/php.ini

Ajouter cette seule ligne:

sendmail_path = /usr/bin/msmtp -t

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

https://marlam.de/msmtp/

0
Peter Drinnan