python邮件发送

1.相关知识

SMTP是发送邮件的协议,python内置对SMTP的支持,可以发送纯文本邮件,HTML邮件,还有带附件的邮件
python对SMTP的支持:email模块–负责构造邮件 smtplib模块–负责发送邮件。

2.关于授权码

不管是使用QQ邮箱,网易邮箱,还是新浪邮箱,要利用他们的SMTP服务器来发送邮件,POP3服务器来接受邮件,都需要授权码,为了防止你的客户端密码泄露而造成邮箱隐患,而使用只有你自己知道的授权码来登陆第三方客户端,比如smtplib模块就属于第三方客户端。而授权码即使在服务器端也是加密的,所以无法修改授权码,只能重置授权码。

邮箱的pop/smtp服务器默认是关闭的,需要手动开启,进行短信验证。

3.邮箱开启POP/SMTP服务

QQ邮箱开启pop/smtp服务:

  • 点击设置
  • 点击账户
  • 鼠标下滑,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
  • 开启POP3/SMTP服务,然后需要发送短信,记下自己的授权码,在第三方登录时需要用到

新浪邮箱开启pop/smtp服务:

  • 点击设置
  • 点击左侧客户端pop/imap/smtp
  • 找到右侧客户端授权码,点击开启,然后发送短信,获取授权码。

网易邮箱开启pop/smtp服务:

  • 点击设置
  • 点击左侧POP3/SMTP/IMAP
  • 右侧开启POP3/SMTP服务
  • 需要发送短信,再设置授权码。

4.服务器地址及帮助

服务器地址及协议端口:
新浪邮箱帮助:http://help.sina.com.cn/comquestiondetail/view/160/

# ################选择新浪邮箱###############
# 新浪@sina.com邮箱                                        新浪@sina.cn邮箱
# 接受服务器地址:pop.sina.com or pop3.sina.com             pop.sina.cn or pop3.sina.cn
# 发送服务器地址:smtp.sina.com                             smtp.sina.cn
# ###########端口号设置###################
# POP 协议            pop端口:110      smtp 端口:25
# IMAP 协议           IMAP 端口:143    smtp 端口:25
# ############加密设置####################
# pop: 995         imap: 993
# smtp: 587 or 465

网易邮箱的帮助:https://help.mail.163.com/faq.do?m=list&categoryID=76
QQ邮箱的帮助:https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=430&&id=48

除了改个域名,基本上一样。

5开始发送邮件-纯文本

5.1邮件发送

# 发送纯文本邮件
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from smtplib import SMTP_SSL

server = 'smtp.qq.com'			# 使用的QQ邮箱的SMTP服务器
sender = '[email protected]'			# 你的QQ邮箱账号
pwd = 'xxxxxxxxxxxxxxxx'		# 你的16位授权码

sender_mail = '[email protected]'		# 发送方的邮箱
receiver = '[email protected]'		# 接收方的邮箱

mail_title = '[email protected]'				# 邮件标题
mail_content = '用QQ邮箱发的!'			# 邮件内容

# 构造邮件
msg = MIMEMultipart()
msg['Subject'] = Header(mail_title, 'utf-8')		# 构造邮件标题
msg['From'] = sender_mail							# 构造邮件发送方
msg['To'] = Header('test', 'utf-8')					# 构造邮件接受方
msg.attach(MIMEText(mail_content, 'plain', 'utf-8'))		# 构造邮件内容

# 发送邮件
smtp = SMTP_SSL(server)     # 加密发送
smtp.set_debuglevel(1)		# 打印smtplib库和smtp服务器的交互过程
smtp.login(sender_mail, pwd)	# 通过smtplib登录smtp服务器
somebody = smtp.sendmail(sender_mail, [receiver], msg.as_string())		# 发送邮件
smtp.quit()			# 退出服务器

交互过程:

send: 'ehlo [192.168.48.1]\r\n'
reply: b'250-newxmesmtplogicsvrsza2.qq.com\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-SIZE 73400320\r\n'
reply: b'250-AUTH LOGIN PLAIN\r\n'
reply: b'250-AUTH=LOGIN\r\n'
reply: b'250-MAILCOMPRESS\r\n'
reply: b'250 8BITMIME\r\n'
reply: retcode (250); Msg: b'newxmesmtplogicsvrsza2.qq.com\nPIPELINING\nSIZE 73400320\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME'
send: 'AUTH PLAIN ADEzMTUzOTU2MjFAcXEuY29tAHF5dGZyc29nY2R2eWphZ2c=\r\n'
reply: b'235 Authentication successful\r\n'
reply: retcode (235); Msg: b'Authentication successful'
send: 'mail FROM: size=402\r\n'
reply: b'250 OK.\r\n'
reply: retcode (250); Msg: b'OK.'
send: 'rcpt TO:\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
send: 'data\r\n'
reply: b'354 End data with ..\r\n'
reply: retcode (354); Msg: b'End data with ..'
data: (354, b'End data with ..')
send: b'Content-Type: multipart/mixed; boundary="===============4761608527476114621=="\r\nMIME-Version: 1.0\r\nSubject: =?utf-8?q?1315395621=40163=2Ecom?=\r\nFrom: [email protected]\r\nTo: =?utf-8?q?test?=\r\n\r\n--===============4761608527476114621==\r\nContent-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: base64\r\n\r\n55SoUVHpgq7nrrHlj5HnmoQh\r\n\r\n--===============4761608527476114621==--\r\n.\r\n'
reply: b'250 OK: queued as.\r\n'
reply: retcode (250); Msg: b'OK: queued as.'
data: (250, b'OK: queued as.')
send: 'quit\r\n'
reply: b'221 Bye.\r\n'
reply: retcode (221); Msg: b'Bye.'

新浪邮箱收到:
python邮件发送_第1张图片

5.2代码解析

  • 构造一个邮件对象就是一个Message对象
  • 如果使用MIMEText构造一个MEMEText对象,就表示一个文本邮件对象;
  • 如果构造一个MIMEImage对象,就是一个作为附件的图片;
  • 要把多个对象组合起来,使用MIMEMultipart对象;
  • MIMEBase可以表示任何对象。

继承关系:

Message
	MIMEBase
		MIMEMultipart
		MIMENonMultipart
			MIMEMessage
			MIMEText
			MIMEImage	

6.不同邮箱互发测试

测试目标:1-新浪邮箱 2-QQ邮箱 3-网易邮箱
发送测试结果:

  • QQ邮箱可以发送给自己,网易邮箱和新浪邮箱
  • 新浪邮箱可以发送给自己,但是发送给QQ邮箱和网易邮箱的失败了
  • 网易邮箱可以发送给自己,新浪邮箱和QQ邮箱。

关于新浪的SMTP服务器发送失败,怀疑是SMTP服务器把我的邮件误认为是群发邮件或者是有毒邮件,所以偷偷扔掉了,但是不通知我,还返回给我一个成功的状态码。。。

关于邮件发送成功对方却接受不到的几种可能:http://qunfa.abot.cn/post/68.html
还有通过退信码查找错误原因:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

你可能感兴趣的:(Python)