说明:
python 3.6
Django 2.2
阿里云轻应用服务器
注意:轻应用服务器上80 端口和25端口是被占用,465端口被SSL加密,如果程序中没有开启SSL服务无法 发送 邮件最终导致邮件发送失败,具体实践请 看python$Django 的demon
说明:阿里云只允许发送收件人许可的商业邮件,收件人地址来源是会员注册,发送内容是收件人主动订阅,非许可的垃圾邮件不允许发送。阿里云的批量邮件是需要付费使用,项目的应用场景主要以注册激活邮件通知这些项目触发事件为主,所以文章中的邮件发送类型均是触发邮件。
说明:发送触发邮件可以使用 API接口或SMTP接口,由于使用python 的smtlib模块进行邮件发送所以一下文章中的接口无特殊说明情况下都指向SMTP接口
说明:SMTP的设计基于以下通信模型:作为用户邮件请求的结果,发送者-SMTP建立到接收者-SMTP的双向传输通道。接收方- smtp可以是最终目的地,也可以是中间目的地。SMTP命令由发送方-SMTP生成并发送到接收方-SMTP。SMTP响应命令从接收程序-SMTP发送到发送程序-SMTP。一旦建立了传输通道,SMTP-sender将发送一个邮件命令,指示邮件的发送方。如果SMTP-receiver可以接受邮件,它将以OK应答。然后SMTP-sender发送一个RCPT命令,该命令标识邮件的收件人。如果SMTP-receiver可以接受该收件人的邮件,它将以OK响应;如果没有,它将以拒绝该收件人(但不是整个邮件事务)作为响应。smtp发送方和smtp接收方可以协商多个收件人。当协商了收件人之后,SMTP-sender发送邮件数据,并以一个特殊的序列结束。如果SMTP-receiver成功处理了邮件数据,它将以OK响应。这个对话框是特意锁定步骤的,一次一个。
通过上图模型可以了解到SMTP的基本 原理,接下来我们将用Python和Django进行实践
import smtplib
from email.mime.text import MIMEText
#第三方SMTP服务
mail_host = "smtp.qq.com" # 这里 使用的是qq邮箱的smtp服务器
mail_user = "你的邮箱" # [email protected]
mail_pass = "xxxxxxxxxxxxxx" # 邮箱的授权码
sender = "你的邮箱"
receiver = "收件人邮箱"
message = MIMEText("你好,世界!")
message["From"] = sender
message["To"] = receiver
message["Subject"] = "邮件主题"
def send_email():
try:
server = smtplib.SMTP_SSL() # 在阿里云上python2.7以上需要使用SSL协议
server.connect(mail_host, port=465) # 阿里云25 和80 端口均被使用 465端口使用 SSL协议
server.login(mail_user,mail_pass)
server.sendmail(sender,receiver,message.as_string())
server.close()
print("邮件发送成功!")
except Exception as e:
print("邮件发送失败!",e)
if __name__ == '__main__':
send_email()
# -*- coding:utf-8 -*-
import os
import smtplib
from django.core.mail import send_mail
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") # 载入Django配置环境以便于直接运行测试
try:
send_mail(
'邮件主题',
'邮件内容',
'发件人邮箱@example.com',
['收件人邮箱@example.com'],
fail_silently=False,
)
print '邮件发送成功!'
except smtplib.SMTPConnectError, e:
print '邮件发送失败,连接失败:', e.smtp_code, e.smtp_error
except smtplib.SMTPAuthenticationError, e:
print '邮件发送失败,认证错误:', e.smtp_code, e.smtp_error
except smtplib.SMTPSenderRefused, e:
print '邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error
except smtplib.SMTPRecipientsRefused, e:
print '邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error
except smtplib.SMTPDataError, e:
print '邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error
except smtplib.SMTPException, e:
print '邮件发送失败, ', e.message
except Exception, e:
print '邮件发送异常, ', str(e)
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 使用SMPT作为邮件后端
EMAIL_HOST = 'smtp.qq.com' # smtp服务器地址
# EMAIL_PORT = 25 # 默认端口
EMAIL_PORT = 465 # aliyun smtp端口
EMAIL_HOST_USER = '[email protected]' # 发送邮件的邮箱[email protected]'
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxx' # 邮箱授权密码
EMAIL_FROM = '小李子自定义内容 # 发件人(收件人可见)
EMAIL_USE_SSL = True # 启用SSL协议,阿里云部署需要支持
参考文章:
阿里云邮件推送指南