提问人:J0ANMM 提问时间:2/9/2017 最后编辑:CommunityJ0ANMM 更新时间:8/18/2021 访问量:1265
使用 Gmail 报告 Django 错误
Django error reporting with Gmail
问:
我正在尝试设置我的 Django 帐户以接收错误报告(文档在这里)。
我已将 .然后,根据文档:ADMINS
settings.py
为了发送电子邮件,Django 需要一些设置来告诉它如何发送 连接到您的邮件服务器。至少,您需要 指定EMAIL_HOST,可能EMAIL_HOST_USER和 EMAIL_HOST_PASSWORD,但可能还需要其他设置 取决于邮件服务器的配置。咨询 Django 有关电子邮件相关设置的完整列表的设置文档。
但这是我迷路的时候。 我有一个商业Gmail帐户,这是我想在这里链接的帐户。这篇文章很好地解释了它,
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'mypassword'
但它说:
2016年,Gmail不再允许这样做。
显然,问题出在设置中,该设置必须是特定的密码,如另一篇文章所述。EMAIL_HOST_PASSWORD
但是,很难相信 Gmail 不允许以任何方式这样做,尤其是对于您为服务付费的企业帐户。
不幸的是,我发现的所有相关信息都早于 2016 年,因此不再有用。
有没有办法将 Django 应用程序与 Gmail 连接?
答:
最终对我有用的解决方法是为此目的创建一个新的Gmail帐户。这目前有效,尽管我在其他地方读到一些评论说相反。
请注意,这个新帐户将没有两步验证,但安全性并不是一个大问题,因为该帐户将“仅”处理 Django 电子邮件。
您可以使用 Gmail API 通过 Gmail 电子邮件地址发送授权电子邮件。一个好的起点是文档:https://developers.google.com/gmail/api/quickstart/python
我一直遇到这个问题,所以我在一篇博客文章中记录了如何使用 API:https://www.willcarh.art/blog/Automating-Emails-in-Python/
这真是太痛苦了,以至于我最终构建了自己的 Python 实用程序,用于通过 Gmail API 发送电子邮件。这是我最初的原型:
import os
import sys
import pickle
import base64
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from email.mime.text import MIMEText
def get_gmail_api_instance():
"""
Setup Gmail API instance
"""
if not os.path.exists('token.pickle'):
return None
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
service = build('gmail', 'v1', credentials=creds)
return service
def create_message(sender, to, subject, message_text):
"""
Create a message for an email
:sender: (str) the email address of the sender
:to: (str) the email address of the receiver
:subject: (str) the subject of the email
:message_text: (str) the content of the email
"""
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
raw = base64.urlsafe_b64encode(message.as_bytes())
raw = raw.decode()
body = {'raw': raw}
return body
def send_email(service, user_id, message):
"""
Send an email via Gmail API
:service: (googleapiclient.discovery.Resource) authorized Gmail API service instance
:user_id: (str) sender's email address, used for special "me" value (authenticated Gmail account)
:message: (base64) message to be sent
"""
try:
message = (service.users().messages().send(userId=user_id, body=message).execute())
return message
except Exception as e:
print("err: problem sending email")
print(e)
def main():
"""
Set up Gmail API instance, use it to send an email
'sender' is the Gmail address that is authenticated by the Gmail API
'receiver' is the receiver's email address
'subject' is the subject of our email
'message_text' is the content of the email
"""
# draft our message
sender = '[email protected]'
receiver = '[email protected]'
subject = 'Just checking in!'
message_text = "Hi! How's it going?"
# authenticate with Gmail API
service = get_gmail_api_instance()
if service == None:
print("err: no credentials .pickle file found")
sys.exit(1)
# create message structure
message = create_message(sender, receiver, subject, message_text)
# send email
result = send_email(service, sender, message)
if not result == None:
print(f"Message sent successfully! Message id: {result['id']}")
if __name__ == '__main__':
main()
然后,要让 Django 发送有关 404、500 等错误的电子邮件,请添加到相关的:urls.py
from django.conf.urls import handler404, handler500
handler404 = projectname_views.error_404
handler500 = projectname_views.error_500
并在相关 中添加:views.py
import send_gmail
from django.shortcuts import render
def error_500(request):
# call email function
send_gmail.main()
response = render(request, '500_errror_template.html')
response.status_code = 500
return response
GitHub gist 与上面的代码:https://gist.github.com/wcarhart/b4f509c46ad1515a9954d356aaf10df1
我想提供截至 2021 年 8 月的更新。
我仅使用 Django 中包含的库在企业 gmail 帐户上工作。
在 settings.py
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'myappspecificpassword'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
对于密码,您需要为相关帐户生成特定于应用程序的密码。您可以通过访问此链接来做到这一点:https://security.google.com/settings/u/3/security/apppasswords。
注意:您必须为发送邮件的帐号启用双重身份验证。这必须通过您发送邮件的帐户启用,而不是通过管理员帐户启用。
这样,我就可以在 views.py 中的视图中使用此代码片段发送电子邮件
from django.core.mail import EmailMessage
...
email = EmailMessage(
'Hello',
'Body goes here',
'[email protected]',
['[email protected]'],
['[email protected]'],
reply_to=['[email protected]'],
headers={'Message-ID': 'foo'},
)
email.send()
评论
This setting is not available for accounts with 2-Step Verification enabled. Such accounts require an application-specific password for less secure apps access.