如何通过Django发送电子邮件?


153

在我的中settings.py,我具有以下内容:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# Host for sending e-mail.
EMAIL_HOST = 'localhost'

# Port for sending e-mail.
EMAIL_PORT = 1025

# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False

我的电子邮件代码:

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()

当然,如果通过设置调试服务器python -m smtpd -n -c DebuggingServer localhost:1025,则可以在终端中看到该电子邮件。

但是,实际上我该如何将电子邮件发送到user@gmail.com而不是发送到调试服务器?

阅读您的答案后,让我弄明白一点:

  1. 您不能使用localhost(简单的ubuntu pc)发送电子邮件吗?

  2. 我以为在django 1.3中send_mail()已经过时了,EmailMessage.send()取而代之的是?


2
1. 如果您在其中运行SMTP服务器,则可以使用localhost 。2.确切的机制并不重要。重要的是您有一台SMTP服务器。
伊格纳西奥·巴斯克斯

因此,如果我安装后缀,可以发送/接收电子邮件吗?您如何设置后缀来做到这一点?
德里克(Derek)

6
这个问题超出了本网站的范围。
伊格纳西奥·巴斯克斯


4
但是SEO将我们带到此页面,Ignacio。
Phlip 2015年

Answers:


53

将电子邮件发送到真实的SMTP服务器。如果您不想建立自己的公司,则可以找到可以为您经营公司的公司,例如Google自己。


3
太棒了,我只是给我自己一封电子邮件!miku提到的上述文章很完美。请注意本文评论中的小错字更正。(而且我只是使用普通的计算机/本地主机。我之前没有进行任何设置。)
user984003 2012年

166

我将Gmail用作Django的SMTP服务器。比处理postfix或任何其他服务器容易得多。我不从事电子邮件服务器的管理。

在settings.py中:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

注意:默认情况下,2016年Gmail不再允许这样做。您可以使用Sendgrid之类的外部服务,也可以按照Google的本教程来降低安全性,但可以选择以下选项:https : //support.google.com/accounts/answer/6010255


8
除了将密码保留为纯文本之外,还有其他选择吗?
ritratt

1
您可以使用类似Mandrill的电子邮件服务,该服务将允许您使用密码短语,尽管我不确定这是否对您有所帮助。您还可以使用服务器上安装的加密密钥,并使该行类似EMAIL_HOST_PASSWORD = my_decrypt('abi304hubaushl9rchy2y9fd29')
约旦,

27
将其放在环境变量中。然后,EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
我按原样使用了您的代码。几天后,我的Gmail帐户已被阻止。我的服务器每天可能发送不到20封电子邮件。有人遇到过与Google类似的问题吗?
尤金

8
SMTPAuthenticationError,我收到一封电子邮件“ 阻止登录尝试...来自不符合现代安全标准的应用程序 ”。看起来像这样。解决方法是“ 打开不安全的应用程序的访问权限 ”。那行得通
鲍勃·斯坦因

40
  1. 创建一个项目: django-admin.py startproject gmail
  2. 使用以下代码编辑settings.py:

    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = 'youremail@gmail.com'
    EMAIL_HOST_PASSWORD = 'email_password'
    EMAIL_PORT = 587
  3. 运行交互模式: python manage.py shell

  4. 导入EmailMessage模块:

    from django.core.mail import EmailMessage
  5. 发送电子邮件:

    email = EmailMessage('Subject', 'Body', to=['your@email.com'])
    email.send()

有关更多信息,请检查send_mail文档中的EmailMessage功能。

Gmail更新

另外,如果您在通过gmail发送电子邮件时遇到问题,请记住从Google 查看本指南

在您的Google帐户设置中,转到 Security > Account permissions > Access for less secure apps并启用此选项。

启用两步验证后,还要为您的gmail创建一个应用专用密码

然后,您应该在设置中使用应用专用密码。因此,更改以下行:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

另外,如果您有兴趣发送HTML电子邮件,请检查此


我按照您的步骤操作,我无法发送,
收件人

这将是 EMAIL_HOSToutlookoffice365
安图

14

我的网站位于Godaddy,我在同一网站上注册了一封私人电子邮件。这些是对我有用的设置:

在settings.py中:

EMAIL_HOST = 'mail.domain.com'
EMAIL_HOST_USER = 'abc@domain.com'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = 'abc@domain.com'
SERVER_EMAIL = 'abc@domain.com'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

在外壳中:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
email.send()

然后我得到“ 1”作为O / P,即成功。而且我也收到了邮件。:)

  • domain.com是什么意思?

谢谢,这对老项目的最简单的方法<Django的1.4
弗朗索瓦恒

13

对于Django 1.7版,如果上述解决方案不起作用,请尝试以下操作

settings.py中添加

#For email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_TLS = True

EMAIL_HOST = 'smtp.gmail.com'

EMAIL_HOST_USER = 'sender@gmail.com'

#Must generate specific password for your app in [gmail settings][1]
EMAIL_HOST_PASSWORD = 'app_specific_password'

EMAIL_PORT = 587

#This did the trick
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

最后一行完成了Django 1.7的技巧


由于某种原因,这个人不适合我。我一直在找回错误,密码错误。这很奇怪,因为我直接从Mailgun获得了凭据。
Alex Stewart

10

您需要使用smtp作为 settings.py中的后端

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

如果将后端用作控制台,则将在控制台中接收输出

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

还有下面的设置

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'urusername@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

如果您为此使用gmail,请设置两步验证特定应用程序的密码,然后将该密码复制并粘贴到上面的EMAIL_HOST_PASSWORD值中。


5

我发现使用SendGrid是设置使用Django发送电子邮件的最简单方法。运作方式如下:

  1. 创建一个SendGrid帐户(并验证您的电子邮件)
  2. 将以下内容添加到您的settings.py EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = '<your sendgrid username>' EMAIL_HOST_PASSWORD = '<your sendgrid password>' EMAIL_PORT = 587 EMAIL_USE_TLS = True

一切准备就绪!

发送电子邮件:

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com'])

如果您希望Django在出现500个内部服务器错误时向您发送电子邮件,请将以下内容添加到您的中settings.py

DEFAULT_FROM_EMAIL = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]

使用SendGrid发送电子邮件每月最多免费获得1.2万封电子邮件。


1
很好,但是根据文档,不能使用'apikey'作为用户名来工作,并且SendGrid列出了每个apikey的三打权限配置,用于简单的sendmail ...
SYK

3

我实际上是在Django之前完成的。打开一个合法的GMail帐户,然后在此处输入凭据。这是我的代码-

from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart

def sendmail(to, subject, text, attach=[], mtype='html'):
    ok = True
    gmail_user = settings.EMAIL_HOST_USER
    gmail_pwd  = settings.EMAIL_HOST_PASSWORD

    msg = MIMEMultipart('alternative')

    msg['From']    = gmail_user
    msg['To']      = to
    msg['Cc']      = 'you@gmail.com'
    msg['Subject'] = subject

    msg.attach(MIMEText(text, mtype))

    for a in attach:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(open(attach, 'rb').read())
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(a))
        msg.attach(part)

    try:
        mailServer = smtplib.SMTP("smtp.gmail.com", 687)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(gmail_user, gmail_pwd)
        mailServer.sendmail(gmail_user, [to,msg['Cc']], msg.as_string())
        mailServer.close()
    except:
        ok = False
    return ok

1
无需smtplib直接使用。Django将为您处理该部分。
伊格纳西奥·巴斯克斯

哦,是的!那会怎么样 在这里,我完全绕过了默认的Django send_mail函数并使用了自己的...
Srikar Appalaraju 2011年

1
send_mail()是你会怎么做的。您仍然需要自己汇编邮件,但不必担心SMTP位。
伊格纳西奥·巴斯克斯

2

晚了,但是:

除了DEFAULT_FROM_EMAIL其他人提到的修复程序,允许安全性较低的应用访问该帐户外,我还必须以相关帐户的身份登录到https://accounts.google.com/DisplayUnlockCaptcha,以使Django最终通过身份验证。

我通过SSH隧道到达Web服务器的URL,以确保IP地址相同。我不确定这是否必要,但不会造成伤害。您可以这样操作:ssh -D 8080 -fN <username>@<host>,然后将Web浏览器设置localhost:8080为用作SOCKS代理。


2

您可以使用“测试邮件服务器工具”来测试在您的计算机或本地主机上发送的电子邮件。Google并下载“测试邮件服务器工具”并进行设置。

然后在您的settings.py中:

EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

从外壳:

from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'],    fail_silently=False)

1

对于 SendGrid-Django具体而言:

SendGrid Django文档在这里

在以下位置设置这些变量

settings.py

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'sendgrid_username'
EMAIL_HOST_PASSWORD = 'sendgrid_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

在views.py中

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.