Не мога да изпращам поща със SwiftMailer или PHPMailer от Localhost, използвайки gmail

Наскоро не можах да изпращам имейли през php на localhost. Използвам PHPMailer и SwiftMailer в различни части на приложението.

С SwiftMailer получавам това:

Connection could not be established with host smtp.gmail.com [ #0]

С PHPMailer съобщението е:

SMTP Error: Could not connect to SMTP host.

Моите настройки на SwiftMailer изглеждат така:

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername(APP_GMAIL_EMAIL)
->setPassword(APP_GMAIL_PWD);

Прегледах няколко теми тук в SO и другаде и опитах много „поправки“, но съобщенията за грешка остават същите. Някои "решения", които опитах, са:

  1. Активиране на OpenSSL вphp.ini (преди това беше изключено)
  2. Променете smtp.gmail.com на smtp.googlemail.com
  3. Заменете smtp.gmail.com с определени IP адреси на gmail
  4. Заменете smtp.gmail.com с gethostbyname('smtp.gmail.com')
  5. Добавете ->setSourceIp('0.0.0.0') към кода за инстанциране по-горе, след setUsername и setPassword

Този код преди това работеше и не съм сигурен какво може да е нарушило функцията. Като част от отстраняването на неизправности, току-що потвърдих, че подобен код на споделен хостинг на Linux се изпраща по имейл задоволително, което предполага, че проблемът е някак от моята среда. Така дори опитах различни източници на достъп до интернет, в случай че е нещо от ISP.

Как мога да счупя този орех?


person Ifedi Okonkwo    schedule 29.04.2015    source източник
comment
Прочетете документите за отстраняване на неизправности в PHPMailer.   -  person Synchro    schedule 30.04.2015


Отговори (1)


Успях да преодолея проблема, поне с SwiftMailer. Решението трябва да е възникнало след надстройката ми на PHP от 5.2.5 до 5.6, която е версията, която имам в момента. Прозрението дойде от тази страница:

https://github.com/swiftmailer/swiftmailer/issues/544

Ако използвате PHP 5.6, грешката възниква поради „опциите за SSL контекст“, използвани за контекста на потока в swiftmailer. В PHP 5.6 verify_peer и verify_peer_name по подразбиране беше зададено TRUE, така че PHP проверява SSL сертификата. В момента не е възможно да го деактивирате в swiftmailer, като използвате някои опции.

Можете да деактивирате SSL проверката, като промените функцията "_establishSocketConnection" в StreamBuffer.php. Добавете тези редове преди командата stream_socket_client:

$options['ssl']['verify_peer'] = FALSE; 
$options['ssl']['verify_peer_name'] = FALSE;

Би било чудесно, ако тези опции могат да бъдат зададени без хакване на кода.

Благодаря на https://stackoverflow.com/a/29448735/2554788, който първи ме насочи към споменатата публикация.

Между другото, пътят до StreamBuffer.php е:

\lib\classes\Swift\Transport

Едно предупреждение обаче: това решение се основава на хакване на кода вътре в клас и вероятно ще се провали, да речем, след надграждане на SwiftMailer версии (в който случай ще трябва да се върнете и да хакнете кода отново).

Може би по-актуалните версии на SwiftMailer са обединили действията си в PHP 5.6 (в момента използвам SwiftMailer 5.1). Възнамерявам да опитам надстройка възможно най-скоро, надявайки се, че има елегантно решение за този проблем.

person Ifedi Okonkwo    schedule 30.04.2015
comment
Благодаря Ifedi Okonkwo. Решението ми помогна. - person Kiran; 22.12.2015