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

时间:2011-06-16 04:11:13

标签: python django email smtp

在我的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()代替?

13 个答案:

答案 0 :(得分:158)

我使用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

答案 1 :(得分:49)

将电子邮件发送到真正的SMTP服务器。如果您不想自己设置,那么您可以找到可以为您运行的公司,例如Google自己。

答案 2 :(得分:26)

  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()
    
  6. 有关更多信息,请查看send_mail中的EmailMessagedocuments功能。

    Gmail更新

    如果您在通过Gmail发送电子邮件时遇到问题,请记得从谷歌检查this guides

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

    create an App specific password for your gmail之后再turned on 2-step-verification

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

        EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'
    

    如果您有兴趣发送HTML电子邮件,check this out

答案 3 :(得分: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做了诀窍

答案 4 :(得分:12)

我的网站托管在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

在shell中:

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

然后我得到了" 1"作为O / P即成功。我也收到了邮件。 :)

答案 5 :(得分:10)

您需要在settings.py

中使用 smtp作为后端
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中值。

答案 6 :(得分:4)

我发现使用SendGrid是设置使用Django发送电子邮件的最简单方法。以下是它的工作原理:

  1. Create a SendGrid account(并验证您的电子邮件)
  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
  3. 你们都准备好了!

    发送电子邮件:

    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发送电子邮件每月最多可免费发送12k封电子邮件。

答案 7 :(得分:3)

我实际上曾经从Django那里做过这件事。打开一个合法的GMail帐户&amp;在此处输入凭据。这是我的代码 -

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

答案 8 :(得分:2)

迟到了,但是:

除了其他人提到的DEFAULT_FROM_EMAIL修正,允许安全性较低的应用访问该帐户,我必须在登录时导航至https://accounts.google.com/DisplayUnlockCaptcha有问题的帐户让Django最终验证。

我通过SSH隧道访问该网址,以确保IP地址相同;我不完全确定是否有必要,但它不会受到伤害。您可以这样做:ssh -D 8080 -fN <username>@<host>,然后将您的Web浏览器设置为使用localhost:8080作为SOCKS代理。

答案 9 :(得分:2)

您可以使用&#34;测试邮件服务器工具&#34; 来测试您的计算机或localhost上的电子邮件发送。谷歌和下载&#34;测试邮件服务器工具&#34;并设置它。

然后在你的settings.py中:

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

来自shell:

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

答案 10 :(得分:1)

对于 SendGrid - Django 具体来说:

SendGrid Django Docs here

中设置这些变量

<强> 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)

答案 11 :(得分:1)

您可以使用 Gmail 服务接收邮件。

<块引用>

在 Django 中使用 Gmail 作为电子邮件服务(免费)的步骤:

1:为您的联系人创建一个虚拟 Google 帐户。 2:在settings.py底部添加如下代码。

 EMAIL_HOST = "smtp.gmail.com"
    EMAIL_PORT = 587
    EMAIL_USE_TLS = True
    EMAIL_HOST_USER = "yourdummy@gmail.com"
    EMAIL_HOST_PASSWORD = "dummypassword"
    
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

3: 现在在 views.py 添加:

  from django.core.mail import EmailMessage
    # now in your function add this code
    
    messageContent = yourcontent
    msg = EmailMessage(heading, messageContent, settings.EMAIL_HOST_USER,[list of senders email])
    msg.send()

4:首先为虚拟 Gmail 帐户启用这些功能:

a:转到 https://myaccount.google.com/lesssecureapps 并启用它。 注意:首先检查您是否以虚拟帐户身份登录启用此功能。 b: 现在转到 https://accounts.google.com/DisplayUnlockCaptcha 并点击继续。

5:您已准备好为您的联系页面使用 Gmail 电子邮件服务。

<块引用>

奖励:

如果您想在 Django 中使用 HTML 模板发送邮件,请在 views.py 中使用此代码。

from django.template.loader import get_template
from django.core.mail import EmailMessage

# add this code in function:
ctx = {
    'subject': subjectin,
    'userMsg': messagein,
   }

heading = Your heading

messageContent = get_template('yourTemplate.html').render(ctx) #sending value on HTML page through context
msg = EmailMessage(heading, messageContent, settings.EMAIL_HOST_USER,
                   [list of emails ])
msg.content_subtype = 'html'
msg.send()

答案 12 :(得分:0)

以下格式为我工作

<块引用>

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

EMAIL_USE_TLS = 真 EMAIL_HOST = 'mail.xxxxxxx.xxx'

EMAIL_PORT = 465

EMAIL_HOST_USER = 'support@xxxxx.xxx'

EMAIL_HOST_PASSWORD = 'xxxxxxx'