阿里云SMTP邮件发送Python demon实践

阿里云SMTP邮件发送Python & Django实践

说明:
python 3.6
Django 2.2
阿里云轻应用服务器
注意:轻应用服务器上80 端口和25端口是被占用,465端口被SSL加密,如果程序中没有开启SSL服务无法 发送 邮件最终导致邮件发送失败,具体实践请 看python$Django 的demon

阿里云邮件服务(了解)

邮件发送类型

阿里云SMTP邮件发送Python demon实践_第1张图片

说明:阿里云只允许发送收件人许可的商业邮件,收件人地址来源是会员注册,发送内容是收件人主动订阅,非许可的垃圾邮件不允许发送。阿里云的批量邮件是需要付费使用,项目的应用场景主要以注册激活邮件通知这些项目触发事件为主,所以文章中的邮件发送类型均是触发邮件。

服务接入方式

阿里云SMTP邮件发送Python demon实践_第2张图片

说明:发送触发邮件可以使用 API接口或SMTP接口,由于使用python 的smtlib模块进行邮件发送所以一下文章中的接口无特殊说明情况下都指向SMTP接口

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 demon实践_第3张图片
通过上图模型可以了解到SMTP的基本 原理,接下来我们将用Python和Django进行实践

Python 发送邮件Demon

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

Django邮件Demon

sendmail.py

# -*- 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)

settings.py

# 发送邮件配置

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协议,阿里云部署需要支持

参考文章:
阿里云邮件推送指南

你可能感兴趣的:(Python,Django,邮件,阿里云,SMTP,Django,Python,发送邮件)