Receptor de e-mail não entregará e-mails para o Discourse

Cometi esse erro e deixei discourse.example.com no arquivo mail-receiver.yml.

Já corrigi isso, mas o mail-receiver parece não estar ‘recebendo’ os novos detalhes.
Como faço para ‘reiniciar’ o mail-receiver (por exemplo, qual é o comando equivalente a ./launcher rebuild app?).

Editar: Não li o post anterior com atenção suficiente, o comando é ./launcher rebuild mail_receiver.

1 curtida

Estou enfrentando um novo problema em que o mail-receiver não entrega e-mails para o Discourse — tentei procurar ajuda, mas sem sucesso.

Logs:

Starting Postfix
Dec 14 03:12:32 forum-mail-receiver postfix/master[1]: daemon started -- version 3.5.6, configuration /etc/postfix
Dec 14 03:15:47 forum-mail-receiver postfix/smtpd[113]: connect from mail-pl1-f169.google.com[209.85.214.169]
Dec 14 03:15:47 forum-mail-receiver postfix/smtpd[113]: 821CB37A659: client=mail-pl1-f169.google.com[209.85.214.169]
Dec 14 03:15:47 forum-mail-receiver postfix/cleanup[120]: 821CB37A659: message-id=<602f2194be912e92b969eacf5eac26e2@frontapp.com>
Dec 14 03:15:47 forum-mail-receiver postfix/qmgr[98]: 821CB37A659: from=<[my personal email address]>, size=4086, nrcpt=1 (queue active)
<23>Dec 14 03:15:47 receive-mail[122]: Recipient: nobody@[my forum URL]
Dec 14 03:16:20 forum-mail-receiver postfix/smtpd[113]: disconnect from mail-pl1-f169.google.com[209.85.214.169] ehlo=1 mail=1 rcpt=1 bdat=1 quit=1 commands=5
<19>Dec 14 03:16:47 receive-mail[122]: Failed to POST the e-mail to [my forum URL]/admin/email/handle_mail: execution expired (Net::OpenTimeout)
<19>Dec 14 03:16:47 receive-mail[122]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'
Dec 14 03:16:47 forum-mail-receiver postfix/pipe[121]: 821CB37A659: to=<nobody@[my forum URL]>, relay=discourse, delay=60, delays=0.17/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 14 03:17:32 forum-mail-receiver postfix/qmgr[98]: 7C67437A663: from=<[my personal email address]>, size=4093, nrcpt=1 (queue active)

Alguma ideia do que pode estar causando isso?

O arquivo mail-receiver.yml é válido e verifiquei se há erros de digitação:

Este é o escopo da minha chave de API:

O e-mail está chegando ao mail-receiver, mas está apenas na fila de e-mails (mailq):

Alternativamente, existe alguma maneira de excluir completamente o contêiner mail-receiver e começar de novo?

O problema pode ser que você não tenha a chave da API configurada

Obrigado pela resposta @pfaffman… está definitivamente configurado no meu arquivo de configuração mail-receiver.yml. Deveria estar entre aspas?

 (Net::OpenTimeout)

Esse é o seu problema. O receptor de e-mail não consegue acessar a URL do seu fórum. Portanto, ou você tem a URL errada de alguma forma ou há algum problema de rede no docker entre o receptor de e-mail e o seu fórum, eu acho.

Como posso solucionar mais problemas?

ping forum.[mydomain].co.nz

de dentro do mailq mostra:

64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from [ip].vultrusercontent.com ([ip]): icmp_seq=3 ttl=64 time=0.069 ms

e assim por diante, mostrando que a conexão é bem-sucedida.
forum.[mydomain].co.nz é onde o fórum está hospedado, e este mesmo URL é usado em MAIL_DOMAIN e DISCOURSE_MAIL_ENDPOINT.

Olhando mais de perto as configurações do mail-receiver.yml, estou perdendo aspas ou https:// em algum lugar onde deveria ter?

## este é o template do container do receptor de e-mail
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild mail-receiver
##
## TENHA MUITO CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

base_image: discourse/mail-receiver:release
update_pups: false

expose:
  - "25:25"   # SMTP

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  ## Para onde o e-mail para o seu fórum deve ser enviado. Em geral, é perfeitamente aceitável
  ## usar o mesmo domínio do fórum aqui.
  MAIL_DOMAIN: forum.[domain].co.nz
# descomente estas (e o volume abaixo!) para suportar TLS
#  POSTCONF_smtpd_tls_key_file:  /letsencrypt/discourse.example.com/discourse.example.com.key
#  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/discourse.example.com/fullchain.cer
#  POSTCONF_smtpd_tls_security_level: may


  ## O URL do endpoint de processamento de e-mail do seu fórum Discourse.
  ## Este é simplesmente o URL base do seu fórum, com `/admin/email/handle_mail`
  ## anexado. Tenha cuidado se você estiver executando uma configuração de subpasta -- nesse caso,
  ## o URL precisa incluir a subpasta!
  DISCOURSE_MAIL_ENDPOINT: 'https://forum.[domain].co.nz/admin/email/handle_mail'

  ## A chave API principal do seu fórum Discourse. Você pode obtê-la na
  ## aba "API" do seu painel de administração.
  DISCOURSE_API_KEY: 639[rest of API key]884ef

  ## O nome de usuário a ser usado para processar e-mails recebidos. A menos que você tenha
  ## renomeado o usuário `system`, você deve deixar isso como está.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# descomente para suportar TLS
#  - volume:
#      host: /var/discourse/shared/standalone/letsencrypt
#      guest: /letsencrypt

Você está executando o ping dentro do contêiner, ou seja, depois de executar primeiro ./launcher enter mail-receiver?

Também vale a pena notar que o ping (tipicamente ICMP) é diferente de conectar-se a http/https (TCP) e pode se comportar de maneira diferente dependendo de muitos fatores na configuração da rede.

Eu tentaria usar curl após entrar no contêiner para ver se ele consegue se conectar ao seu fórum via https, por exemplo:

cd /var/discourse
./launcher enter mail-receiver
curl -v https://forum.[domain].co.nz

Se estiver funcionando, ele imprimirá um monte de HTML. Se não estiver, ele mostrará algum erro e -v fará com que ele imprima muitas informações ao longo do caminho, o que pode ajudar a revelar por que falhou.

Se falhar, também vale a pena tentar executar o mesmo comando curl fora do contêiner para identificar se é específico do contêiner ou do sistema host em geral.

3 curtidas

Obrigado @Simon_Manning, sua ajuda é muito apreciada! Eu não sabia que conexões via ping não são necessariamente as mesmas que conexões via curl.

Eu estava executando o ping dentro do contêiner, e ele foi bem-sucedido.
Segui suas instruções e executei o curl dentro do contêiner, e ele falhou:

root@forum:/var/discourse# ./launcher enter mail-receiver
x86_64 arch detected.
WARNING: containers/mail-receiver.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/mail-receiver.yml
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@forum-mail-receiver:/# curl -v https://forum.[domain].co.nz
*   Trying [IPv4 address]:443...
*   Trying [IPv6 address]:443...
* Immediate connect fail for [IPv6 address]: Cannot assign requested address
* connect to [IPv4 address] port 443 failed: Connection timed out
* Failed to connect to forum.[domain].co.nz port 443: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to forum.[domain].co.nz port 443: Connection timed out

Então eu executei exit e depois curl novamente, e obtive:

root@forum:/var/discourse# curl -v https://forum.[domain].co.nz
*   Trying 127.0.1.1:443...
* Connected to forum.[domain].co.nz (127.0.1.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
...and so on.

Parece que é específico do contêiner, e não do sistema host — alguma ideia?

Eu também abri um ticket de suporte com a Vultr (provedor de VPS para esta instância) para ver se é um problema do lado deles!

O Docker cria redes virtuais para os contêineres e, na ausência de uma especificação, os contêineres usarão a rede padrão. Essa rede padrão não permite a comunicação entre contêineres.

Normalmente, isso é bom para o mail-receiver porque seu contêiner Discourse terá a porta 443 exposta fora dessa rede e, quando o mail-receiver tentar se conectar a 1.2.3.4, ele sairá da rede Docker. O sistema host (ou alguma rede mais distante) perceberá que ele só precisa voltar novamente e acabará entrando no contêiner Discourse por fora.

Duas possibilidades vêm à mente. Uma é que o mail-receiver esteja ciente do IP do contêiner Discourse ao procurar o nome do domínio e, portanto, uma conexão intra-contêiner esteja sendo bloqueada. Acho isso improvável.

A outra é que um firewall no sistema host esteja bloqueando conexões de sair de um contêiner e entrar em outro. A Vultr pode usar regras de firewall padrão que causam isso ou também me lembro vagamente que o Docker instala algumas regras no UFW por padrão, então isso pode estar relacionado se for usado.

2 curtidas

Você não pode usar https porque não descomentou estas linhas:

Isso se aplica apenas ao suporte TLS no lado do servidor de e-mail, ou seja, para que outros servidores de e-mail possam entregar e-mails para o mail-receiver via TLS.

Vale a pena fazer, já que o contêiner Discourse evidentemente tem um certificado, mas não deve afetar a conexão do mail-receiver com o Discourse. Potencialmente, a reconstrução poderia, se por acaso corrigir algo na rede do contêiner.

Obrigado, eu descomentei essas linhas e a linha do volume.

Meu arquivo mail-receiver.yml agora se parece com isto:

root@forum:/var/discourse# cat containers/mail-receiver.yml
## este é o template do container receptor de e-mail
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild mail-receiver
##
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

base_image: discourse/mail-receiver:release
update_pups: false

expose:
  - "25:25"   # SMTP

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  ## Para onde o e-mail para o seu fórum deve ser enviado. Em geral, é perfeitamente aceitável
  ## usar o mesmo domínio do fórum aqui.
  MAIL_DOMAIN: forum.[domain].co.nz
# descomente estas (e o volume abaixo!) para suportar TLS
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/forum.[domain].co.nz/forum.[domain].co.nz.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/forum.[domain].co.nz/fullchain.cer
  POSTCONF_smtpd_tls_security_level: may


  ## O URL do endpoint de processamento de e-mail do seu fórum Discourse.
  ## Este é simplesmente o URL base do seu fórum, com `/admin/email/handle_mail`
  ## anexado. Tenha cuidado se você estiver executando uma configuração de subpasta - nesse caso,
  ## o URL precisa incluir a subpasta!
  DISCOURSE_MAIL_ENDPOINT: 'https://forum.[domain].co.nz/admin/email/handle_mail'

  ## A chave API principal do seu fórum Discourse. Você pode obtê-la na
  ## aba \"API\" do seu painel de administração.
  DISCOURSE_API_KEY: '074[rest of API key - yes I generated a new one limited to the system user]d98'

  ## O nome de usuário a ser usado para processar e-mails recebidos. A menos que você tenha
  ## renomeado o usuário `system`, você deve deixar isso como está.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# descomente para suportar TLS
  - volume:
      host: /var/discourse/shared/standalone/letsencrypt
      guest: /letsencrypt

Quando envio um novo e-mail e executo ./launcher logs mail-receiver, é isso que vejo:

Dec 21 22:41:21 forum-mail-receiver postfix/smtpd[132]: connect from mail-pj1-f54.google.com[209.85.216.54]
Dec 21 22:41:23 forum-mail-receiver postfix/smtpd[132]: 16DAC379E42: client=mail-pj1-f54.google.com[209.85.216.54]
Dec 21 22:41:23 forum-mail-receiver postfix/cleanup[139]: 16DAC379E42: message-id=<94fc2bef18b410ae8b121c6af2da2df4@frontapp.com>
Dec 21 22:41:23 forum-mail-receiver postfix/qmgr[100]: 16DAC379E42: from=<[my email address]>, size=5585, nrcpt=1 (queue active)
<23>Dec 21 22:41:23 receive-mail[141]: Recipient: nobody@forum.[domain].co.nzDec 21 22:41:50 forum-mail-receiver postfix/smtpd[143]: connect from mail-oa1-f50.google.com[209.85.160.50]
Dec 21 22:41:52 forum-mail-receiver postfix/smtpd[143]: 2E445379E48: client=mail-oa1-f50.google.com[209.85.160.50]
Dec 21 22:41:52 forum-mail-receiver postfix/cleanup[139]: 2E445379E48: message-id=<6b2f9d646dc46f4fec4af006de01d3ae@frontapp.com>
Dec 21 22:41:52 forum-mail-receiver postfix/qmgr[100]: 2E445379E48: from=<[my email address]>, size=4100, nrcpt=1 (queue active)
<23>Dec 21 22:41:52 receive-mail[147]: Recipient: nobody@forum.[domain].co.nzDec 21 22:41:53 forum-mail-receiver postfix/smtpd[132]: disconnect from mail-pj1-f54.google.com[209.85.216.54] ehlo=2 starttls=1 mail=1 rcpt=1 bdat=1 quit=1 commands=7
Dec 21 22:41:58 forum-mail-receiver postfix/qmgr[100]: 1194937A670: from=<double-bounce@forum-mail-receiver.localdomain>, size=942, nrcpt=1 (queue active)
Dec 21 22:41:58 forum-mail-receiver postfix/smtp[149]: fatal: unknown service: smtp/tcp
Dec 21 22:41:59 forum-mail-receiver postfix/qmgr[100]: warning: private/smtp socket: malformed response
Dec 21 22:41:59 forum-mail-receiver postfix/qmgr[100]: warning: transport smtp failure -- see a previous warning/fatal/panic logfile record for the problem description
Dec 21 22:41:59 forum-mail-receiver postfix/master[1]: warning: process /usr/lib/postfix/sbin/smtp pid 149 exit status 1
Dec 21 22:41:59 forum-mail-receiver postfix/master[1]: warning: /usr/lib/postfix/sbin/smtp: bad command startup -- throttling
Dec 21 22:41:59 forum-mail-receiver postfix/error[150]: 1194937A670: to=<postmaster@forum-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=1192, delays=1191/1/0/0.01, dsn=4.3.0, status=deferred (unknown mail transport error)
<19>Dec 21 22:42:23 receive-mail[141]: Failed to POST the e-mail to https://forum.sobercheck.co.nz/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Dec 21 22:42:23 receive-mail[141]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'Dec 21 22:42:23 forum-mail-receiver postfix/pipe[140]: 16DAC379E42: to=<nobody@forum.[domain].co.nz>, relay=discourse, delay=60, delays=0.23/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 21 22:42:25 forum-mail-receiver postfix/smtpd[143]: disconnect from mail-oa1-f50.google.com[209.85.160.50] ehlo=2 starttls=1 mail=1 rcpt=1 bdat=1 quit=1 commands=7
<19>Dec 21 22:42:52 receive-mail[147]: Failed to POST the e-mail to https://forum.[domain].co.nz/admin/email/handle_mail: execution expired (Net::OpenTimeout)<19>Dec 21 22:42:52 receive-mail[147]:   /usr/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `open'
  /usr/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
  /usr/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
  /usr/lib/ruby/2.7.0/net/http.rb:958:in `connect'
  /usr/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
  /usr/lib/ruby/2.7.0/net/http.rb:932:in `start'
  /usr/lib/ruby/2.7.0/net/http.rb:1483:in `request'
  /usr/local/lib/site_ruby/mail_receiver/discourse_mail_receiver.rb:43:in `process'
  /usr/local/bin/receive-mail:13:in `<main>'Dec 21 22:42:52 forum-mail-receiver postfix/pipe[146]: 2E445379E48: to=<nobody@forum.[domain].co.nz>, relay=discourse, delay=60, delays=0.15/0.01/0/60, dsn=4.3.0, status=deferred (temporary failure)
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max connection rate 1/60s for (smtp:209.85.216.54) at Dec 21 22:41:21
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max connection count 1 for (smtp:209.85.216.54) at Dec 21 22:41:21
Dec 21 22:45:45 forum-mail-receiver postfix/anvil[135]: statistics: max cache size 2 at Dec 21 22:41:50

Estou realmente preso agora, alguém tem alguma ideia do que pode estar causando isso? :grinning_face_with_smiling_eyes:

Doh! Sim. Eu confundi o TLS e o https.

Isso ainda não está funcionando, nenhum e-mail está sendo repassado de mail-receiver para Discourse.

Posso ‘desfazer’ o mail-receiver para o início (reiniciá-lo completamente) e começar de novo, na esperança de que funcione?
Como posso fazer isso?

Você pode apenas editar o arquivo e reconstruir o contêiner de e-mail.

Obrigado pela dica sobre o firewall! Eu também encontrei problemas semelhantes aos de @MathiasFoster, com o contêiner mail-receiver incapaz de alcançar o site do fórum no contêiner app. Um pouco intrigante no início, já que os contêineres estão sendo permitidos a escutar o mundo exterior sem problemas.

Eu também estou usando Vultr como meu provedor de VPS com a imagem do sistema operacional Ubuntu deles. Alguma combinação dos padrões da imagem do sistema operacional mais o Docker realmente parece bloquear a comunicação entre os contêineres.

De qualquer forma, no meu caso, foi suficiente permitir o HTTPS no host:

$ ufw allow https

Depois disso, o mail-receiver foi capaz de entregar e-mails como esperado.

1 curtida