Hostmail 설정 중 발생하는 문제

안녕하세요. 스레드를 무단으로 가져다 쓰는 것이 괜찮을지 모르겠습니다.

제 호스팅 제공업체의 이메일에는 문제가 없습니다. 다양한 도구를 이용한 모든 테스트가 성공적으로 수행되며, 포트가 열려 있고 메일을 보낼 수 있는 상태입니다. 문제는 Discourse에서는 작동하지 않는다는 것입니다.

https://carlosthomas.net/photos/picture.php?/911/category/8

어떤 포트를 시도하든 동일한 오류가 발생합니다.

수동으로 계정을 생성하고 로그인할 수는 있지만, 초대와 인증을 위해서는 이메일이 필요합니다. MailGun으로 테스트해 보니 정상적으로 작동합니다. 하지만 제 호스팅 제공업체에서는 왜 작동하지 않는지 이해가 되지 않습니다. 제공업체에 문의해 보니 모든 것이 정상이라고 하므로, 당혹스러운 상황입니다.

https://carlosthomas.net/photos/picture.php?/913/category/8

신규 사용자라 링크를 두 개만 올릴 수 있습니다. 하지만 이 링크들을 통해 나머지 사진들을 확인하실 수 있을 것입니다.

확인해 주셨으면 하는 로그가 있다면 알려주세요. *NIX 경험은 제한적이지만, 지시를 따를 수는 있습니다. 미리 감사합니다.

분리/이동을 도와주셔서 감사합니다 @JammyDodger. 이 문제에 대한 도움을 받을 수 있기를 바랍니다. 이 서버는 영구적인 것이 아니라 테스트용으로 사용되므로, 해결책을 찾기 위해 필요한 로그나 명령어를 실행하는 데 문제가 없습니다.

기본적으로 이메일은 MailGun을 통해 (대부분) 잘 작동하지만 호스팅 제공업체를 통해서는 작동하지 않습니다. MailGun에서 무료 서비스(GMAIL 등)로 보내는 이메일은 정상적으로 전송됩니다. 그러나 MailGun에서 제 도메인/호스팅된 이메일로 보내려는 시도는 실패합니다. 무슨 일이 일어나고 있는지 정확히 모르겠습니다. 도메인 이메일은 다른 모든 애플리케이션(OSTicket/InvoiceNinja/Windows Mail/ThunderBird 등)에서는 아주 잘 작동합니다.

도움을 주시면 감사하겠습니다. 미리 감사합니다.

호스트메일 자격 증명이 다른 도구에서는 정상적으로 작동하고, 디스코urs 설정에 올바르게 붙여넣었다면 꽤 이상한 상황이 맞습니다. 호스트메일 도메인을 차단할 수 있는 보안 도구가 있나요?

<discourse_url>/logs를 확인하여 어떤 일이 일어나고 있는지 상세한 오류를 살펴볼 수도 있습니다.

답장 주셔서 감사합니다. 몇 가지 정보를 드리겠습니다.

Message (12 copies reported)

Job exception: execution expired


Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `open'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `tcp_socket'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:641:in `block in do_start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/timeout-0.4.0/lib/timeout.rb:186:in `block in timeout'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/timeout-0.4.0/lib/timeout.rb:193:in `timeout'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:640:in `do_start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:610:in `start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'

정리하자면, "hostmail"은 테스트 중인 도메인(discourse.carlosthomas.net)의 호스팅 제공업체(GlowHost) 이메일이므로 제가 붙인 이름일 뿐입니다. MailGun에서는 대부분 잘 작동하지만, 호스팅된 이메일에서는 작동하지 않습니다.

/logs 디렉토리가 있다는 사실은 몰랐습니다. 설정을 다시 구성하고 로그를 지운 후 이메일을 시도해서 정보를 공유해 드릴 수도 있습니다. 아니면 지금 로그를 지운 뒤 Gmail로 보내면 성공할 것이고, 그 다음 호스팅된 이메일로 보내면 실패할 것이므로, 그렇게 한 후 로그를 보내 드릴 수도 있습니다.

추가 맥락을 설명해 드리겠습니다. 친구들이 vBulletin 4.2.5로 사이트를 운영하고 있고, 저는 그 사이트가 어떤 느낌인지 파악할 수 있도록 임시로 Discourse를 호스팅해 주고 있습니다. 문제는 이메일입니다. 지침을 따라 수동으로 계정을 생성하는 정도는 가능하지만, Discourse를 선택하게 된다면 사용자를 추가하려면 이메일 설정이 필수적입니다. 또한 데이터 가져오기(import) 부분도 있는데, 도움이 될 것 같아 이 링크를 찾았습니다.

하지만 이메일 문제는 반드시 해결해야 합니다. 이 문제가 해결될 때까지 Discourse가 설치된 서버는 계속 켜 두겠습니다. 그리고 저는 지원(support) 환경이 어떤지 보여드리고자 합니다. 포럼에서 확인한 세부 사항과 제가 직접 경험한 바에 따르면, 플랫폼 호스팅 요건을 충족한 후에는 사용법, 마이그레이션 및 지원이 비교적 수월할 것으로 보입니다. 공식 방법을 사용하는 경우 지원 요청도 충분히 쉬울 것입니다.

하지만 현재는 이 정도 상태입니다. 피드백을 기다리고 있습니다.

안녕하세요, 여러분. 주말에 상황이 순조롭게 진행된다면 몇 가지 작업을 시도해 볼 계획입니다. 시스템을 초기화하고 재설치한 뒤 진행 상황을 공유하겠습니다. 그 전에 제안 사항이 있으시면 알려 주세요.

해당 단계에 도달하면 찾을 수 있는 모든 로그를 수집하여 여기에 올리겠습니다. 도움이 필요한 사람들이 접근할 수 있도록 작업 과정에서 무작위로 생성된 비밀번호를 사용할 예정입니다. 어떻게 될지 지켜보겠습니다.

현재 app.yml 파일에 대한 점검과 변경 작업을 진행 중입니다. 로그는 이미 정리해 두었고, 이제 이메일 발송을 시도한 후 결과를 알려드리겠습니다.

수정
로그를 정리하고 Gmail 또는 제 도메인으로 이메일을 보내보았는데 오류가 발생하지 않았습니다. Gmail에는 메일이 도착하지만, 제 도메인에는 도착하지 않습니다.

MailGun 로그에는 기본적으로 다음과 같은 내용이 표시됩니다:

{
	"recipient": "me@mydomain",
	"id": "SCBCSJxDSqupdU9Da29rRw",
	"envelope": {
		"sender": "postmaster@mg.mydomain",
		"targets": "me@mydomain",
		"transport": "smtp",
		"sending-ip": "192.168.0.1"
	},
	"timestamp": 1697462206.8430145,
	"user-variables": {},
	"message": {
		"headers": {
			"from": "Discourse Test Forum <postmaster@mg.mydomain>",
			"message-id": "9d3b190d-bcbd-4378-8eb6-fc90cd57fe35@discourse.mydomain",
			"to": "me@mydomain",
			"subject": "[Discourse Test Forum] Email Deliverability Test"
		},
		"attachments": [],
		"size": 4546
	},
	"storage": {
		"region": "us-west1",
		"key": "BAABAQUOTl3y4PtvsqlN5Z2OvaxXslLlZA",
		"env": "production",
		"url": "https://storage-us-west1.api.mailgun.net/v3/domains/mg.mydomain/messages/BAABAQUOTl3y4PtvsqlN5Z2OvaxXslLlZA"
	},
	"reason": "generic",
	"delivery-status": {
		"enhanced-code": "",
		"mx-host": "mydomain",
		"description": "",
		"certificate-verified": true,
		"attempt-no": 1,
		"code": 550,
		"message": "Verification failed for <bounce+674b6a.be6180c-me=mydomain@mg.mydomain>\nThe mail server does not recognize bounce+674b6a.be6180c-me=mydomain@mg.mydomain as a valid sender.\nSender verify failed",
		"session-seconds": 40.878,
		"tls": true
	},
	"campaigns": [],
	"severity": "permanent",
	"tags": [],
	"recipient-domain": "mydomain",
	"flags": {
		"is-routed": false,
		"is-authenticated": true,
		"is-test-mode": false,
		"is-system-test": false
	},
	"log-level": "error",
	"event": "failed"
}

이 오류는 제 도메인으로 시도할 때만 발생합니다. 다른 도메인으로 시도하면 무료 메일 계정인지 여부에 관계없이 정상적으로 작동합니다.

현재 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"
  ## Uncomment the next line to enable the IPv6 listener
  #- "templates/web.ipv6.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 https://meta.discourse.org/t/17247 for details
expose:
  - "80: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: "2048MB"

  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

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: mydomain

  ## 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: 'me@mydomain'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@mg.mydomain
  DISCOURSE_SMTP_PASSWORD: "mailgunpassword"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true             # (optional, default true)
  #DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_DOMAIN: mydomain
  DISCOURSE_NOTIFICATION_EMAIL: postmaster@mg.mydomain


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

  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #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 https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-docs.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"

솔직히 이 파일에 적용된 유일한 변경 사항은 다음과 같습니다:

DISCOURSE_SMTP_ADDRESS: smtp.mydomain
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email@mydomain
  DISCOURSE_SMTP_PASSWORD: "mydomainmailpassword"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true             # (optional, default true)
  #DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_DOMAIN: mydomain
  DISCOURSE_NOTIFICATION_EMAIL: email@mydomain

누군가 답장을 주면 그 변경 사항을 적용하고 로그를 다시 확인하겠습니다. 아니면… 그냥 변경을 하고 로그를 게시한 후 답장을 기다리는 것도 방법입니다. 오래 걸리지는 않을 겁니다. 지켜보겠습니다.

솔직히 나도 잘 모르겠어. :thinking: 이건 Discourse 쪽의 문제는 아닌 것 같아. 이메일은 Discourse에서 정상적으로 발송되었는데, Mailgun이 해당 이메일 주소로 전달하는 데 실패한 거야.

에러 550은 "사용자의 메일함이 사용할 수 없었음 (예: 찾을 수 없음)"을 의미해.

답변 감사합니다. 무슨 문제인지 모르겠어요 - 이메일은 정상적으로 작동합니다. 그냥 제 도메인을 안 좋아하나 봅니다.

설정에서 제 도메인 이메일을 사용해 발송하도록 변경했습니다. 이제 로그를 확인해서 어떤 오류가 나는지 살펴보겠습니다.

수정
로그에는 오류가 없지만, 이 메시지가 떴습니다.

./discourse-doctor로 시도해 보겠습니다 - 하지만 /logs의 로그는 정말로 비어 있습니다.

그리고 처음에 게시했던 것과 동일한 오류가 나네요.

사용 중인 이메일 주소는 정상 작동합니다. 비밀번호를 포함한 세부 정보를 복사/붙여넣기했습니다. 같은 이메일을 Thunderbird / Windows Mail에서 테스트해 봤는데 전혀 문제가 없었습니다. 그래서…

이전에 호스팅 제공업체 지원에 문의했는데, 다음과 같은 답변을 받았습니다.

그래서 모르겠네요. 제가 놓치고 있는 것이 있을까요? 테스트 이메일은 465 / 587 포트에서 정상 작동하고 문제가 없습니다. 도무지 모르겠습니다.

이메일 설정에서 차단되거나 문제를 일으킬 수 있는 특수 문자가 있을까요?

설정을 포트 465로 변경했는데 /logs에는 이것만 보입니다.

별다른 문제는 아닌 것 같습니다.

지금까지 도움을 주신 @Arkshine님께 감사의 말씀을 전하고 싶습니다. apparently VPS가 호스팅된 도메인에 도달하지 못하는 것 같습니다. 그래서 이메일이 작동하지 않는 것입니다. 좀 이상하긴 하지만, 확인을 위해 호스팅 제공업체에 연락할 예정입니다. 업데이트해 드리겠습니다.

꽤 빠르고 쉬웠습니다. Discourse가 실행 중인 VPS에서 SSH 세션을 통해 호스팅된 도메인에 간단한 ping을 보냈더니 문제가 무엇인지 바로 드러났습니다. 어떻게 될지 지켜보겠습니다.

수정
@Arkshine님이 답글을 주셨다면 그 답을 해결책으로 표시할 수 있었을 텐데 좀 아쉬웠습니다. 어쨌든 호스팅 제공업체로부터 연락을 받았습니다. apparently 그들의 서버가 SMTP 실패 시도로 인해 VPS IP를 자동으로 차단했다고 합니다. 그 이유가 뭔지는 모르겠지만, 설정을 변경하고 다시 테스트를 해볼 예정입니다. 이제 괜찮을 것 같습니다 - VPS에서 호스팅된 IP에 ping이 가능합니다. 이메일 설정을 테스트해 보았고, 이제 준비 완료 상태입니다!

이 정보가 누군가에게 도움이 되기를 바랍니다. OP를 수정할 수 있다면 TLDR을 넣거나, 해결책으로 가도록 링크를 클릭할 수 있도록 했을 텐데.

다시 한번 - 모든 도움에 대해 @Arkshine님께 감사드립니다. 좋은 작업 계속해 주세요!

동의합니다. 정말 큰 도움이 되고 좋은 자료가 됩니다. :slight_smile:

그의 DP와 프로필 배경이 정말 멋지다는 것도 언급하고 싶다. 마음에 든다.