smtplib
python3
pycharm
利用smtplib及SMTP服务器进行自动发送邮件
可以发送普通文本的正文、html格式的正文
可以添加单个附件,多个附件
import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart import re # 提取文件路径中的文件名 def file_name(path): ''' 提取文件路径中的文件名称 :param path:文件路径 :return:文件名称 ''' reg = r'([^<>/\\\|:""\*\?]+\.\w+$)' result = re.compile(reg).findall(path)[0] return result class Mail: def __init__(self,user='xxxx@yy.com', password='********', receivers=None): ''' 初始化邮件,指定谁发送,发送给谁 :param user:发送人邮箱 :param password:邮箱密码,若qq邮箱,则为授权码 :param receivers:收件人,若多个收件人,写成列表形式 ''' #确定发送人 self.user = user # 发件人邮箱 self.password = password # 发件人密码 #根据邮箱判断服务器、正则匹配 reg = r"@(.+?).com" result=re.compile(reg).findall(user)[0] if result == 'qq': self.host='smtp.qq.com' if result == 'fulaan': self.host='smtp.exmail.qq.com' if result == '163': self.host='smtp.163.com' if result == '126': self.host='smtp.126.com' if result == '188': self.host='smtp.188.com' if result == 'netease': self.host='smtp.netease.com' if result == 'yeah': self.host='smtp.yeah.net' if result == 'gmail': self.host='smtp.gmail.com' # 确定接收人,为列表形式,若多个接收人,则在列表中加入多个元素 if receivers == None: raise Exception('Error:请输入收件人') elif isinstance(receivers,str) == True: # 判断传入的receviers类型,若不是列表,转换为列表 self.receivers = receivers.split() elif isinstance(receivers,list) == True: self.receivers = receivers def send(self,Subject,Content,From,type='plain',payload=None): ''' 指定发送内容(正文,抬头),是否添加附件 :param Subject:邮件标题 :param Content:邮件正文 :param From: 从哪里发来 :param type:正文格式,html 或者 plain :param payload:附件,默认为None,无附件;若要一并发送附件,该参数请输入附件路径;多个写成列表 :发送邮箱默认为发件人的邮箱 :return: ''' To = ','.join(self.receivers) # 发给谁,默认填写发件人邮箱 # 不添加附件 if payload == None: message = MIMEText(Content, type, 'utf-8') # 创建一个不带附件的实例,加入正文 message['Subject'] = Header(Subject, 'utf-8') # 加入标题 message['From'] = Header(From, 'utf-8') # 加入From message['To'] = Header(To, 'utf-8') # 加入To # 添加附件 else: message = MIMEMultipart() # 构造一个带附件的实例 message.attach(MIMEText(Content, type, 'utf-8')) # 加入正文 message['Subject'] = Header(Subject, 'utf-8') # 加入标题 message['From'] = Header(From, 'utf-8') # 加入From message['To'] = Header(To, 'utf-8') # 加入To #判断附件个数,若为1个,转为列表 if isinstance(payload,str) == True: list=payload.split() elif isinstance(payload,list) == True: list=payload # 构造附件 for i in list: payload_add = MIMEText(open('{}'.format(i), 'rb').read(), 'base64', 'utf-8') # 选择附件 payload_add["Content-Type"] = 'application/octet-stream' # 定义附件类型 payload_add.add_header( 'Content-Disposition', 'attachment', filename=('gbk', '', file_name(i)) # 所发出的文件名默认为原文件名,这里要加入编码设置,不然中文会显示乱码 ) # 加入附件 message.attach(payload_add) # 一个附件,执行一次;多个附件,执行多次 # 连接服务器,并且发送邮件 try: smtp = smtplib.SMTP() smtp.connect(self.host) smtp.login(self.user, self.password) smtp.sendmail(self.user, self.receivers, message.as_string()) print('发送成功!') except: raise Exception('Error:发送失败,请检查密码是否正确,邮箱是否开启SMTP服务,正文格式')
使用
from mail import Mail mail=Mail(receivers='4903xxxxxx@qq.com') #user、password使用默认值 mail.send( Subject='python test', Content='<html><p style="color: red">你好,这是一封测试邮件!!!</p></html>', From='xxxx', type='html', payload="D:\hello\\test\\2019-1-16测试报告.txt" )
---------------
发送成功!
注:若要使用smtplib发送邮件,发送的邮箱需进行设置,开启SMTP服务,方可进行发送