2010-08-13 8 views
32

Piszę prosty skrypt, w którym konto Gmail jest używane do wysyłania wiadomości e-mail do siebie.Używanie Swiftmailera php z Gmailem

Zmieniłem skrypt z wersji reference SwiftMailera, ale nie otrzymuję żadnych wyników. Co jest nie tak?

Edycja: po dalszym debugowania Znalazłem że oświadczenie

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

powoduje, że kod na niepowodzenie (echo pod nim nie drukuje).

Dlaczego tak jest? Tylko dlatego, że wiadomość nie została wysłana, program się zawiesi? :/

<!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> 

Forma testowa:

<!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

Może to być przydatne: http: // stackoverflow.com/a/12317831/386579 –

+0

pomocne dla mnie: [Symfony - Jak używać Gmaila do wysyłania wiadomości e-mail] (http://symfony.com/doc/current/email/gmail.html) – Trix

+0

może to być przydatne: https: //stackoverflow.com/a/46864725/4680523 – manish1706

Odpowiedz

3

System GMail SMTP ma swoje problemy, biorąc pod uwagę SSL i portów. Ciężko jest mi go ładnie zaimplementować w PHP.

Najlepsze, co znalazłem, to działa: phpGMailer. Możesz być w stanie przejrzeć ten kod, aby zobaczyć, jak działają, ale to zawsze działało bezbłędnie dla mnie.

wiem, że to nie rozwiązuje problemu SwiftMail, po prostu zorientowali Chciałbym zauważyć, że spośród :)

+0

Dzięki, sprawdzę to. Mimo to, chcę to naprawić. – andandandand

82

Nie znaczy wskrzesić stary post, ale tylko w przypadku, inni szukają odpowiedzi, a ponieważ ten post pojawił się podczas poszukiwania rozwiązania pomimo wieku.

Podczas używania PHP SwiftMailer podłączyć do Gmail lub Google Apps kont e-mail należy użyć następujących

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

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

Działa to dobrze dla mnie. W oryginalnym kodzie używasz portu 587, a nie 465 i nie określasz protokołu (ssl). Nie wiem, czy to ma znaczenie, ale dla mnie port 587 zawiodł i 465 działało dobrze.

Nadzieję, że pomaga.

+2

Wielkie dzięki. Teraz działa^^ –

+6

Dla tych, którzy mają włączoną weryfikację dwuetapową w Goole, musisz użyć wygenerowanego hasła. – singles

+0

cóż, zadeklarowałem transportera, ale nie mailer. zbyt wiele abstrakcji dla mojej małej głowy :-) +1 i tak –

5

Znalazłem, że to, co powiedział evad, było prawdą, ale musiałem trochę zmienić jego pracę na obecną wersję Swift Mailer. Teraz jest:

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

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

powinny działać prawidłowo.

+7

Hos to różni się od rozwiązania w pełni wypalonego? –

+1

to jest to samo, co powyżej. –

+0

Jeśli ktoś ma e-maila z kontem Google Apps za pomocą własnej zarejestrowanej domeny, takiej jak [email protected]: http://stackoverflow.com/questions/17970096/swiftmailer-send-email- using-gmail-with-custom-domain –

31

Znalazłem to pytanie robi wyszukiwarce Google i kodu używane w odpowiedzi udzielonej przez fullybaked. Doprowadziło mnie to do punktu, w którym mogłem zobaczyć w Wyjątkach, że serwer smtp Google odpowiada kodem błędu, który wskazuje, że hasło i nazwa użytkownika nie są akceptowane. Po dalszych badaniach znalazłem następujące kroki. Teraz działa świetnie i mogę kontynuować tworzenie kodu do produkcji.

Nie wiem, kiedy Google wprowadził zmianę, ale oprócz konfiguracji kodu z nazwą użytkownika, hasłem i portem Google (465/ssl lub 587/tls) musisz wykonać następujące czynności, aby móc korzystać z Google serwer smtp.

Aby korzystać z serwera SMTP Gmail z konta gmail trzeba:

1) W „Ustawienia konta” Google umożliwiają „Dostęp dla mniej bezpiecznych aplikacji”, ustawiając je na „Zezwalaj”.

2) W ustawieniach Gmaila w zakładce "Przekazywanie i POP/IMAP" sprawdź status IMAP , należy go włączyć. (To pozwoli na e-maile wysyłane mają być zapisane w folderze Wysłane.)

3) Jeżeli po wykonaniu kroków 1 i 2 nadal rzucać wyjątek serwer Google SMTP nie przyjmuje nazwę użytkownika i hasło potrzebne do otwarcia przeglądarkę, przejdź do Gmaila i zaloguj się, a następnie otworzyć kolejną kartę w samej przeglądarce andgo na ten adres:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha. 

4) natychmiastowe wysłanie e-maila z kodem, gdyż pozwoli to na być upoważniony do korzystania z konta Gmail t.

Mam nadzieję, że to pomoże.

+1

jesteś gwiazdą rocka! – uchamp

+0

@Gene Drogi Mam spróbować tego wszystkiego. Wszystko działało na moim lokalnym hoście, ale nie na serwerze na żywo. Mam do czynienia z tym błędem i bez powodzenia, aż po 4 godzinach wyszukiwania i spróbować wszystkiego. "Nieudane uwierzytelnienie na serwerze SMTP z nazwą użytkownika" [email protected]ail.com "przy użyciu 2 możliwych elementów uwierzytelniających" –

+0

Nie poświęciłem wiele uwagi krokowi 3, ale faktycznie rozwiązało problem –

0

Przybyłem tu także po wielu godzinach badań. W końcu znalazłem prawdziwą odpowiedź. Chciałem wysyłać wiadomości e-mail z serwerów poczty Google, a nie z mojego hosta z uwierzytelnianiem smtp.

Możesz prześledzić pocztę e-mail z pełnymi nagłówkami wewnątrz Gmaila, postępuj zgodnie z tym przewodnikiem.

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

@fullybaked miał właściwą odpowiedź uwierzytelniania poczty e-mail za pośrednictwem protokołu SMTP, ale będzie nadal wysyłać za pośrednictwem gospodarza.

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

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

@ducin było poprawne z różnymi portami i typami szyfrowania.

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

LUB bardziej nowoczesne i bezpieczniejsze, użyj;

Jeśli chcesz wysłać bezpośrednio z serwera poczty Gmail, musisz ustawić tryb autoryzacji. Zwykły jest domyślny.

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

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

@gena jest również poprawna, musisz uwierzytelnić swoją aplikację, więc postępuj zgodnie z jego instrukcjami.

Ponadto, aby zapobiec pocztę z lądowania w folderze spamu, będzie trzeba także dodać rekordy tekstowe dns z DKIM (klawisze domeny)

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

rekordy SPF

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

i DMARC

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