web-dev-qa-db-fra.com

La configuration SMTP ne fonctionne pas en production

J'essaie d'envoyer un courrier électronique lorsqu'un formulaire est soumis. J'utilise PHPMailer pour envoyer le courrier en utilisant la configuration ci-dessous.

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'mail.example.in'; 
$mail->Port = 25; 
$mail->SMTPAuth = true;
$mail->Username = '[email protected]'; 
$mail->Password = 'password'; 

$mail->setFrom("[email protected]" , "User");
$mail->addAddress('[email protected]', 'Receiver');
$mail->addBCC('[email protected]', 'Another user');
$mail->AddReplyTo('[email protected]', 'User');

$mail->isHTML(true);

$mail->Subject = $subject;
$mail->Body    = $message;
if($mail->send())
    echo "Your request has been received. We will soon contact you.";
else echo "Unable to send your request. Please try again";

Cela fonctionne très bien dans localhost. Mais, lorsque je le déploie sur mon serveur (exemple.in), je reçois l’exception ci-dessous.

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

--MODIFIER--

J'ai essayé de me connecter au serveur SMTP à l'aide de la commande telnet, mais je ne peux pas ajouter le destinataire. Je reçois l'erreur ci-dessous?

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
Escape character is '^]'.
220 fbs-ho-mailserver.example.in ESMTP Service (Lotus Domino Release 8.5.3FP3) ready at Fri, 16 Sep 2016 11:36:01 +0530
HELO example.in
250 fbs-ho-mailserver.example.in Hello example.in ([111.91.127.222]), pleased to meet you
MAIL from: [email protected]
250 [email protected]... Sender OK
RCPT to: [email protected]
554 Relay rejected for policy reasons.

-- MODIFIER --

J'ai pu configurer ce compte dans Outlook. Je suis vraiment confus ce qui se passe.

 enter image description here

21
Aakash

Votre erreur dit:

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

Alors regardons https://github.com/PHPMailer/PHPMailer/wiki/Dépannage :

"Erreur SMTP: Impossible de se connecter à l'hôte SMTP."

Cela peut également apparaître en tant qu'échec de la connexion SMTP () ou de Called Mail () sans être connecté en sortie de débogage. Ceci est souvent rapporté en tant que PHPMailer problème, mais il est presque toujours dû à l'échec DNS local, pare-feu blocage (par exemple, comme le fait GoDaddy) ou un autre problème lié à votre .__ local. réseau. Cela signifie que PHPMailer ne peut pas contacter le serveur SMTP vous avez spécifié dans la propriété Host, mais ne dites pas exactement pourquoi . Cela peut également être dû au fait que l’extension openssl n’a pas été chargée (voir les notes de chiffrement .__ ci-dessous).

Quelques techniques pour diagnostiquer la source de cette erreur sont discutées au dessous de. 

Allez papa

Le célèbre hébergeur américain GoDaddy impose des contraintes très strictes (au point de devenir presque inutiles) pour l'envoi d'e-mails. Ils bloquent SMTP sortant vers les ports 25, 465 et 587 vers tous les serveurs sauf leur posséder. Ce problème fait l’objet de nombreuses questions frustrantes sur Débordement de pile. Si vous trouvez que votre script fonctionne sur votre ordinateur local, mais pas lorsque vous le téléchargerez sur GoDaddy, ce sera ce qui se passe à toi. La solution est extrêmement mal documentée par GoDaddy: vous doivent envoyer par leurs serveurs, et aussi désactiver toute la sécurité fonctionnalités, nom d'utilisateur et mot de passe (génial, hein ?!), vous donnant cette config pour PHPMailer:

$mail->isSMTP();
$mail->Host = 'relay-hosting.secureserver.net';
$mail->Port = 25;
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;

GoDaddy refuse également d’envoyer avec une adresse De appartenant à n’importe quel aol, gmail, yahoo, hotmail, live, aim ou domaine msn (voir leur documentation). Ce En effet, tous ces domaines déploient des fonctions anti-falsification SPF et DKIM mesures, et simuler votre adresse de retour est un faux.

Vous trouverez peut-être plus facile de passer à un hébergement plus éclairé fournisseur.

3
LSerni

Le problème - plutôt les deux problèmes non liés - que vous rencontrez est assez simple:

ERREUR SMTP: La connexion au serveur a échoué: la connexion a expiré (110) SMTP connect () a échoué.

et vous avez vérifié que le serveur accepte bien les connexions:

J'ai essayé de me connecter au serveur SMTP avec la commande telnet

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.

Votre script ne peut pas se connecter au serveur SMTP lorsqu'il est exécuté à partir de son serveur de production.

La cause probable est que le serveur de production dispose d'un pare-feu qui, pour éviter les abus, empêche toute connexion avec l'extérieur. Le serveur peut servir _ requêtes Web, mais pas plus.

Si votre test avait vérifié que port 25 ne répondait pas, vous auriez pu essayer plutôt (après avoir vérifié que l'adresse de l'hôte était correcte) telnet mail.example.in 587. Si cela fonctionnait, cela pourrait signifier que le serveur n'accepte pas les connexions non sécurisées (port 25) mais accepte les connexions sécurisées. Avec PHPMailer, vous auriez alors pu essayer activer la connexion sécurisée :

$mail->SMTPSecure = 'tls';

ou

$mail->SMTPSecure = 'ssl';

Si cela ne fonctionne pas, vous pouvez toujours avoir un problème de pare-feu; ou vous devrez peut-être consulter phpinfo() et vérifier que le support OpenSSL est disponible en PHP.

Qu'as tu besoin de faire

  • demander aux informaticiens chargés de la maintenance du serveur de production d'ouvrir le pare-feu;
  • plus prometteur, demandez-leur comment envoyer des courriels à partir de ce serveur. Il est fort probable que vous deviez utiliser la fonction mail() ou utiliser localhost ou 127.0.0.1 en tant que serveur SMTP. Ensuite, les e-mails seront envoyés via le réseau de service de votre serveur de production.

Ils pourraient vous dire que le port 25 n'est pas autorisé, mais que le port 465 ou 567 serait autorisé. Vous devrez mettre à jour votre configuration et/ou ajouter TLS/SSL en conséquence (voir ci-dessus).

  • ou vous pourriez être autorisé à vous connecter à un serveur SMTP tiers, auquel vous devrez fournir l'adresse IP, pour permettre aux responsables informatiques d'ouvrir une fenêtre de pare-feu appropriée. Ensuite, les e-mails seront envoyés via le serveur tiers.

Le deuxième problème (peut-être PAS un problème)

250 [email protected] ... Expéditeur OK RCPT à: [email protected] Relais 554 rejeté pour des raisons politiques

De plus, pour éviter les abus, les serveurs SMTP ne permettront pas à tout le monde de se connecter et d’envoyer des courriels, mais uniquement à leurs propres clients. Je vois que dans la configuration de PHPMailer, vous avez spécifié un utilisateur et un mot de passe. Dans la session telnet, vous ne l'avez pas fait. Donc, il est fort possible que PHPmailer puisse envoyer, mais pas se connecter, alors que votre telnet peut se connecter, mais pas envoyer.

Une fois que vous aurez résolu le problème de connexion, votre problème d’authentification sera résolu ou aura disparu (car vous utiliserez un serveur différent fourni par les responsables informatiques, par exemple localhost).

Le troisième problème (peut ne jamais se poser)

Une troisième façon d’abuser des services consiste à utiliser utilisation excessive _ - envoyer trop de courriels à trop de gens. Vérifiez auprès des informaticiens quelles sont les règles acceptables pour l'envoi de courriers électroniques.

Problèmes, problèmes

Les autres points à examiner sont la crédibilité} de la source (vous pouvez envoyer des courriels au nom d'un domaine qui n'a pas désigné votre serveur SMTP de choix comme expéditeur autorisé) et la confidentialité des données (même avec des connexions TLS/SSL, si vous utilisez localhost en tant que serveur SMTP, vos responsables informatiques disposeront d'un accès complet, sans entrave et indétectable à tous les courriels que vous leur envoyez. cette).

2
LSerni

C’est une mauvaise idée d’utiliser votre propre SMTP . Selon ce que vous devez faire, vous avez de grandes chances de voir vos courriels bloqués d’une certaine manière ou marqués comme spam. Et vous devrez passer du temps à garder votre serveur à jour.

Utilisez des services en ligne figurant sur la liste blanche de chaque fournisseur et exposant l'API pour envoyer vos e-mails transactionnels: https://www.mailjet.com/http://mailchimp.com/ ...

Ils proposent souvent un compte gratuit pour un petit volume (moins de 2000 courriels par jour) . L’utilisation de l’API est assez simple et peut être mise en place en quelques minutes (ex: https://dev.mailjet.com/ )

1
ArGh

Je pense qu'en quelques étapes, nous pouvons faire en sorte que cela fonctionne correctement.

  1. Dans votre compte Godaddy/Hostgator Cpanel> Sélectionnez les enregistrements MX> Sélectionnez le domaine en question> Sélectionnez "Echangeur de courrier distant "

    Vous pouvez tester la livraison du courrier à ce moment, le problème peut être résolu.

  2. Je suis sûr que tout est en place, mais croyez-moi en ce qui concerne les bons vieux Cpanel, PhpMailer et Godaddy/Hostgator. C'est un endroit où le sens commun n'a aucun sens.

remplace:

$mail->Host = 'mail.example.in';

avec:

$mail->Host = 'localhost';

Je crois que cela devrait résoudre tous les problèmes en supposant que des éléments tels que les informations d'identification de connexion sont valides.

1
norcal johnny

Demandez à votre fournisseur d'hébergement si smtp est activé sur pas sur ce serveur.J'ai eu le même problème avant pour smtp et curl les deux.Contact fournisseur d'hébergement.

1
Akash Ganatra

1ère citation (de la communauté ibm):

[email protected] était membre d'un groupe (Rejeter) répertorié dans Le champ "Refuser les messages destinés aux adresses Internet Internet suivantes" de gmail.com (dans la configuration Domino du serveur de destination du routeur, du document, des restrictions et des contrôles, du SMTP entrant. ).

Suppression du nom hiérarchique de Mary (Mary Jones/ABC) des membres liste dans le document Rejeter (groupe) permet à Marie de recevoir des messages à partir d'Internet.

2ème citation:

La plupart des serveurs de messagerie, pour empêcher leur utilisation en tant que spam anonyme relais, sont configurés uniquement pour relayer le courrier de certains hôtes.

1
T.Todua

Quelle est la version de phpmailer?

Vous pourriez oublier d'ajouter cette ligne

  $mail->IsSMTP(); //  use SMTP

après avoir lancé $ mail.

Essaye.

1
HongZhen Liu

Vous avez donc un serveur GoDaddy et vous souhaitez envoyer un courrier électronique via votre relais SMTP récemment acquis. Eh bien "vous ne pouvez pas" est probablement ce que vous allez trouver si vous fouillez Google.

Si vous fouillez un peu plus, vous constaterez probablement que la solution officielle de GoDaddy est d’utiliser son relais de messagerie interne. Ce n’est pas idéal, à cause des barrières arbitraires qu’ils ont établies, comme celle-ci:

Nos serveurs dédiés ont une limite d'emails sortants de 1000 par jour. Si vous devez envoyer plus de 1000 courriels par jour, veuillez appeler le client Supportez ou ouvrez un ticket de support pour demander une limite supérieure.

Solution rapide et efficace: Obtenez un relais SMTP qui prend en charge l'envoi d'e-mails à l'aide d'une API HTTP.

Ma suggestion: (Une solution simple et efficace, que j'utilise personnellement)

Inscrivez-vous pour un compte dans Sendgrid . _ {Sendgrid fournit 12 000 emails gratuits par mois, et je pense que cela devrait suffire à tous les besoins de base.} _

Première étape: Sendgrid vous demandera d’ajouter quelques enregistrements DNS pour vous authentifier lors de l’envoi d’e-mails au nom de cet hôte. Alors faites-le.

Deuxième étape Étape: Configurez White Lables https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html (Ce n'est pas important, mais cela donnera un aspect professionnel aux emails envoient)

Troisième étape: Générer des clés API

Vous pouvez gérer vos clés d'API à partir du portail client SendGrid. De plus, vous pouvez gérer vos clés d'API via l'API elle-même .

Forth Step: Allez-y et écrivez nos codes.

Envoyer des mails en utilisant PHP sur sendgrid en utilisant cette bibliothèque disponible sur github est simple:

// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php';
$sendgrid = new SendGrid("SENDGRID_APIKEY");
$email    = new SendGrid\Email();

$email->addTo("[email protected]")
      ->setFrom("[email protected]")
      ->setSubject("Sending with SendGrid is Fun")
      ->setHtml("and easy to do anywhere, even with PHP");

$sendgrid->send($email);

Comment ça marche

GoDaddy bloque les ports 25, 2525, 587 et 485, qui sont des ports idéaux pour SMTP. Nous utilisons donc le port 80/443 et demandons à l'API de sengrid d'envoyer l'e-mail en notre nom en utilisant le port 80, et oui, nous avons dupé GoDaddy. 

1
Sibidharan

Vous devez changer certains paramètres dans votre php.ini:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds.

Si votre PHP.ini dépend de votre environnement, plus d’informations: référence

OU

Placez-le en haut de votre script PHP et laissez votre script en vrac.

ini_set('max_execution_time', 600); //600 seconds = 10 minutes or set your time
0
Dave

Je vois ce que tu veux dire. Le même problème se produit avec moi, je viens d'ajouter une ligne et cela fonctionne pour moi. veuillez utiliser , 

$mail->SMTPSecure = 'ssl';

et configurez vos paramètres en fonction de ssl. Vérifiez également correctement la configuration du courrier chez votre serveur.

0
Vijju Pundir

Une erreur de dépassement de délai est typique des paquets rejetés; il peut donc s'agir de problèmes de pare-feu entre le serveur Web et le serveur SMTP. Si vous avez un accès SSH à votre serveur, vous pouvez essayer de vous connecter à smtp en utilisant:

telnet <smtp server> 25

En cas d'erreur de dépassement de délai, même avec telnet, vous êtes presque certain que le problème concerne le réseau/le pare-feu.

0
Edo