【问题标题】:Django mail send_mail uses host IP instead of hostname returned by getfqdnDjango 邮件 send_mail 使用主机 IP 而不是 getfqdn 返回的主机名
【发布时间】:2020-02-12 09:36:18
【问题描述】:

根据documentation,django默认后端使用smtplib。

我正在使用 django email 以以下方式发送电子邮件:

email = EmailMessage(
    'Object',
    'body',
    my_from_addr,
    args.emails,
    [],
    reply_to=['my_from_addr'],
)

在 settings.py 中使用以下配置:

EMAIL_HOST = "mail_server.lan"
EMAIL_PORT = 25

我需要根据发送服务器的主机名设置 helo/ehlo 参数以符合电子邮件服务器。但是 django 似乎使用服务器的 IP 而不是主机名,直到现在我的电子邮件已被拒绝并出现错误

smtplib.SMTPRecipientsRefused: {'args.emails': (450, b'4.7.1 Client host rejected: cannot find your hostname, [192.168.1.5]')}

smtplib 文档声明here

If specified, local_hostname is used as the FQDN of the local host in the HELO/EHLO command. Otherwise, the local hostname is found using socket.getfqdn().

这实际上返回了正确的主机名:

python3 -c 'import socket; print(socket.getfqdn())'
my_proper_hostname.lan

我错过了什么吗?为什么 django 使用 IP 地址而不是真实的主机名?

【问题讨论】:

    标签: django


    【解决方案1】:

    您需要在settings.py 文件中指定主机:

    例如:

    EMAIL_HOST = 'email-smtp.eu-west-1.amazonaws.com' # specify email server address here
    

    【讨论】:

    • 那将是联系发送电子邮件的电子邮件服务器,我的问题来自客户端服务器,我可以将我的配置添加到我的帖子中
    【解决方案2】:

    这似乎是邮件服务器 mail_server.lan 上的错误配置。不在 django 中。

    SMTPRecipientsRefused 错误表示在向收件人发送电子邮件时遇到错误 - 此操作由 smtp 邮件服务器执行。

    它从 django 收到消息(因为没有连接错误),并尝试为该消息的每个收件人(到 / cc)发送单独的电子邮件。并且发送其中一个失败。

    邮件服务器与上游服务器进行类似的 helo / ehlo 协商。

    您的邮件服务器是否提供正确的邮件域/主机名?(错误消息中的 ip 表明邮件服务器正在发送 ip,而不是其域)。

    然后,许多服务器还会检查您的 ip 的 PTR 记录 - 首先,解析提供的邮件域名以获取 ip,然后解析此 ip - 获取 PTR 记录 - 检查它是否与邮件域匹配。 PTR 记录通常可以通过您的互联网提供商/主机设置。

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多