python内建模块:smtplib
Posted cooper_wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python内建模块: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服务,方可进行发送
以上是关于python内建模块:smtplib的主要内容,如果未能解决你的问题,请参考以下文章
python模块----yagmail模块smtplib模块 (电子邮件)