一、邮件的介绍
1.1 协议的介绍
发送的协议:SMTP 规定了发送的数据格式,交互报文
接受的协议:pop3、IMAP。 两者区别IMAP
我们主要是使用SMTP来发送数据。
1.2 邮件的流程
与smtp服务器建立连接--》 建立smtp通道--》 登入--》 写邮件格式--》发送
二、代码实现
python发邮件主要是是使用 smtplib这个类。
邮件的格式与内容 主要使用email这个类
1.1 只发送文本 的邮件
import smtplibfrom smtplib import SMTP_SSLfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBasefrom email import encodersfrom email.utils import formataddraddr_to = ['2323449277@qq.com', '18768196753@139.com']# 第一步连接到服务器,并发送一个地址查询,然后登入进去smtp = SMTP_SSL('smtp.qq.com')smtp.ehlo('smtp.qq.com')# smtp.set_debuglevel(1) 打开调试,能看到与服务器之间的交互smtp.login('459900477@qq.com', 'iajeclsnsrxebjgd')'''第一种,只是发本文'''def send_email(): # 第二步构造邮件格式: msg = MIMEText('wo zai na li?', 'plain', 'utf-8') # 生成一个邮件主体内容对象 msg['subject'] = Header('邮件标题1', 'utf-8') # 邮件主体对象添加标题 msg['from'] = formataddr(('LH', '459900477@qq.com')) # 添加发件人 addr_to = ['2323449277@qq.com', '18768196753@139.com'] msg['to'] = ','.join(addr_to) # 添加收件人,这个是在邮件中显示的。可以有多个,用,分割 # 发送邮件, smtp.sendmail('459900477@qq.com', addr_to, msg.as_string()) # 接受双方的人物 # 关闭 与邮件服务器之间的连接 smtp.quit()def main(): send_emailif __name__ == '__main__': main()
1.2 发送带附件的邮件
登入 与 模块 使用1.1的案列
def send_email_attch(body, attachment): msg = MIMEMultipart() msg['subject'] = Header('邮件标题1', 'utf-8') # 邮件主体对象添加标题 msg['from'] = formataddr(('LH', '459900477@qq.com')) # 添加发件人 msg['to'] = '2323449277@qq.com' # 添加收件人 msg.attach(MIMEText(body, 'plain', 'utf-8')) # 定义邮件的格式 with open(attachment, 'rb') as f: # MIMEBase表示附件对象 mime = MIMEBase('text', 'txt', filename=attachment) # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字 mime.add_header('Content-Disposition', '456', filename='hui.py') mime.set_payload(f.read()) # 读取文件的内容到付件中 encoders.encode_base64(mime) # 定义传输的编码协议,避免错落 msg.attach(mime) # 把附件添加到邮件中中。 try: smtp.sendmail('459900477@qq.com', addr_to, msg.as_string()) # 发送邮件 smtp.quit() except smtplib.SMTPException as e: print(e)
1.3 究极版本:文本或html或附件
def send_email_all(body, mailtype='plain', attachment=None): ''' body:邮件正文。 可以是文本 或 html。由第二个参数来控制 mailtype:邮件格式 acctcchment: 附件。如果不存在,不添加,存在则添加 ''' # 构造一个MimeMultipart对象,代表邮件本身 msg = MIMEMultipart() # 设置邮件的内容:标题,发件人,收件人 msg['subject'] = Header('邮件标题1', 'utf-8') # 邮件标题对象添加标题 msg['from'] = formataddr(('LH', '459900477@qq.com')) # 添加发件人 msg['to'] = ','.join(addr_to) # 添加收件人 # body代表发送的内容,mailtype为内容的格式:文本(plian)或html msg.attach(MIMEText(body, mailtype, 'utf-8')) # 定义邮件的格式 # 如果有附件,则添加进去 if attachment: # 使用二进制模式打开 with open(attachment, 'rb') as f: # MIMEBase表示附件对象 mime = MIMEBase('text', 'txt', filename=attachment) # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字 mime.add_header('Content-Disposition', '456', filename='hui.py') mime.set_payload(f.read()) # 读取文件的内容到付件中 encoders.encode_base64(mime) # 定义传输的编码协议,避免错落 msg.attach(mime) # 将附件添加到邮件中 try: smtp.sendmail('459900477@qq.com', addr_to, msg.as_string()) # 发送邮件 smtp.quit() except smtplib.SMTPException as e: print(e)
二、封装成类,到处得瑟
import smtplibfrom smtplib import SMTP_SSLfrom email.header import Header # 邮件的主题格式from email.mime.text import MIMEText # 邮件的格式,纯文本格式from email.mime.multipart import MIMEMultipart # 邮件的格式,多格式from email.mime.base import MIMEBase # 附件from email import encoders # 附件的编码from email.utils import formataddr # 邮件的发件人格式'''构造成类'''class NoMailListErrot(Exception): '自定义异常,在邮件接收人不存在的时候,主动抛出异常' passclass MailMaster: def __init__(self, email_from_addr='459900477@qq.com', password='iajeclsnsrxebjgd', email_server='smtp.qq.com'): '''初始化函数,生成smtp对象,连接到服务器,并登入进去 ''' # 第一步连接到服务器,并发送一个地址查询,然后登入进去 self.smtp = SMTP_SSL(email_server) # self.smtp.set_debuglevel(1) # 调试接口 self.smtp.ehlo(email_server) self.email_from_addr = email_from_addr self.smtp.login(self.email_from_addr, password) self.email_to_addr = [] def notice(self, username, text, subject='通知消息'): '发送通知,调用通用发邮件接口' self.send_email(subject, f'{username}\n'+text) def add_emali_to_list(self, addr: str): '添加收件人' self.email_to_addr.append(addr) def send_email(self, subject, body, mailtype='plain', attachment=None): '''发送邮件接口 @subject: 邮件主题 @body: 邮件内容 @mailtype:邮件类型,默认时文本,发html时为html attachment:附件 ''' msg = MIMEMultipart() # 设置邮件的内容:标题,发件人,收件人 msg['subject'] = Header(subject, 'utf-8') # 邮件标题对象添加标题 msg['from'] = formataddr(('LH', self.email_from_addr)) # 添加发件人 try: if len(self.email_to_addr) > 0: msg['to'] = ','.join(self.email_to_addr) # 添加收件人 else: raise NoMailListErrot('还没添加收件人了,去加下吧') # body代表发送的内容,mailtype为内容的格式:文本(plian)或html msg.attach(MIMEText(body, mailtype, 'utf-8')) # 定义邮件的格式 # 如果有附件,则添加进去 if attachment: # 使用二进制模式打开 with open(attachment, 'rb') as f: # MIMEBase表示附件对象 mime = MIMEBase('text', 'txt', filename=attachment) # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字 mime.add_header('Content-Disposition', '456', filename='hui.py') mime.set_payload(f.read()) # 读取文件的内容到付件中 encoders.encode_base64(mime) # 定义传输的编码协议,避免错落 msg.attach(mime) # 将附件添加到邮件中 self.smtp.sendmail(self.email_from_addr, self.email_to_addr, msg.as_string()) # 发送邮件 self.smtp.quit() except smtplib.SMTPException as e: print(e)
测试:
e = MailMaster()e.add_emali_to_list('2323449277@qq.com')e.add_emali_to_list('18768196753@139.com')e.notice('娄辉', '注册成功!!')