您可以使用 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 = 'pythonista@gmail.com'
receiver = 'receiver@gmail.com'
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 要点:https://gist.github.com/wcarhart/b4f509c46ad1515a9954d356aaf10df1