2010-08-13 18 views
32

Sto scrivendo un semplice script in cui viene utilizzato un account Gmail per inviare un'email a se stesso.Utilizzo di swiftmailer di php con gmail

Ho modificato la sceneggiatura da SwiftMailer's reference, ma non ottengo alcun risultato. Cosa c'è che non va?

Edit: dopo un ulteriore debug ho trovato che la dichiarazione

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

fa sì che il codice a fallire (l'eco di sotto di essa non stampa).

Perché è questo? Solo perché il messaggio non viene inviato il programma si blocca? :/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 

<body> 
<?php 
    require_once '/var/www/swift/lib/swift_required.php'; 
    echo 'Mail sent <br />'; 

/* //create the transport 
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587); 
     ->setUsername('[email protected]') 
     ->setPassword('softrain1234') 
    ; 
*/ 

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587) 
     ->setUsername('[email protected]') 
     ->setPassword('password') 
    ; 

    echo 'line 40 <br />'; 
    $mailer = Swift_Mailer::newInstance($transport); 
    $message = Swift_Message::newInstance('Wonderful Subject') 
     ->setFrom(array('[email protected]' => 'Evaluaciones')) 
     ->setTo(array('[email protected]'=> 'A name')) 
     ->setBody('Test Message Body') 
    ; 
    echo 'line 52 <br />'; 

    $result = $mailer->send($message); 
    echo $result; 
    echo 'line 58 <br />'; 

?> 
</body> 
</html> 

La forma di prova:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
     <title>Test Mail Script</title> 
    </head> 
    <body> 
     <form action="scriptmail.php" method="post"> 
      <input type="submit"/> 
      </table> 
     </form> 
    </body> 
</html> 
+0

Questo può essere utile: http: // stackoverflow.it/a/12317831/386579 –

+0

mi è stato utile: [Symfony - Come usare Gmail per inviare email] (http://symfony.com/doc/current/email/gmail.html) – Trix

+0

questo può essere utile: https: //stackoverflow.com/a/46864725/4680523 – manish1706

risposta

3

Il sistema SMTP di Gmail ha i suoi problemi di vista l'SSL e porte. Trovo difficile farlo funzionare bene con PHP.

La cosa migliore che ho trovato, che funziona è phpGMailer. Potresti essere in grado di setacciare quel codice per vedere come l'hanno fatto funzionare, ma per me ha sempre funzionato alla perfezione.

So che questo non risolve il problema SwiftMail, solo pensato vorrei sottolineare che :)

+0

Grazie, lo cercherò. Comunque, voglio sistemarlo. – andandandand

82

non intendo di far risorgere un vecchio post, ma solo nel caso in cui gli altri sono alla ricerca di una risposta, sia perché questo post è venuto fuori durante la mia ricerca di una soluzione nonostante l'età.

Quando si utilizza PHP SwiftMailer per connettersi a Gmail o Google Apps e-mail account è necessario utilizzare il seguente

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 
    ->setUsername($this->username) 
    ->setPassword($this->password); 

$this->mailer = Swift_Mailer::newInstance($transporter); 

Questo funziona bene per me. Nel codice originale, si sta utilizzando la porta 587 e non la 465 e non si specifica il protocollo (ssl). Non so se quel bit è importante, ma per me la porta 587 non è riuscita e 465 ha funzionato bene.

Spero che questo aiuti.

+2

Grazie mille. Ora funziona ^^ –

+6

Per coloro che hanno la verifica in due passaggi abilitata su Goole, è necessario utilizzare la password generata. – singles

+0

bene, ho dichiarato un trasportatore ma non il mailer. troppe astrazioni per la mia piccola testa :-) +1 comunque –

5

Ho trovato che quello che evad ha detto era vero, ma ho dovuto cambiare un po 'il suo lavoro per l'attuale versione di Swift Mailer. Ora è:

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 
    ->setUsername('[email protected]') 
    ->setPassword('password'); 

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

dovrebbe funzionare bene.

+7

Hos è diverso dalla soluzione fullybaked? –

+1

questo è uguale al precedente –

+0

Se qualcuno ha un indirizzo email con un account Google Apps utilizzando il proprio dominio registrato come [email protected]: http://stackoverflow.com/questions/17970096/swiftmailer-send-email- using-gmail-with-custom-domain –

31

Ho trovato questa domanda facendo una ricerca su Google e utilizzato il codice nella risposta fornita da fullybaked. Mi ha portato al punto in cui ho potuto vedere nelle eccezioni generate che il server smtp di Google rispondeva con un codice di errore che indicava la password e il nome utente non accettati. Dopo ulteriori indagini ho trovato i seguenti passaggi. Ora funziona alla grande e posso continuare a ritagliare il codice per la produzione.

Non sono sicuro che quando Google ha apportato la modifica, oltre alla configurazione del codice con il nome utente, la password e la porta Google (465/SSL o 587/Tls), è necessario eseguire i seguenti passaggi per poter utilizzare Google server smtp.

Per utilizzare il server SMTP di Gmail con il tuo account Gmail è necessario:

1) In "Impostazioni account" Google abilitare "Accesso per app meno sicure" impostandolo su "Consenti".

2) Nelle impostazioni di Gmail nella scheda "Inoltro e POP/IMAP", controllare lo stato di IMAP , deve essere abilitato. (Questo permetterà le email inviate da salvare nella cartella inviato.)

3) Se dopo i punti 1 e 2 è ancora generare l'eccezione server smtp di Google non accetta il nome utente e la password è necessario aprire un browser, accedere a Gmail e accedere, quindi aprire un'altra scheda nella stesso browser andgo a questo indirizzo:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha. 

4) immediatamente inviare una e-mail dal codice come questo vi permetterà di essere autorizzato ad usare il tuo account gmail t.

Spero che questo aiuti.

+1

sei una rockstar! – uchamp

+0

@Gene Caro, ho provato tutto questo. Tutto ha funzionato sul mio host locale ma non sul server live. Sto affrontando questo errore e nessun successo fino a dopo 4 ore di ricerca e prova di tutto. "Impossibile autenticare sul server SMTP con nome utente" [email protected] "utilizzando 2 possibili autenticatori" –

+0

Non ho dato molta attenzione al passaggio 3, ma in realtà ha risolto il problema –

0

Sono anche venuto qui dopo ore di ricerca. Ho finalmente trovato la vera risposta. Volevo inviare email da server di posta google e non dal mio host con l'autenticazione smtp.

È possibile rintracciare un'e-mail con le intestazioni complete all'interno di Gmail, seguire questa guida.

https://support.google.com/mail/answer/29436?hl=en

@fullybaked aveva la risposta giusta per l'autenticazione e-mail via SMTP, ma si sarebbe ancora l'invio tramite il vostro ospite.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 
->setUsername($this->username) 
->setPassword($this->password); 

$this->mailer = Swift_Mailer::newInstance($transporter); 

@ducin era corretto con le diverse porte e tipi di crittografia.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') 

O più moderno e più sicuro, utilizzare;

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') 

Se si desidera inviare direttamente da un server di Gmail è necessario impostare la modalità di autorizzazione. Normale è l'impostazione predefinita.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') 
->setAuthMode('login') 
->setUsername('[email protected]') 
->setPassword('password'); 

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

@gene è anche corretto, si ha per autenticare la vostra applicazione, in modo da seguire le sue istruzioni.

seguito per evitare che la tua email da sbarco nella cartella spam, si dovrà anche aggiungere record di testo dns con DKIM (chiavi di dominio)

https://support.google.com/a/answer/174124?hl=en

record SPF

https://support.google.com/a/answer/33786?hl=en

e DMARC

https://support.google.com/a/answer/2466580?hl=en

Problemi correlati