Configurazione SMTP non funzionante in produzione

Sto tentando di submit un'email quando viene inviato un module. Sto usando PHPMailer per submit la posta usando la configuration qui sotto.

$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"; 

Funziona bene in localhost. Ma quando lo distribuisco sul mio server (esempio.in) ottengo l'exception qui sotto.

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

–MODIFICARE–

Ho provato a connettermi al server SMTP usando il command telnet, ma non riesco ad aggiungere il destinatario. Ottengo l'errore qui sotto?

 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. 

— MODIFICARE —

Sono stato in grado di configurare questo account in Outlook. Sono davvero confuso su quello che sta succedendo.

inserisci la descrizione dell'immagine qui

Il tuo errore dice:

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

Diamo un'occhiata a https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting :

"Errore SMTP: imansible connettersi all'host SMTP."

Questo potrebbe anche apparire come SMTP connect () non riuscito o Called Mail () senza essere collegato in output di debug. Questo è spesso segnalato come un problema di PHPMailer, ma è quasi sempre dovuto a problemi di DNS locale, block del firewall (ad esempio, come fa GoDaddy) o altri problemi sulla networking locale. Significa che PHPMailer non è in grado di contattare il server SMTP che hai specificato nella properties; Host, ma non dice esattamente perché. Può anche essere causato dal fatto che non è stata caricata l'estensione openssl (vedere le note sulla crittografia di seguito).

Alcune tecniche per diagnosticare la fonte di questo errore sono discusse di seguito.

Vai papà

Il popolare provider di hosting statunitense GoDaddy impone vincoli molto severi (al punto da diventare quasi inutili) sull'invio di e-mail. Bloccano l'SMTP in output verso le porte 25, 465 e 587 su tutti i server tranne il proprio. Questo problema è object di molte domande frustranti su Stack Overflow. Se trovi che il tuo script funziona sul tuo computer locale, ma non quando lo carichi su GoDaddy, questo sarà ciò che ti sta succedendo. La soluzione è estremamente scarsamente documentata da GoDaddy: devi submit attraverso i loro server, e anche disabilitare tutte le funzionalità di sicurezza, nome utente e password (ottimo, eh ?!), dandoti questa configuration per PHPMailer:

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

GoDaddy si rifiuta inoltre di submit con un indirizzo Da appartenente a qualsiasi dominio aol, gmail, yahoo, hotmail, live, aim o msn (consultare i relativi documenti). Questo perché tutti quei domini implementano misure anti-contraffazione SPF e DKIM e falsificare il tuo da indirizzo è falso.

Potresti trovare più semplice passare a un provider di hosting più illuminato.

Il problema – piuttosto i due problemi non collegati – che stai vivendo sono abbastanza semplici:

ERRORE SMTP: Imansible connettersi al server: Connessione scaduta (110) SMTP connect () non rioutput.

e hai verificato che il server stia effettivamente accettando le connessioni:

Ho provato a collegarmi al server SMTP usando il command 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. 

Lo script non può connettersi al server SMTP quando viene eseguito dal proprio server di produzione .

La causa probabile è che il server di produzione ha un firewall che, per evitare abusi, impedisce qualsiasi connessione verso l'esterno . Il server può servire richieste Web, ma non di più.

Se il test ha verificato che la port 25 non rispondeva , allora (dopo aver controllato che l'indirizzo dell'host era corretto) avresti potuto provare invece telnet mail.example.in 587 . Se funzionasse, avrebbe potuto significare che il server non accetta connessioni non sicure (port 25) ma accetta connessioni sicure. Con PHPMailer potresti provare ad triggersre la connessione sicura :

 $mail->SMTPSecure = 'tls'; 

o

 $mail->SMTPSecure = 'ssl'; 

Se ciò non funziona, potresti ancora avere un problema con il firewall; oppure potresti wherer consultare phpinfo() e verificare che il supporto OpenSSL sia disponibile in PHP.

Cosa devi fare

  • chiedere al personale IT che gestisce il server di produzione di aprire il firewall;
  • più promettente, chiedi loro come submit email da quel server. È probabile che sia necessario utilizzare la function mail() o utilizzare localhost o 127.0.0.1 come server SMTP. Quindi le e-mail usciranno attraverso la networking di servizio del server di produzione.

Potrebbero dirti che la port 25 non è consentita, ma la port (per esempio) 465 o 567 sarebbe consentita. Dovrai aggiornare la tua configuration e / o aggiungere TLS / SSL di conseguenza (vedi sopra).

  • oppure potresti essere autorizzato a collegarti a un server SMTP di terze parti di cui dovrai fornire l'indirizzo IP, per consentire ai responsabili IT di aprire una window firewall adatta. Quindi le e-mail usciranno attraverso il server di terze parti.

Il secondo problema (probabilmente NON è un problema)

250 [email protected] … Mittente OK RCPT a: [email protected] 554 Relay respinto per motivi di politica

Inoltre, per evitare abusi, i server SMTP non consentono a tutti di connettersi e submit e-mail, ma solo ai propri clienti. Vedo che nella configuration di PHPMailer hai specificato un utente e una password. Nella session telnet non l'hai fatto. Quindi potrebbe benissimo essere che PHPmailer potesse submit, ma non connettersi, mentre il tuo telnet può connettersi, ma non submit.

Una volta risolto il problema di connessione, il problema di authentication verrà risolto o scomparirà (poiché verrà utilizzato un server diverso fornito dai tecnici IT, ad esempio localhost ).

Il terzo problema (potrebbe non sorgere mai)

Un terzo modo di abusare dei servizi è l'uso eccessivo: l'invio di troppe e-mail a troppe persone. Verificare con i ragazzi IT quali sono le politiche accettabili per l'invio di e-mail.

Problemi, problemi

Altre cose da considerare sono la credibilità della fonte (potresti voler submit e-mail per conto di un dominio che non ha designato il tuo server SMTP preferito come mittente consentito) e la riservatezza dei dati (anche con le connessioni TLS / SSL , se ti viene dato localhost come server SMTP, i tuoi IT avranno un accesso completo, illimitato e non rilevabile a qualsiasi email che invii. Potresti, o potresti non esserlo, essere d'accordo con questo).

1a citazione (dalla comunità di ibm):

[email protected] era un membro di un gruppo (Rifiuta) elencato nel field "Nega messaggi destinati ai seguenti indirizzi Internet" di Gmail.com (nel router / SMTP, Limitazioni e controlli del documento di configuration Domino del server di destinazione, Sezione "Controlli del destinatario previsto in entrata" della scheda SMTP di controllo in entrata).

La rimozione del nome gerarchico di Mary (Mary Jones / ABC) dall'elenco dei membri nel documento Rifiuta (gruppo) consente a Maria di ricevere messaggi da Internet.

2a citazione:

La maggior parte dei server di posta, per impedire che vengano utilizzati come relè di spam anonimi, sono configurati solo per inoltrare la posta da determinati host.

È una ctriggers idea usare il tuo SMTP. A seconda di cosa hai a che fare con esso, hai alcune grandi possibilità di avere le tue e-mail bloccate in qualche modo o contrassegnate come SPAM. E dovrai trascorrere alcune volte per mantenere aggiornato il tuo server.

Utilizza i servizi online elencati in white list per each provider e che espongono l'API per submit i tuoi messaggi transazionali: https://www.mailjet.com/ http://mailchimp.com/

Spesso propongono un account gratuito per piccoli volumi (less di 2000 e-mail al giorno). L'utilizzo dell'API è piuttosto banale e può essere implementato in pochi minuti (ad esempio: https://dev.mailjet.com/ )

Chiedi al tuo provider di hosting se smtp è abilitato su non su quel server. Ho avuto lo stesso problema prima per smtp e curl entrambi.Contatto fornitore di hosting.

Qual è la versione di phpmailer?

Potresti dimenticare di aggiungere questa linea

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

dopo aver avviato $ mail.

Provare.

Quindi hai un server GoDaddy e vuoi submit e-mail tramite il relay SMTP appena acquisito. Beh, "non puoi" è probabilmente quello che troverai se fai qualche ricerca su Google.

Se ti soffermi un po 'di più, probabilmente troverai che la soluzione ufficiale di GoDaddy è usare il loro relay di posta interno. Questo non è l'ideale, a causa delle barriere arbitrarie che hanno impostato, come questo:

I nostri server dedicati hanno un limite di posta elettronica in output di 1000 al giorno. Se è necessario submit più di 1000 e-mail al giorno, call l'assistenza clienti o aprire un ticket di assistenza per richiedere un limite superiore.

Soluzione rapida e funzionante: ottieni SMTP Relay che support l'invio di e-mail utilizzando l'API HTTP.

Il mio consiglio: (Una soluzione di lavoro semplice ed efficace, che sto usando personalmente)

Registrati per un account in Sendgrid . Sendgrid fornisce e-mail gratuite di 12k al mese, e penso che dovrebbe essere sufficiente per qualsiasi necessità di base.

Primo passo: Sendgrid ti chiederà di aggiungere alcuni record DNS per autenticarti per l'invio di e-mail per conto di quell'host. Allora fallo.

Seconda fase Passo: Configura White Lables https://sendgrid.com/docs/User_Guide/Settings/Whicanvasbel/index.html (Questo non è importnte, ma darà un aspetto professionale alle e-mail che stai inviando)

Terza fase: generare le chiavi API

È ansible gestire le chiavi API dal portle dei clienti SendGrid. Inoltre, puoi gestire le tue chiavi API tramite l'API stessa .

Quarto: vai avanti e scrivi i nostri codici.

L'invio di mail usando PHP su sendgrid usando questa libreria disponibile su github è facile:

 // 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); 

Come funziona

GoDaddy blocca le porte 25, 2525, 587 e 485 che sono le porte ideali per SMTP. Quindi stiamo usando la port 80/443 e richiedendo l'API di sengrid per submit l'e-mail per conto nostro usando la port 80, e sì, abbiamo ingannato GoDaddy.

Penso che in pochi passi possiamo farlo funzionare correttamente.

  1. Nel tuo Cpanel Godaddy / Hostgator > Seleziona record MX> Seleziona dominio in questione> Seleziona "Scambio posta remota "

    È ansible verificare la consegna della posta in questo momento, il problema potrebbe essere risolto.

  2. Sono sicuro che è impostato correttamente, ma fidati di me quando si tratta di buon ole Cpanel, PhpMailer e Godaddy / Hostgator. È un posto in cui il buon senso non ha senso.

sostituire:

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

con:

 $mail->Host = 'localhost'; 

Credo che questo dovrebbe risolvere qualsiasi problema assumendo che cose come le credenziali di accesso siano valide.

L'errore di timeout è tipico dei pacchetti scartati, quindi potrebbero esserci problemi di firewall tra server Web e server SMTP. Se hai accesso ssh al tuo server, puoi provare a connetterti a smtp usando:

 telnet <smtp server> 25 

In caso di errore di timeout anche con telnet, sei abbastanza sicuro che il problema è sul lato networking / firewall.

Devi modificare alcune impostazioni nel tuo 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. 

Se il tuo PHP.ini dipende dal tuo ambiente, maggiori informazioni: riferimento

O

Mettilo nella parte superiore del tuo script PHP e lascia libero il tuo script

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

Ho capito il tuo punto. Lo stesso problema accade con me, ho appena aggiunto una row e il suo funzionamento per me. si prega di utilizzare ,

 $mail->SMTPSecure = 'ssl'; 

e configura le tue impostazioni in base a ssl. Controlla anche correttamente la configuration della posta a fine servizio.