一封电子邮件的发送过程:
1. 发件人 -> MUA MUA: 邮件用户代理 像Outlook或faxmail之类的软件就属于MUA
2. MUA -> MTA MTA:邮件传输代理 邮件服务提供商就属于MTA,比如网易、新浪等
3、MTA->MTA 由于收发邮件双方的服务提供商可能不同,比如有的是@sina.com, 有的是@163.com 所有这时就要涉及到
MTA之间的转发
4、MTA->MDA MDA:邮件投递代理 邮件到达MDA后,邮件会存放在目的信箱的某个服务器上。
5、MDA->MUA 收件人要取到邮件必须要通过MUA从MDA上把邮件取到电脑本地
所以编写程序来实现发送和接收邮件,本质上就是:
1. 编写MUA把邮件发到MTA 这个过程使用SMTP协议
2. 编写MUA从MDA上收邮件 这个过程使用POP3或者IMAP协议
假设我们现在有两个邮箱:[email protected] [email protected]
大多数的邮件服务商都需要手动打开SMTP发信和POP收信功能,否则只允许在网页登录。
(一)从163邮箱发送邮件到qq邮箱
注意:当用程序模拟MUA发送邮件时,要保证163邮箱的SMTP服务开启,而qq邮箱没有特殊设置(前提是你用网页打开邮箱)
网易默认开启这些服务,但是要成功发送邮件还要开启“客户端授权码”
开启之后会让用户设置一个授权码
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件,可以发送纯文本邮件、HTML邮件和带附件的邮件。
#!/usr/bin/python
#coding=utf-8
from email.mime.text import MIMEText
import smtplib
send_str = '''
你好:
收到信息请回复,谢谢!
此致
敬礼
'''
msg = MIMEText(send_str, 'plain', 'utf-8') #构建发送的正文文本,’send_str‘就是邮件的正文,’plain‘代表纯文本
from_addr = '[email protected]' #发件人信箱
password = 'xxxxx' #客户端授权密码
to_addr = '[email protected]' #收件人信箱
smtp_server = 'smtp.163.com' #smtp地址
msg['subject'] = 'python' #邮件主题
msg['from'] = from_addr #收件人
msg['to'] = to_addr #发件人
server = smtplib.SMTP_SSL() #使用SSL方式
server.connect(smtp_server, '465') #注意端口号是465
#server.set_debuglevel(1) #设置debug模式 可以显示交互过程
server.login(from_addr, password) #登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发送邮件 可以发送多人所以收件人地址是一个list
server.quit()
注意:通过实验发现 通过163信箱发送邮件时,“邮件主题” “收件人” “发件人”不能全空,否则发送会失败
(二)发送带附件的邮件
使用MIMEMutipart为邮件添加 “发送文本”和“附件”
send_str = '
pdfFileLocation = 'C:\\project\\io_file\\output\\'
pdfName = '报考 .pdf' #这里如果采用utf-8编码,发送邮件中的附件格式不正确
pdfFile = (pdfFileLocation+pdfName).decode('utf-8') #这里进行utf-8编码,以便正确查找文件位置
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfName)
msg = MIMEMultipart()
msg.attach(textApart)
msg.attach(pdfApart)
msg['subject'] = u'报考岗位分析'
msg['from'] = '上岸报考
msg['to'] = to_addr
后面发送邮件步骤同(一)