Отправка писем прекратилась — достигнут конец файла

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

В течение последних четырех дней все письма перестали отправляться, и тестовое письмо также не проходит.

Я просмотрел существующие темы, похожие на мою, но в моем случае ничего (насколько мне известно) не менялось, и почта перестала работать после того, как месяцами функционировала без сбоев.

Мы используем хостинг на Digital Ocean и настроили SMTP-ретранслятор G Suite для пересылки писем с IP-адреса нашего Droplet.

Точная ошибка, указанная в Sidekiq, более подробная, чем та, которую выдает discourse-doctor.

Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached

discourse-doctor просто сообщает: UNEXPECTED ERROR: end of file reached.

Мне также удалось подтвердить подключение к серверу с помощью:

telnet smtp-relay.gmail.com 587

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

Сталкивался ли кто-нибудь с чем-то подобным или имеет аналогичную конфигурацию, которая всё ещё работает? Заранее спасибо!

У меня пока нет полезных советов, но я столкнулся с точно такой же проблемой при точно такой же настройке — Droplet от DigitalOcean, отправка писем через smtp-relay.gmail.com, получаются ошибки EOFErrors.

Sidekiq сообщает следующее:

Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached

В /logs я вижу трассировку ошибки, но ничего сразу не выделяется как полезное.

Информация:

Job exception: end of file reached

Трассировка стека:

/usr/local/lib/ruby/2.7.0/net/protocol.rb:225:in `rbuf_fill'
/usr/local/lib/ruby/2.7.0/net/protocol.rb:191:in `readuntil'
/usr/local/lib/ruby/2.7.0/net/protocol.rb:201:in `readline'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:944:in `recv_response'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:929:in `block in getok'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:954:in `critical'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:927:in `getok'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:826:in `helo'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:600:in `do_helo'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:554:in `do_start'
/usr/local/lib/ruby/2.7.0/net/smtp.rb:518:in `start'
mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
mail-2.7.1/lib/mail/message.rb:2159:in `do_delivery'
mail-2.7.1/lib/mail/message.rb:260:in `block in deliver'
actionmailer-6.0.3.3/lib/action_mailer/base.rb:589:in `block in deliver_mail'
activesupport-6.0.3.3/lib/active_support/notifications.rb:180:in `block in instrument'
activesupport-6.0.3.3/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-6.0.3.3/lib/active_support/notifications.rb:180:in `instrument'
actionmailer-6.0.3.3/lib/action_mailer/base.rb:587:in `deliver_mail'
mail-2.7.1/lib/mail/message.rb:260:in `deliver'
actionmailer-6.0.3.3/lib/action_mailer/message_delivery.rb:115:in `block in deliver_now'
actionmailer-6.0.3.3/lib/action_mailer/rescuable.rb:17:in `handle_exceptions'
actionmailer-6.0.3.3/lib/action_mailer/message_delivery.rb:114:in `deliver_now'
/var/www/discourse/lib/email/sender.rb:234:in `send'
/var/www/discourse/app/jobs/regular/user_email.rb:70:in `send_user_email'
/var/www/discourse/app/jobs/regular/user_email.rb:25:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
sidekiq-6.1.2/lib/sidekiq/processor.rb:196:in `execute_job'
sidekiq-6.1.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.1.2/lib/sidekiq/processor.rb:163:in `block in process'
sidekiq-6.1.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.1.2/lib/sidekiq/job_retry.rb:111:in `local'
sidekiq-6.1.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.1.2/lib/sidekiq.rb:38:in `block in <module:Sidekiq>'
sidekiq-6.1.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.1.2/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.1.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.1.2/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.1.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.1.2/lib/sidekiq/job_retry.rb:78:in `global'
sidekiq-6.1.2/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.1.2/lib/sidekiq/logger.rb:10:in `with'
sidekiq-6.1.2/lib/sidekiq/job_logger.rb:33:in `prepare'
sidekiq-6.1.2/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.1.2/lib/sidekiq/processor.rb:162:in `process'
sidekiq-6.1.2/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.1.2/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.1.2/lib/sidekiq/util.rb:15:in `watchdog'
sidekiq-6.1.2/lib/sidekiq/util.rb:24:in `block in safe_thread'

Окружение:

hostname	conversation-app
process_id	736
application_version	e6bbe9b5df4d86fe711aa8b1d886489d30875633
current_db	default
current_hostname	conversation.sevarg.net
job	Jobs::UserEmail
problem_db	default
time	12:42 pm
opts	
type	digest
user_id	30
current_site_id	default

Утилита discourse-doctor выдает аналогичный общий вывод:

==================== MAIL TEST ====================
Для надежного теста получите адрес на http://www.mail-tester.com/
Или просто отправьте тестовое сообщение себе.
Email адрес для теста? ('n' чтобы пропустить) [[мой email]]: 
Отправка письма на [мой email]... 
Тестирование отправки на [мой email] через smtp-relay.gmail.com:587.
======================================== ОШИБКА ========================================
                                    НЕОЖИДАННАЯ ОШИБКА

end of file reached

====================================== РЕШЕНИЕ =======================================
Это не распространенная ошибка. Нет рекомендованного решения!

Пожалуйста, сообщите точное сообщение об ошибке выше на https://meta.discourse.org/
(И решение, если вы его найдете!)
=======================================================================================

Я также могу подключиться по telnet к релейному серверу на порту 587 (и отправить тестовое сообщение вручную — не делал этого уже десятилетия…) и не менял ничего, что могло бы повлиять на работу почты, в недавнем прошлом.

Я полностью застрял в плане регистрации новых пользователей и прочего, что является проблемой, так как я использую систему также для комментариев к блогу. В логах Google я тоже не нашел ничего особо полезного, и у меня совсем закончились идеи для дальнейшего устранения неполадок. Всё кажется правильно настроенным, но просто перестало работать.}

Что ж, определенно приятно знать, что моя конфигурация не слишком уникальна и что я не одинок в своих проблемах. Интересно, у вас проблема тоже началась примерно 5 дней назад? Возможно, было обновление чего-то общего в наших конвейерах.

Спасибо за подробное описание и трассировку стека. Мои были очень похожи на ваши, а ошибки идентичны.

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

Я в той же ситуации, и пока мы вручную активируем новых пользователей (к счастью, это всего несколько человек в день). Учитывая, что я ничего не менял в G Suite, DigitalOcean или конфигурации Discourse, я колеблюсь начинать что-то менять, не сумев точно определить, что именно вызывает проблему. :confused:

Первый реальный всплеск сбоев в Sidekiq произошел 14 января, то есть… 5 дней назад. До этого у меня были случайные сбои, связанные с некорректными электронными письмами или подобными проблемами, но ничего не увеличивалось стремительно.

Я пытался воссоздать настройки ретрансляции в консоли администратора Google и настраивать их (включая то, что должно быть полностью открыто), но без изменений. Я также пробовал разные порты для отправки почты, но это тоже не помогло.

Кроме того, насколько мне известно, 5 дней назад я ничего не менял. :confused:

Ещё один отчёт о проблемах: DigitalOcean → smtp-relay.gmail.com

Может ли кто-нибудь легко протестировать это с ВМ не от DigitalOcean? Например, GCE или что-то подобное?

Я только что запустил установку Discourse на GCE с моими учетными данными и получил ту же ошибку (при этом настроил релей так, чтобы он использовал только аутентификацию).

======================================== ОШИБКА ========================================
                                    НЕОЖИДАННАЯ ОШИБКА

достигнут конец файла

====================================== РЕШЕНИЕ =======================================
Это не распространенная ошибка. Рекомендуемого решения не существует!

Пожалуйста, сообщите точное сообщение об ошибке выше по адресу https://meta.discourse.org/
(И решение, если вы его найдете!)
=======================================================================================

Настройка аутентификации по IP для релей дала тот же результат. Так что я не думаю, что это специфичная проблема DigitalOcean…

К сожалению, «Устранение проблем с электронной почтой в Ruby/Rails» выходит за рамки моих текущих навыков… есть какие-нибудь предложения?

Есть ли шанс, что это проблема SMTP Gmail?

Похоже, что так. Я не знаю, как это исправить, и мои попытки пока ни к чему не привели. Вероятно, что-то изменилось, Discourse не справляется с этим, и, разумеется, поддержки нет.

Раньше мне здесь везло: я помогал находить и решать проблемы. Не понимаю, почему сейчас тут так тихо.

Возможно, это проблема с SMTP Gmail/G Suite, но @Syonyk упомянул, что ему удалось вручную отправить письмо через telnet на своём дроплете.

У меня недостаточно опыта, чтобы понять, как G Suite интерпретирует трафик, отправляемый с сайта, по сравнению с вручную отправленными сообщениями, но это похоже на проблему с сервисом, отправляющим письмо на smtp-relay.gmail, а не на самом ретрансляторе.

Кстати, IP-адрес моего дроплета специально разрешён в настройках администратора G Suite, и я не менял (и до сих пор не менял) никаких настроек ни в одном из сервисов уже несколько месяцев.

В единственный раз, когда я видел нечто подобное, это длилось всего день (возможно, два — в то время страница была не очень загружена, поэтому, скорее всего, я бы не заметил, если бы это продолжалось дольше), но проблема, похоже, быстро разрешилась сама собой.

Без подробной записи SMTP-диалога от Discourse я не знаю, как продолжить устранение неполадок — и не знаю, как получить эти записи.

Есть ли способ подтвердить количество писем, которые я отправляю через Discourse в месяц? Если мне понадобится перейти на другой SMTP-ретранслятор, мне нужно будет знать, какой бюджет потребуется. Это очень раздражает.

На странице /admin/email/sent вашего экземпляра вы сможете увидеть, какие письма были отправлены, и оценить объём использования оттуда.

Хм…

Я запустил tcpdump на сервере и выполнил discourse-doctor. В выводе обнаружил следующее…

...
0x0030:  d10f f8e4 4548 4c4f 206c 6f63 616c 686f  ....EHLO.localho
	0x0040:  7374 0d0a                                st..
...
	0x0030:  de62 f0c3 3432 3120 342e 372e 3020 5472  .b..421.4.7.0.Tr
	0x0040:  7920 6167 6169 6e20 6c61 7465 722c 2063  y.again.later,.c
	0x0050:  6c6f 7369 6e67 2063 6f6e 6e65 6374 696f  losing.connectio
	0x0060:  6e2e 2028 4548 4c4f 2920 6a31 3673 6d34  n..(EHLO).j16sm4
	0x0070:  3831 3932 3976 736d 2e31 202d 2067 736d  81929vsm.1.-.gsm
	0x0080:  7470 0d0a                                tp..

И, что важно, я могу воспроизвести эту ошибку с помощью telnet.

root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP ls8sm507258pjb.6 - gsmtp
ehlo localhost.localdomain
421 4.7.0 Try again later, closing connection. (EHLO) ls8sm507258pjb.6 - gsmtp
Connection closed by foreign host.

Если же я отправляю настоящее доменное имя, получаю ожидаемый ответ.

root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP p10sm668563uaw.3 - gsmtp
ehlo conversation.sevarg.net
250-smtp-relay.gmail.com at your service, [64.227.96.27]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

Итак, теперь вопрос: как заставить Discourse отправлять корректную строку домена в команде EHLO?

Не знаю, является ли это единственной проблемой, но расследование этого момента выглядит многообещающим.

Это так странно. Откуда это вдруг взялось? Я не делал никаких обновлений.

Это не началось постепенно, оно было таким всегда. Google что-то изменил.

Утилита discourse-doctor вызывает тест в /var/www/discourse/lib/tasks/emails.rake — если вы находитесь внутри образа.

Я изменил:

Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

на

Net::SMTP.start(smtp[:address], smtp[:port], 'conversation.sevarg.net', smtp[:user_name], smtp[:password], smtp[:authentication])

Теперь я получаю другую ошибку.

======================================== ОШИБКА ========================================
                                    НЕОЖИДАННАЯ ОШИБКА

503 5.5.1 неправильная последовательность команд e190sm562849qkd.9 - gsmtp


====================================== РЕШЕНИЕ =======================================
Это не является распространённой ошибкой. Нет рекомендованного решения!

Пожалуйста, сообщите точное сообщение об ошибке выше по адресу https://meta.discourse.org/
(И решение, если вы его найдёте!)
=======================================================================================

НО: важно то, что tcpdump показывает что-то напоминающее в целом логичный поток.

22:33:48.393862 IP 64.227.96.27.54610 > 74.125.137.28.587: Flags [P.], seq 1:31, ack 59, win 502, options [nop,nop,TS val 3732187266 ecr 3508646052], length 30
	0x0000:  4500 0052 d4d6 4000 3f06 f237 40e3 601b  E..R..@.?..7@.`.
	0x0010:  4a7d 891c d552 024b 01b4 04a4 94ce dcc7  J}...R.K........
	0x0020:  8018 01f6 74dc 0000 0101 080a de74 a882  ....t........t..
	0x0030:  d121 b0a4 4548 4c4f 2063 6f6e 7665 7273  .!..EHLO.convers
	0x0040:  6174 696f 6e2e 7365 7661 7267 2e6e 6574  ation.sevarg.net
	0x0050:  0d0a                                     ..
22:33:48.408832 IP 74.125.137.28.587 > 64.227.96.27.54610: Flags [.], ack 31, win 256, options [nop,nop,TS val 3508646067 ecr 3732187266], length 0
	0x0000:  4500 0034 5e5d 0000 2b06 bccf 4a7d 891c  E..4^]..+...J}..
	0x0010:  40e3 601b 024b d552 94ce dcc7 01b4 04c2  @.`..K.R........
	0x0020:  8010 0100 a8ae 0000 0101 080a d121 b0b3  .............!..
	0x0030:  de74 a882                                .t..
22:33:48.469560 IP 74.125.137.28.587 > 64.227.96.27.54610: Flags [P.], seq 59:234, ack 31, win 256, options [nop,nop,TS val 3508646128 ecr 3732187266], length 175
	0x0000:  4500 00e3 5e8a 0000 2b06 bbf3 4a7d 891c  E...^...+...J}..
	0x0010:  40e3 601b 024b d552 94ce dcc7 01b4 04c2  @.`..K.R........
	0x0020:  8018 0100 929f 0000 0101 080a d121 b0f0  .............!..
	0x0030:  de74 a882 3235 302d 736d 7470 2d72 656c  .t..250-smtp-rel
	0x0040:  6179 2e67 6d61 696c 2e63 6f6d 2061 7420  ay.gmail.com.at.
	0x0050:  796f 7572 2073 6572 7669 6365 2c20 5b36  your.service,.[6
	0x0060:  342e 3232 372e 3936 2e32 375d 0d0a 3235  4.227.96.27]..25
	0x0070:  302d 5349 5a45 2031 3537 3238 3634 3030  0-SIZE.157286400
	0x0080:  0d0a 3235 302d 3842 4954 4d49 4d45 0d0a  ..250-8BITMIME..
	0x0090:  3235 302d 5354 4152 5454 4c53 0d0a 3235  250-STARTTLS..25
	0x00a0:  302d 454e 4841 4e43 4544 5354 4154 5553  0-ENHANCEDSTATUS
	0x00b0:  434f 4445 530d 0a32 3530 2d50 4950 454c  CODES..250-PIPEL
	0x00c0:  494e 494e 470d 0a32 3530 2d43 4855 4e4b  INING..250-CHUNK
	0x00d0:  494e 470d 0a32 3530 2053 4d54 5055 5446  ING..250.SMTPUTF
	0x00e0:  380d 0a                                  8..

Таким образом, как минимум, отправка “EHLO localhost” или “EHLO localhost.localdomain” является частью проблемы.

Теперь, как чёрт возьми, сообщить о проблеме уровня P0 реальным разработчикам?

Я определённо видел этих ребят на форумах. Судя по всему, они довольно внимательно за ними следят. Я бы сказал, что это GitHub, но, похоже, для репозитория отключена система отслеживания задач.

Хорошо.

Это тестовое письмо от

https://conversation.sevarg.net

Доставка электронной почты — дело сложное. Вот несколько важных пунктов, которые стоит проверить в первую очередь:

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

cd /var/discourse
./launcher enter app
vim ./vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb

Вам нужно найти следующий блок:

    DEFAULTS = {
      :address              => 'localhost',
      :port                 => 25,
      :domain               => 'localhost.localdomain',
      :user_name            => nil,
      :password             => nil,
      :authentication       => nil,
      :enable_starttls      => nil,
      :enable_starttls_auto => true,
      :openssl_verify_mode  => nil,
      :ssl                  => nil,
      :tls                  => nil,
      :open_timeout         => nil,
      :read_timeout         => nil
    }

Измените строки, относящиеся к домену.

    DEFAULTS = {
      :address              => 'conversation.sevarg.net',
      :port                 => 25,
      :domain               => 'conversation.sevarg.net',
      :user_name            => nil,
      :password             => nil,
      :authentication       => nil,
      :enable_starttls      => nil,
      :enable_starttls_auto => true,
      :openssl_verify_mode  => nil,
      :ssl                  => nil,
      :tls                  => nil,
      :open_timeout         => nil,
      :read_timeout         => nil
    }

Я не знаю, какая из них имеет значение, но изменение обеих решило проблему. Очевидно, используйте свой домен…

Выйдите из среды приложения.

./launcher restart app

Теперь оно должно быть способно отправлять письма.

Ожидаю, что это изменение не сохранится после обновлений.

Однако сейчас я успешно отправляю и получаю письма, как и ожидалось.

Разработчики? Пожалуйста, исправьте это?

Из сообщения об ошибке, которое я отправил, попробуйте следующее:

Добавьте

DISCOURSE_SMTP_DOMAIN: [ваш домен установки]

в ваш файл app.yml (/var/discourse/containers/app.yml, скорее всего).

Затем пересоберите приложение (cd /var/discourse; ./launcher rebuild app) и попробуйте отправить электронные письма.

Чтобы прояснить вопрос: является ли DISCOURSE_SMTP_DOMAIN доменом моего сервера Discourse или доменом электронной почты?

Например, мой сервер находится на поддомене community.acescentral.com, а письма отправляются с адреса admin@acescentral.com. Значит ли это, что DISCOURSE_SMTP_DOMAIN — это основной домен acescentral.com или поддомен community?

Огромное спасибо за вашу настойчивость в решении этой проблемы.