Настройка Zend для использования Gmail SMTP: Dev-среда Windows Apache: ошибка «Не удалось открыть сокет» - неоднократно - сходит с ума - PullRequest
0 голосов
/ 15 января 2011

Моей средой разработки является Win XP SP2 / Apache 2. что-то PHP 5.something_or_other

Моя рабочая среда - Linux Ubuntu / Apache 2.something_else PHP 5.something_or_other_else

Код всего Zend Framework Версия: 1.11.1

Я могу telnet: smtp.gmail.com 465 с ПК.

У меня на компьютере настроен Mercury для использования gmail в качестве хоста smtp, и он работает просто отлично. (MercuryC SMTP-клиент). Mercury настроен на использование порта 465 и SSL на smtp.gmail.com - Нет проблем.

Zend mail прекрасно работает в моей производственной среде, используя рабочий почтовый сервер для отправки почты. Это тот же базовый application.ini, но с разными значениями в почтовых переменных.

На моем локальном компьютере с настройкой ПК мой application.ini содержит: (те же значения, что и в Mercury)

mail.templatePath = APPLICATION_PATH "/emails"
mail.sender.name = "myAccount"
mail.sender.email = "myAccount@gmail.com"
mail.host = smtp.gmail.com
mail.smtp.auth = "login"
mail.smtp.username = "myAccount@gmail.com"
mail.smtp.password = "myPassWord"
mail.smtp.ssl = "ssl"
mail.smtp.port = 465

Я часами пробовал и ошибался, пытаясь получить одно электронное письмо безуспешно. В любом случае, независимо от настроек сервера или порта, он выдает ошибку и сообщает:

Could not open socket.

И Apache, и Mercury Core являются исключениями в моей конфигурации брандмауэра Windows. У Меркурия, похоже, нет проблем.

Я выполнил поиск в stackoverflow, прежде чем опубликовать это, и гуглял часами - безуспешно.

Я медленно схожу с ума

Я был бы очень признателен за любой совет относительно того, что может быть не так.

Спасибо за чтение.

===================

КСТАТИ

Когда я использую те же значения application.ini на локальном ПК, что и на производственном хосте, я получаю ту же ошибку «Не удалось открыть сокет».

Эти значения:

mail.templatePath = APPLICATION_PATH "/emails"
mail.sender.name = "otherUser"
mail.sender.email = "otherUser@otherAccount.com"
mail.host = smtp.otherServer.com
mail.smtp.auth = "login"
mail.smtp.username = "otherUser@otherAccount.com"
mail.smtp.password = "otherPAssWord"
mail.smtp.ssl = "ssl"
mail.smtp.port = 465

Я знаю эти работы в производственной (Ubuntu) среде.

Я совершенно сбит с толку.

===============================================

Похоже, что в коде попытка подключения записывается как:

$this->_socket = @stream_socket_client($remote, $errorNum, $errorStr, self::TIMEOUT_CONNECTION);

где $ remote имеет значение:

ssl:\/\/smtp.gmail.com:465

... учитывая значения application.ini выше в моей текущей версии - в соответствии с инструментарием сообщения об ошибке, который я только что вставил.

Поскольку он работает на производстве, я сомневаюсь, что с этим что-то не так. Но ... на случай, если это поможет, вот оно.

На самом деле это выглядит достаточно нормально для меня.

==============================

Кажется, что происходит сбой с номером ошибки 0 - что, как я понимаю, означает какую-то проблему при инициализации сокета.

==============================

Просто ради здравомыслия я только что проверил php.ini и подтвердил, что оба:

extension=php_openssl.dll
extension=php_sockets.dll

... включены.

1 Ответ

0 голосов
/ 15 января 2011

ОК, ребята. Сначала я хотел бы сказать, ! # $ #% $ # $ ## @ $$$! #! $ !!!!!!!!!!!!!!!!

Тем не менее, было две проблемы, скрывающиеся за поверхностью. Я собираюсь оставить историю для них, что будет позади меня.

================================ Часть 1

Гении, которые заложили основы проекта Zend, над которым я работаю, очень правильно настроили соответствующие параметры почты в application.ini, как показано выше.

Они настроили транспорт по умолчанию в подкаталоге сайта, который они называли Службы , по имени OurNameSpace_Service_Mail в файле с именем Mail.php . Хорошо.

Затем они пошли вниз, в духе этого класса, чтобы сказать:

$this->_smtpTransport = new Zend_Mail_Transport_Smtp('smtp.somehost.com', array(
    'auth' => 'login',
    'username' => 'someID@otherHost.com',
    'password' => 'somePassWord',
    'ssl' => 'ssl',
    'port' => 465));

... таким образом игнорируя значения, которые они осторожно поместили в application.ini. Brilliant!

Слово предупреждения. Сообщения об ошибках, выдаваемые из Zend / Mail / PRotocol / Abstract.php и Zend / Http / Client / Adapter / Socket.php не предоставляет много информации об ошибках, поэтому мне пришлось самостоятельно их исправлять. Это еще более раздражает, когда номер ошибки равен 0, как это было в моем случае.

Кто-то должен позвонить в Нобелевский комитет и назначить мой проект «Brainiacs» на премию за лучшие практики кодирования! И спасибо, Zend, за бесполезные сообщения об ошибках.

================================ Часть 2

Да воздастся ангелам небесным на голову прекрасному парню, который поднял эту веб-страницу:

Установка Windows на PHP: невозможно загрузить динамическую библиотеку php_mssql.dll, php_pspell.dll и т. Д.

URL

http://www.undermyhat.org/blog/2009/07/php-windows-install-unable-to-load-dynamic-library-php_mssql-dll-php_pspell-dll-etc/

Что случилось, это. В надежде, что в моих журналах может быть что-то, я посмотрел в Apache error.log и нашел:

PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/php/ext/php_openssl.dll' - The operating system cannot run %1.\r\n in Unknown on line 0

Конечно, это наполнило меня радостью и удовлетворением - тем более что я знал, что dll включен, и когда я проверял, он находился прямо в каталоге ext, именно там, где и должен быть. Misery.

Как объясняет приведенная выше страница, проблема оказалась в отсутствующей зависимости.

php_openssl.dll зависит от нескольких других DLL, для которых Apache не находил правильные версии.

Когда я скопировал эти dll из корневого каталога PHP в каталог bin Apache, проблема исчезла. Я не буду повторять содержание этой превосходной технической страницы.

Опять же, пусть небесные дары упадут на технаря, который разобрался с решением и опубликовал его.

================

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...