Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Зачем два EHLO в system/library/mail.php?


Recommended Posts

Столкнулся с проблемой в OcStore 2.3.0.2.3 (возможно в других версиях/сборках, не смотрел), а именно при $mail->send(); вываливались ошибка: Error: EHLO not accepted from server!

Со стороны настроек все ок, таймаут стоит 5 сек.

 

Начал логировать каждый пук.  И вижу что уходит два раза EHLO:

if (!$handle) {
	throw new \Exception('Error: ' . $errstr . ' (' . $errno . ')');
} else {
	...
	fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . "\r\n");
	...
	if (!empty($this->smtp_username)  && !empty($this->smtp_password)) {
		fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . "\r\n");
		...

Так вот. На той стороне стоит мелкософт exchange, который на второй EHLO дает 5 секунд таймаут.

 

Вопрос: Это фича или баг? Или Админа пинать?

Надіслати
Поділитися на інших сайтах

53 минуты назад, mpn2005 сказал:

Похоже, что есть беда с переключением на шифрованный канал у сервера.

https://www.samlogic.net/articles/smtp-commands-reference.htm

 

ок, при TLS мы:

Цитата

The client sends the EHLO command again to the e-mail server and starts the communication from the beginning, but this time the communication will be encrypted until the QUIT command is sent.

 

Но я не использую TLS. Зачем второй раз посылать? Для TLS есть:

if (substr($this->smtp_hostname, 0, 3) == 'tls') {
	fputs($handle, 'STARTTLS' . "\r\n");
...

вот тут как раз наверное должен быть второй EHLO, а не после

if (!empty($this->smtp_username)  && !empty($this->smtp_password)) {
	fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . "\r\n");

 

Поправьте, если я не прав.

 

 

Надіслати
Поділитися на інших сайтах

1 минуту назад, ibond сказал:

Поправьте, если я не прав.

Для TLS надо повторно посылать. В спецификации описано.

На скине там где меняется цвет.

 

Без TLS можно не посылать, но либа в движке так написана.

Можно чуть перенести блок выше, внутрь предыдущего if.

 

 

Надіслати
Поділитися на інших сайтах

И если говорить о красоте, то это во всей либе лишнее:

throw new \Exception

Надо писать ошибку в лог, и выходить из функции. А не валить сайт при неудачной отправке почты.

 

Надіслати
Поділитися на інших сайтах

1 минуту назад, mpn2005 сказал:

Без TLS можно не посылать, но либа в движке так написана.

Можно чуть перенести блок выше, внутрь предыдущего if.

Вот именно в движке так сделано.

 

Резюмирую на данный момент:

ДВА посыла EHLO -- решили!

Должна ли пауза быть или не должна в ответе после второго EHLO -- пока под вопросом?

Не там второе EHLO посылается в движке -- решено!

Надіслати
Поділитися на інших сайтах

5 минут назад, ibond сказал:

Должна ли пауза быть или не должна в ответе после второго EHLO -- пока под вопросом?

Речь про затуп со стороны сервера? 

По идее сервер не должен уходить в стопор, особенно на секунды. Даже при невалидных отправках. 

Если отправка не валидна, то сервер должен отдать ошибку, а не впадать в ступор.

 

При отправке никаких пауз не надо делать. Транспорт TCP не требует никаких задержек перед отправками.

  • +1 1
Надіслати
Поділитися на інших сайтах

22 минуты назад, mpn2005 сказал:

Надо писать ошибку в лог, и выходить из функции. А не валить сайт при неудачной отправке почты.


В принципе - да, и нехрен инициализировать переменными собственный почтовик

Чтоб не думать от версии к версии о названии переменных инициализации

new Mail($this->registry)

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.