Smtp_应拒绝 nounces 上的 400 错误请求

你好!

我遇到的问题与这里描述的完全一样:Configure direct-delivery incoming email for self-hosted sites with Mail-Receiver - #482 by Carleas

问题似乎是,我收到的退信没有 from 地址,因此当 API 调用如下时:https://forum.example.com/admin/email/smtp_should_reject.json?from=&to=replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com,它会返回一个 400 错误,并显示:

{"errors":["param is missing or the value is empty or invalid: from"]}

这是 mail-receiver 日志中的一些内容:

Nov 03 07:34:53 mail postfix/smtpd[1044]: connect from v-108-120-yyy-74-srvr1.xxx.com[74.91.xxx.108]
<19>Nov  3 07:34:53 discourse-smtp-fast-rejection[1048]: Failed to GET smtp_should_reject answer from https://forum.example.com/admin/email/smtp_should_reject.json: 400<22>Nov  3 07:34:53 policyd-spf[1049]: : prepend Received-SPF: None (no SPF record) identity=helo; client-ip=74.91.xxx.108; helo=v-148-29-xxx-192-srvr1.xxx.com; envelope-from=<> ; receiver=mail.forum.example.com Nov 03 07:34:53 mail postfix/smtpd[1044]: NOQUEUE: reject: RCPT from v-108-120-yyy-74-srvr1.xxx.com[74.91.xxx.108]: 450 4.7.1 <replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com>: Recipient address rejected: Internal error, API request failed; from=<> to=<replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com> proto=ESMTP helo=<v-148-29-xxx-192-srvr1.xxx.com>

然而,即使它带有正确的 from 地址(将我的电子邮件地址放在那里),它也会返回:

{"reject":true,"reason":"Mail to this address is not accepted. Check the address and try to send again?"}

因此,它也会拒绝该邮件……

是我在配置上有什么遗漏吗?我弄不明白。

1 个赞

您好!抱歉,但似乎您的话题没有引起关注。您是否自行解决了问题?

您使用的是哪个邮件提供商?

不,很遗憾,我没有收到退信……

不过我使用的是 CPanel 的 SMTP 服务器。

您的外发邮件提供商呢?您使用的是 Mailgun 还是其他交易邮件提供商?

不。相同的 SMTP,出站工作正常,主题的入站也正常到达,问题是论坛看不到退信,所以它会一直尝试,我的托管服务提供商会因此责骂我。

我将此内容转到 #hosting。

对于这类问题,官方通常的回答是“邮件发送很难”。如果您使用事务性邮件提供商,您将获得更好的结果。

如果您有预算,可以在 Marketplace 发布,或者我可以帮您将此话题移到那里。

感谢您花时间与我一起研究这个问题!

1 个赞

您好 DevTeVe,

我已经审阅了相关代码,我认为您说得对——我认为 smtp_should_reject 代码可能错误地拒绝了退信和回复。

我将把这个问题上报给内部处理。

在此期间,如果您禁用 discourse-smtp-fast-rejection 策略过滤器,邮件是否可以正常发送?

2 个赞

哇!感谢你升级此事!我有点绝望,哈哈哈!我将尝试禁用 discourse-smtp-fast-rejection虽然我不知道如何禁用,但我会搜索并汇报

1 个赞

如果您可以从 mail-receiver postfix 配置文件中删除此行:

smtpd_recipient_restrictions = check_policy_service unix:private/policy

这应该能解决问题 - 我没有测试过,但我认为它会起作用:

postconf -e "smtpd_recipient_restrictions ="
1 个赞

成功!

我正在像这样配置我的 mail-receiver.yaml暂时还是永远?@supermathie

# 这是入站邮件接收器容器模板
##
## 修改此文件后,您必须重建
## /var/discourse/launcher rebuild mail-receiver
##
## 编辑时请*非常小心*!
## YAML 文件对空格或对齐错误非常非常敏感!
## 如有需要,请访问 http://www.yamllint.com/ 来验证此文件

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

  ## 应该发送到您的论坛的电子邮件地址。通常情况下,这完全没问题
  ## 使用与论坛本身相同的域名。
  MAIL_DOMAIN: community.example.com
# 取消注释这些(以及下面的卷!)以支持 TLS
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/community.example.com/community.example.com.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/community.example.com/community.example.com.crt
  POSTCONF_smtpd_tls_security_level: may
  POSTCONF_myhostname: community.example.com
  POSTCONF_mynetworks: "127.0.0.0/8 [::1]/128 [fe80::]/64 172.17.0.0/16"
  POSTCONF_smtpd_recipient_restrictions: ""
  ## 此 Discourse 实例的基础 URL。
  ## 这将是您的 Discourse 站点 URL。例如,
  ## https://discourse.example.com。如果您正在运行子文件夹设置,
  ## 请务必考虑这一点(例如 https://example.com/forum)。
  DISCOURSE_BASE_URL: 'https://community.example.com'

  ## 您的 Discourse 论坛的主 API 密钥。您可以从
  ## 管理面板的“API”选项卡中获取。
  DISCOURSE_API_KEY: <YOURKEY>

  ## 用于处理入站电子邮件的用户名。除非您
  ## 重命名了 `system` 用户,否则应保持原样。
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# 取消注释以支持 TLS
  - volume:
      host: /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
      guest: /letsencrypt
1 个赞

我们暂时采用“暂时”,一旦有更多消息,我们会更新此主题。

3 个赞

非常感谢!我真的没想到事情能有进一步的发展,但现在一切都很完美,而且我收到了所有其他的退信!

3 个赞