ChatGPT解决这个技术问题 Extra ChatGPT

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

在我的 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?

看完你的回答后,让我直截了当地说:

你不能使用 localhost(简单的 ubuntu pc)来发送电子邮件吗?我认为在 django 1.3 中 send_mail() 有点被弃用,而使用 EmailMessage.send() 代替?

1. 如果您有 SMTP 服务器在其中运行,则可以使用 localhost。 2. 确切的机制并不重要。重要的是你有一个 SMTP 服务器。
所以如果我安装后缀,我可以发送/接收电子邮件吗?你如何设置后缀来做到这一点?
这个问题超出了本网站的范围。
然而,搜索引擎优化将我们带到了这个页面,伊格纳西奥。

J
Jordan

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


除了将密码保留为明文之外,还有其他选择吗?
您可以使用像 Mandrill 这样的电子邮件服务,它可以让您使用密码,尽管我不确定这对您是否有帮助。您还可以使用安装在服务器上的加密密钥,并使该行类似于 EMAIL_HOST_PASSWORD = my_decrypt('abi304hubaushl9rchy2y9fd29')
把它放在一个环境变量中。然后,EMAIL_HOST_PASSWORD = os.environ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
我逐字使用您的代码。几天后我的gmail帐户被封锁了。我的服务器每天可能发送不到 20 封电子邮件。有人用谷歌遇到过类似的问题吗?
SMTPAuthenticationError 并且我收到一封电子邮件“登录尝试被阻止......来自不符合现代安全标准的应用程序”。看起来像 this。 “turning on access for less secure apps”的解决方法。还有那个worked
I
Ignacio Vazquez-Abrams

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


太棒了,我只是自己的电子邮件! miku上面提到的这篇文章是完美的。请注意文章评论中的小错字更正。 (而且我只是使用我的普通计算机/本地主机。我之前没有设置任何其他东西。)
哪篇文章?能再链接一下吗?
A
Alex Jolig

创建一个项目:django-admin.py startproject gmail 使用以下代码编辑 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 运行交互模式:python manage.py shell 导入 EmailMessage 模块:from django.core.mail import EmailMessage 发送电子邮件:email = EmailMessage('Subject', 'Body' , to=['your@email.com']) email.send()

有关详细信息,请查看 documents 中的 send_mailEmailMessage 功能。

Gmail 更新

此外,如果您在通过 gmail 发送电子邮件时遇到问题,请记得检查 Google 的 this guides

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

在您为它turned on 2-step-verification之后也create an App specific password for your gmail

然后你应该在设置中使用应用程序特定的密码。所以更改以下行:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

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


我按照你的步骤,我不能发送,到电子邮件不接收电子邮件/
outlookoffice365 的 EMAIL_HOST 是什么?
M
Muhammad Usman Bashir

我的网站托管在 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 的最简单方法
C
Cognoscis

对于 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 获得了凭据。
V
Vini.g.fer

您需要在 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 值中。


y
yndolok

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

创建一个 SendGrid 帐户(并验证您的电子邮件)将以下内容添加到您的 settings.py: EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = '<您的 sendgrid 用户名>' EMAIL_HOST_PASSWORD = '<您的 sendgrid 密码>' EMAIL_PORT = 587 EMAIL_USE_TLS = 真

你都准备好了!

要发送电子邮件:

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 封电子邮件。


非常好,但无法根据文档使用“apikey”作为用户名来使其工作,并且 SendGrid 列出了每个 apikey 的三个几十个权限配置,用于一个简单的发送邮件......
S
Srikar Appalaraju

我实际上是在不久前从 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

无需直接使用smtplib; Django 将为您处理这部分。
哦对了!那会怎么样?这里我完全绕过了默认的 django send_mailfunction &用我自己的...
send_mail() 是您的做法。您仍然需要自己组装消息,但您不必担心 SMTP 位。
A
Allan Guwatudde

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

然后在你的 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)

J
James Johnson

迟到了,但是:

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

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


D
Deepak Sharma

对于 SendGrid - Django 具体来说:

SendGrid Django Docs here

将这些变量设置在

设置.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)

从那时起,文档和设置发生了变化,但文档的链接仍然有效,并将您带到正确的配置。
s
sai tech

以下甲酸盐为我工作

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True EMAIL_HOST = 'mail.xxxxxxx.xxx' EMAIL_PORT = 465 EMAIL_HOST_USER = 'support@xxxxx.xxx' EMAIL_HOST_PASSWORD = 'xxxxxxx'


为什么这是有用的答案并且与其他答案不同
S
Shahriar

在 settings.py 中配置电子邮件如下

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

在大多数情况下,Gmail 设置都会被遗漏。确保打开不太安全的应用程序访问。您还可以检查程序 here

然后从 django.core.mail import send_mail 在视图中发送电子邮件

def send(request):
    send_mail(
        ‘Email Subject here’,
        ‘Email content’,
        settings.EMAIL_HOST_USER,
        [‘emailto@gmail.com’],
        fail_silently=False)

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅