【问题标题】:How to make sure email is not received in spam when sent with Django EmailMessage class?如何确保在使用 Django EmailMessage 类发送时不会在垃圾邮件中收到电子邮件?
【发布时间】:2018-04-19 08:43:45
【问题描述】:

我的settings.py 文件中有以下设置。

EMAIL_HOST = 'mail.domain.com'
EMAIL_HOST_USER = 'me@domain.com'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

我的 Django 应用程序中的用户可以使用 EmailMessage 类向客户端发送带有 PDF 附件的电子邮件。代码如下:

email = EmailMessage()
email.subject = 'Demo subject'
email.body = self.request.GET.get('email_body', '')
email.from_email = 'Full Name <user@domain.com>'
email.to = ['{}'.format(self.request.GET.get('to_address'))]

email.attach_file(os.path.join(settings.MEDIA_ROOT, 'quotation_email.pdf'))

email.send()

我的问题是,

  1. 由于我可以创建代码以其他人的身份发送电子邮件,因此电子邮件不会在某些域中被标记为垃圾邮件吗?

  2. 我可以访问已经设置好的邮件服务器。我可以将电子邮件帐户映射到 Django 应用程序中的用户帐户,以便 Django 使用电子邮件服务器作为媒介根据登录的用户发送电子邮件吗?

  3. 当我可能永远不会使用该电子邮件帐户发送任何邮件时,为什么我需要在 settings.py 文件中提供电子邮件和密码?每次有人发邮件我都不能登录邮箱吗?

【问题讨论】:

  • 在您的情况下,我将使用mailgun.commandrill.com 等免费服务。在 Django 中配置非常容易,他们的邮件服务器也从黑名单中清除。
  • 但是我必须使用为我提供了配置信息的邮件服务器。客户已经为他的办公室运行了一个电子邮件服务器。我需要用它来发送电子邮件。

标签: django email spam


【解决方案1】:
  1. 由于我可以创建代码以其他人的身份发送电子邮件,因此该电子邮件不会在某些域中被标记为垃圾邮件吗?

电子邮件的域部分(@ 之后的部分)主要决定电子邮件是否最终成为垃圾邮件(当然,确定垃圾邮件的其他条件,例如发送邮件服务器的 IP 信誉即此 IP 过去是否用于发送垃圾邮件等)。

如果您是特定域的授权发件人,您可以发送john@domain.comno-reply@domain.com 之类的电子邮件而无需担心。

阅读有关域授权的 SPF 和 DKIM 记录。这是一个我无法在答案中真正涵盖的主题。

  1. 我可以访问已经设置好的邮件服务器。我是否可以将电子邮件帐户映射到 Django 应用程序中的用户帐户,这样 Django 使用电子邮件服务器作为媒介根据登录的用户发送电子邮件?

是的,如果您拥有电子邮件的域名,则可以。只需获取用户的电子邮件地址并将其用作From 地址即可发送电子邮件。

  1. 当我可能永远不会使用该电子邮件帐户发送任何邮件时,为什么我需要在 settings.py 文件中提供电子邮件和密码?每次有人发送电子邮件时我都不能登录电子邮件吗?

你指的是EMAIL_HOST_USER吗?这是出于身份验证目的。此电子邮件是登录您的 SMTP 服务器所必需的。没有这个,SMTP 服务器将不知道您是服务器的所有者还是试图使用他们的服务器发送垃圾邮件的垃圾邮件发送者。

但是如果 SMTP 服务器在本地运行,您可以只使用 localhost 作为 EMAIL_HOST 并省略身份验证。因为大多数电子邮件服务器 (MTA) 从本地主机中继电子邮件而无需身份验证。但这也取决于配置。



对电子邮件发送方式的基本了解:

电子邮件就像真正的邮件一样发送 - 在信封中。信封和里面的信可以有不同的From 地址。对于电子邮件也是如此。

这是一个说明性示例。假设您拥有PO Box。如果你想给你的朋友写信,你可以这样做:

  1. 在纸上写下您的信息。您将在这封信上签名。
  2. 买一个信封。在信封上写上您朋友的To 地址。
  3. 在信封上写上您的邮政信箱的From 地址。您不要写自己的地址,因为如果邮件无法送达,它会被退回到您的邮政信箱。
  4. 寄出这封信。

漂亮,简单。假设你家里的某个人也想给他们认识的人寄一封信。但他们没有邮政信箱。他们必须花费一些金钱和时间来获得一个邮政信箱。但是为什么要麻烦,因为你已经有了一个。这就是它的工作方式:

  1. 他们会将消息写在纸上。他们会以自己的名义在这封信上签名。
  2. 买一个信封。写下他们朋友的To 地址。
  3. 写上您的邮箱From地址,这样如果邮件没有送达,可以退回到您的邮箱。
  4. 把信寄出去。

这就是实际电子邮件的工作方式。

  1. SMTP 服务器就像邮局。
  2. 您的电子邮件帐户就像一个邮政信箱。
  3. 您发送的每条消息都放在一个信封中。
  4. 信封上的发件人地址可以与发件人不同
    地址在邮件里面。

我认为 Django 使用EMAIL_HOST_USER 设置来编写电子邮件信封,并且您提供的from_email 地址用作From 地址。

信封上的发件人地址称为MAIL FROM 地址或Return-Path 地址。这不会显示给接收用户。您在 Gmail 或 Yahoo Mail 中看到的From 地址称为MIME From 地址。它们都可以不同。

【讨论】:

  • 这是一个非常详细的答案。根据您的第三个答案,如果我们的两封电子邮件来自同一服务器,我可以使用您的电子邮件地址向其他人发送电子邮件吗?即使我不知道您的电子邮件密码?!如果它追溯到发件人并看到发件人是我并且我只是在From字段中使用了您的电子邮件,那么收件人是否不会将其标记为垃圾邮件?
  • @MiniGunnR EMAIL_HOST_USEREMAIL_HOST_USER 设置仅用于验证进入 SMTP 服务器,以获得使用 SMTP 服务器发送邮件的权限。通过身份验证后,您可以从该域的任何地址发送电子邮件。它不会被标记为垃圾邮件。这就像您登录到您的计算机,但随后您可以让其他人使用您的计算机。
  • @MiniGunnR 接收服务器不关心电子邮件地址。只要发送服务器是该域的授权发件人。您一定注意到了一些类似no-reply@domain.com 的电子邮件。但是no-reply 用户并不存在。电子邮件仍会送达。
  • @MiniGunnR 我已经用更多解释更新了答案。
  • 感谢您抽出宝贵时间撰写此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2012-05-27
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多