python3收发邮件需要用到 smtplib/email 两个模块的
发送邮件,需要有一个SMTP对象,smtp对象通过 smtplib.SMTP() 。通过这个smtp对象后,通过连接服务器、登录、发送邮件三个步骤就可以实现邮件的发送。
而发送邮件的内容,需要遵守一定格式,这个格式由email模板控制。
smtp邮件对象的基本步骤:创建、连接、登录、发送
import smtplib smtpObj = smtplib.SMTP() #创建smtp对象 smtpObj.connect(host,port) #连接smtp代理服务器 ,如网易的smtp.163.com,端口默认25 smtpObj.login(user, passwd) #登录获取授权,如网易邮箱的账号密码 smtpObj.sendmail(sender, receivers, text) #邮件的发送者、接收者、邮件内容
在创建stmp对象时,需要确定stmp的代理服务器。例如网易163邮箱,它的邮件代理服务器地址为smtp.163.com,其他提供代理的地址需要去寻找,有了smtp代理服务器地址之后,通过.connect()就可以设置连接,服务器默认的端口都是25,如果所使用的端口不是25,就需要在.connect(host,port)用设置。
通过.connect()连接上代理服务器之后,就需要登录操作,通过login(用户名,密码)来获取服务器的授权,只有登录获取授权的smtp对象,才能发送邮件。
登录成功的stmp对象,就可以使用.sendmail()方法发送邮件,发送邮件的文本内容,需要有单独的对象制作,在下一步中描述。
一般情况,用户名、密码就是邮件的用户名和密码,这和使用的代理服务器有关。如网易163,需要单独开通 POP3/SMTP服务并获取授权码,有些服务器还需要认证等等。
邮件的内容:创建邮件文本对象、设置主题/发送者/接收者/正文
from email.mime.text import MIMEText text = '邮件的内容正文文本' #邮件正文可以多种格式,支持html,附件,图片.. msg = MIMEText(text, 'plain', 'utf-8') #设置邮件文本对象 msg['Subject'] = '邮件主题' #设置邮件主题 msg['From'] = '***@163.com' #邮件的发送者,必填,且必须与stmp.sendmail()的发送者保持一致 msg['To'] = ' ***@163.com ' #邮件展示的接收者,非必填,与stmp.sendmail()的接收者可以不一致 设置完成后,这个msg可以作为邮件内容传入smtp.sendmail()中,在传入时需要以msg.as_string()转换为字符串形式传入
最简单的邮件发送示例:
import smtplib from email.mime.text import MIMEText if __name__ == "__main__": #第一步: smtp对象创建 smtp_host = 'smtp.163.com' #网易163smtp地址 smtp_user = 'dtsccn@163.com' #网易邮箱地址,作为登录用户 smtp_passwd = '***' #授权码,不同smtp服务商不统一,有的直接是邮箱的密码,网易163需要单独申请 smtp = smtplib.SMTP() smtp.connect(smtp_host,25) #smtp的服务默认开通都是25端口,可以不用填写,但有些smpt服务商可能会更改端口 smtp.login(smtp_user,smtp_passwd) #登录,获取smtp发送邮件许可 #第二步:邮件内容创建 text = '这是一封测试邮件,请忽视' #邮件正文 msg = MIMEText(text) #创建邮件text对象,创建时需要将邮件正文作为参数初始化 msg['Subject'] = '这是一封测试邮件' #设置邮件主题 msg['From'] = smtp_user #邮件的发送方,与smtp创建时的登录用户邮箱地址一致 msg['To'] = '测试邮件组' #邮件展示的接收者 #第三步:邮件发送 to_list = ['452044211@qq.com','*****'] #邮件接收者的列表 smtp.sendmail(smtp_user,to_list,msg.as_string())

不同smtp服务商提供smtp代理服务之间的差异:提供smtp代理服务的运营商有很多,如腾讯qq邮箱,网易163等。基于安全的考虑,不同服务商提供的代理服务,有些诧异。在参数设置时,就需要遵守使用服务器的协议。例如163邮箱,不能直接使用邮箱的用户名、密码作为smtp.login()时的用户名密码使用,需要进入网易163邮箱后,申请开通smtp服务并获得授权码,使用授权码作为秘密登录。有些需要ssl安全认证,需要改用SMTP_SSL 连接。
#smtp创建的第一种方式:创建、连接 分开 smtp = smtplib.SMTP() smtp.connect(smtp_host,25) #smtp创建的第二种方式: 创建连接 一步 smtp = smtplib.SMTP(smtp_host,25) #smtp创建的第三种方式:需要ssl认证的代理服务时应用 smtp = smtplib.SMTP_SSL(smtp_host,25)
邮件正文的多样设置
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
邮件内容纯文本格式,可以用MIMEText对象。如果要有丰富的格式、图片、附件等,需要用MIMEMultipart这个类,图片需要用MIMEImage这个类。