Problema de Configuração de E-mail [Zoho]

Estou configurando uma nova instalação no Ubuntu, estou usando o Zoho como meu provedor de e-mail. Eu ativei a 2FA para a conta de administrador, mas não para a conta noreply, então estou usando a senha do aplicativo 2FA que criei para a senha SMTP.

Estou com o site rodando atrás do NGINX, os e-mails são o único problema que estou enfrentando atualmente.

Aqui está a saída do meu discourse doctor:

DISCOURSE DOCTOR Dom Nov 23 06:50:30 UTC 2025

OS: Linux node-1 6.8.0-87-generic #88-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 09:28:41 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux




Found containers/app.yml




==================== YML SETTINGS ====================

DISCOURSE_HOSTNAME=forums.website.co.uk

SMTP_ADDRESS=smtp.zoho.eu

DEVELOPER_EMAILS=REDACTED 

SMTP_PASSWORD=REDACTED 

SMTP_PORT=587




LETSENCRYPT_ACCOUNT_EMAIL=REDACTED




==================== DOCKER INFO ====================

DOCKER VERSION: Docker version 29.0.2, build 8108357




DOCKER PROCESSES (docker ps -a)




CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                     NAMES

706f63d5ced8   local_discourse/app   "/sbin/boot"   11 minutes ago   Up 11 minutes   0.0.0.0:9888->80/tcp, [::]:9888->80/tcp   app




Discourse container app is running




==================== PLUGINS ====================

          - git clone https://github.com/discourse/docker_manager.git




No non-official plugins detected.




See https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb for the official list.




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

Discourse version at forums.website.co.uk: NOT FOUND

Discourse version at localhost: NOT FOUND




==================== MEMORY INFORMATION ====================

OS: Linux

RAM (MB): 59013




               total        used        free      shared  buff/cache   available

Mem:           56279        3618       39659         124       13752       52661

Swap:           8191           0        8191




==================== DISK SPACE CHECK ====================

---------- OS Disk Space ----------

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       6.5T   20G  6.2T   1% /




==================== DISK INFORMATION ====================

Disk /dev/sda: 6.55 TiB, 7201260396544 bytes, 14064961712 sectors

Disk model: LOGICAL VOLUME  

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 1572864 bytes

Disklabel type: gpt

Disk identifier: F7288ACB-CABA-4C6C-8024-D51FD6F8704E

Device     Start         End     Sectors  Size Type

/dev/sda1   2048        4095        2048    1M BIOS boot

/dev/sda2   4096 14064959487 14064955392  6.5T Linux filesystem




==================== END DISK INFORMATION ====================




==================== MAIL TEST ====================

For a robust test, get an address from http://www.mail-tester.com/

Sending mail to REDACTED  . . 

Testing sending to jordan@website.co.uk using smtp.zoho.eu:587, username:admin@website.co.uk with login auth.

SMTP server connection successful.

Sending to jordan@website.co.uk…

==================================== ERROR =====================================

Sending mail failed:

EOFError: end of file reached

=================================== SOLUTION ===================================

Post this output to https://meta.discourse.org/ for assistance.

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




==================== DONE! ====================

Minha configuração do app.yml:

## this is the all-in-one, standalone Discourse Docker container template

##

## After making changes to this file, you MUST rebuild

## /var/discourse/launcher rebuild app

##

## BE *VERY* CAREFUL WHEN EDITING!

## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!

## visit http://www.yamllint.com/ to validate this file as needed




templates:

  - "templates/postgres.template.yml"

  - "templates/redis.template.yml"

  - "templates/web.template.yml"

  - "templates/web.ratelimited.template.yml"

  ## Uncomment these two lines if you wish to add Lets Encrypt (https)

  ## - "templates/web.ssl.template.yml"

  ## - "templates/web.letsencrypt.ssl.template.yml"




## which TCP/IP ports should this container expose?

## If you want Discourse to share a port with another webserver like Apache or nginx,

## see 
 for details

expose:

  - "9888:80"   # http
#  - "443:443" # https




params:

  db_default_text_search_config: "pg_catalog.english"




  ## Set db_shared_buffers to a max of 25% of the total memory.

  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "4096MB"




  ## can improve sorting performance, but adds memory usage per-connection

  #db_work_mem: "40MB"




  ## Which Git revision should this container use? (default: latest)

  #version: latest




env:

  LC_ALL: en_US.UTF-8

  LANG: en_US.UTF-8

  LANGUAGE: en_US.UTF-8

  # DISCOURSE_DEFAULT_LOCALE: en




  ## How many concurrent web requests are supported? Depends on memory and CPU cores.

  ## will be set automatically by bootstrap based on detected CPUs, or you can override

  UNICORN_WORKERS: 8




  ## TODO: The domain name this Discourse instance will respond to

  ## Required. Discourse will not work with a bare IP number.

  DISCOURSE_HOSTNAME: forums.website.co.uk




  ## Uncomment if you want the container to be started with the same

  ## hostname (-h option) as specified above (default "$hostname-$config")

  #DOCKER_USE_HOSTNAME: true




  ## TODO: List of comma delimited emails that will be made admin and developer

  ## on initial signup example 'user1@example.com,user2@example.com'

  DISCOURSE_DEVELOPER_EMAILS: 'blood@website.co.uk,admin@website.co.uk'




  ## TODO: Configure the mail server

  ##       (used for validation of new accounts, notifications, digests, etc.)

  ## required: hostname of the SMTP mail server used to send mail

  DISCOURSE_SMTP_ADDRESS: smtp.zoho.eu

  ## uncomment to set the port to something other than the default (25)

  DISCOURSE_SMTP_PORT: 587

  ## USER_NAME / PASSWORD required if the SMTP provider needs authentication

  ## WARNING: a '#' in the SMTP password can be misinterpreted; ensure it's inside string quotes, e.g.:

  ##   DISCOURSE_SMTP_PASSWORD: "#pass#ord"

  DISCOURSE_SMTP_USER_NAME: admin@website.co.uk

  DISCOURSE_SMTP_PASSWORD: "app-password"

  ## uncomment to enable implicit TLS at connection time, probably needed for using port 465

  DISCOURSE_SMTP_FORCE_TLS: false

  DISCOURSE_SMTP_ENABLE_START_TLS: true

  ## uncomment to set the HELO/EHLO domain, only set if required by provider

  DISCOURSE_SMTP_DOMAIN: website.co.uk

  ## the address from which notifications are sent

  DISCOURSE_NOTIFICATION_EMAIL: noreply@wesbite.co.uk

  ## uncomment to change server certificate verification

  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none # peer|none

  ## uncomment to override the authentication method

  DISCOURSE_SMTP_AUTHENTICATION: login # plain|login|cram_md5




  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate

  LETSENCRYPT_ACCOUNT_EMAIL: me@example.com




  ## The http or https CDN address for this Discourse instance (configured to pull)

  ## see 
 for details

  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com




  ## The maxmind geolocation IP account ID and license key for IP address lookups

  ## see 
 for details

  #DISCOURSE_MAXMIND_ACCOUNT_ID: 123456

  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456




## The Docker container is stateless; all data is stored in /shared

volumes:

  - volume:

      host: /var/discourse/shared/standalone

      guest: /shared

  - volume:

      host: /var/discourse/shared/standalone/log/var-log

      guest: /var/log




## Plugins go here

## see 
 for details

hooks:

  after_code:

    - exec:

        cd: $home/plugins

        cmd:

          - git clone https://github.com/discourse/docker_manager.git




## Any custom commands to run after building

run:

  - exec: echo "Beginning of custom commands"

  ## If you want to set the 'From' email address for your first registration, uncomment and change:

  ## After getting the first signup email, re-comment the line. It only needs to run once.

  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"

  - exec: echo "End of custom commands"

Eu também testei o handshake com o OpenSSL e ele está me dando luz verde.

Atualmente, não sei qual é o problema para isso não estar funcionando. Eu tenho o PiHole configurado na frente na rede, embora eu tenha o mesmo e-mail noreply enviando e-mails da minha configuração do VaultWarden.

(Sim, estou buscando mais uma instalação anual (espero) e cheguei mais longe do que qualquer outra tentativa até agora.)

Qualquer ajuda seria muito apreciada,
~Blood