python发送email邮件
Posted 戏子人生10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python发送email邮件相关的知识,希望对你有一定的参考价值。
一.开启邮箱SMTP服务
发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、qq等邮箱。
QQ邮箱配置方式如下:
1) 登录qq邮箱,选择【设置】-【账户】
2) 在POP3/IMAP/SMAP/Exchage/CardDAV/CalDAV服务中,找到POP3/SMTP服务和IMAP/SMTP服务,点击开启。
2) 在新页面点击“客户端授权密码”,勾选“开启”,弹出新窗口填写手机验证码。
3) 填写授权码
4) 提示开启成功。
二、使用python发送邮件
- 使用python自带的模块:smptlib、email
import smtplib from email.mime.text import MIMEText from email.header import Header
1、发送普通的邮件
# 发送邮件的步骤 import smtplib from email.mime.text import MIMEText # 用来构造文本类型的邮件 from email.header import Header # 用来构造邮件的头部 # 第一步:创建一个SMTP的对象 s = smtplib.SMTP() # 第二步:连接到SMTP的服务器 host = \'smtp.163.com\' # 设置163邮箱服务器,端口为:25 port = 25 # host = \'smtp.qq.com\' port = 465 # 设置qq邮箱服务器,端口为:465 s.connect(host,port) # 连接服务器 # s.connect(host = \'smtp.163.com\',port = 25) # 第三步:登录SMTP服务器 mail_user = \'18814726725@163.com\' # 163邮箱的用户名 mail_pass = \'password\' # 注意:此处填写的是邮箱的SMTP服务器授权码 s.login(user=mail_user,password=mail_pass) # 第四步:构建邮件内容 content = \'使用python测试发送邮件\' # 构建邮件内容 msg = MIMEText(content,_charset=\'utf8\') # _charset 指定编码格式 msg[\'Subject\'] = Header(\'测试报告\',\'utf8\') # 邮件主题 msg[\'From\'] = \'wl18814726725@163.com\' # 发件人邮箱,可传入列表,用于给多个人发送文件 msg[\'To\'] = \'1572533878@qq.com\' # 收件人 # 第五步:发送邮件 s.sendmail(from_addr=msg[\'From\'],to_addrs=msg[\'To\'],msg=msg.as_string()) #将邮件内容转换为字符串
2、发送HTML格式邮件及附件
import smtplib from email.mime.text import MIMEText # 文本类型的邮件,用来构造邮件 from email.header import Header # 用来构造邮件的头部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart # 用来构造附件 # 发送邮件的步骤 # 第一步:创建一个SMTP的对象 s = smtplib.SMTP() # 第二步:连接到SMTP的服务器 host = \'smtp.163.com\' # 设置163邮箱服务器,端口为:25 port = 25 # host = \'smtp.qq.com\' # 设置qq邮箱服务器,端口为:465 s.connect(host,port) # 连接服务器 # 第三步:登录SMTP服务器 mail_user = \'wl18814726725@163.com\' # 163邮箱的用户名 mail_pass = \'wl987654321\' # 注意:此处填写的是邮箱的SMTP服务器授权码 s.login(user=mail_user,password=mail_pass) # 构造文本邮件内容 content = \'使用python测试发送邮件\' # 构建邮件内容 textcontent = MIMEText(content,_charset=\'utf8\') # _charset 指定编码格式 # 构造附件(二进制字节流形式) part = MIMEApplication(open("report.html",\'rb\').read(),_subtype=None) # part = MIMEApplication(open("report.html",\'rb\').read()) 需要查看_subtype=None 是否会引发异常 part.add_header(\'content-disposition\', \'attachment\', filename=\'report18.html\') # 对方收到邮件之后,附件在邮件中显示的名称 # 封装一封邮件 msg = MIMEMultipart() # 加入文本内容 msg.attach(textcontent) msg.attach(part) # 发送邮件 msg[\'From\'] = \'wl18814726725@163.com\' #发件人邮箱 msg[\'To\'] = \'1572533878@qq.com\' #收件人 #第五步:发送邮件 s.sendmail(from_addr=\'wl18814726725@163.com\',to_addrs=\'1572533878@qq.com\',msg=msg.as_string()) # 将邮件内容转换为字符串 定义send_email函数 import smtplib from email.mime.text import MIMEText #文本类型的邮件,用来构造邮件 from email.header import Header #用来构造邮件的头部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart #用来构造附件 def send_email(filepath): """ :param filepath: #传入报告文件的路径 :return: """ # 发送邮件的步骤 # 第一步:创建一个SMTP的对象 s = smtplib.SMTP() # 第二步:连接到SMTP的服务器 host = \'smtp.163.com\' #设置163邮箱服务器,端口为:25 port = 25 # host = \'smtp.qq.com\' #设置qq邮箱服务器,端口为:465 s.connect(host,port) #连接服务器 # 第三步:登录SMTP服务器 mail_user = \'wl18814726725@163.com\' #163邮箱的用户名 mail_pass = \'wl987654321\' #注意:此处填写的是邮箱的SMTP服务器授权码 s.login(user=mail_user,password=mail_pass) #构造文本邮件内容 content = \'使用python测试发送邮件\' #构建邮件内容 textcontent = MIMEText(content,_charset=\'utf8\') #_charset 指定编码格式 #构造附件(二进制字节流形式) part = MIMEApplication(open(filepath,\'rb\').read()) part.add_header(\'content-disposition\', \'attachment\', filename=\'report988.html\') #对方收到邮件之后,附件在邮件中显示的名称 # 封装一封邮件 msg = MIMEMultipart() #加入附件和文本内容 msg.attach(textcontent) msg.attach(part) #发送邮件 msg[\'From\'] = \'wl18814726725@163.com\' #发件人邮箱 msg[\'To\'] = \'1572533878@qq.com\' #收件人 #第五步:发送邮件 s.sendmail(from_addr=msg[\'From\'],to_addrs=msg[\'To\'],msg=msg.as_string()) #将邮件内容转换为字符串 send_email(\'report.html\')
定义send_email函数
import smtplib from email.mime.text import MIMEText # 文本类型的邮件,用来构造邮件 from email.header import Header # 用来构造邮件的头部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart # 用来构造附件 # 发送邮件的步骤 # 第一步:创建一个SMTP的对象 s = smtplib.SMTP() # 第二步:连接到SMTP的服务器 host = \'smtp.163.com\' # 设置163邮箱服务器,端口为:25 port = 25 # host = \'smtp.qq.com\' # 设置qq邮箱服务器,端口为:465 s.connect(host,port) # 连接服务器 # 第三步:登录SMTP服务器 mail_user = \'wl18814726725@163.com\' # 163邮箱的用户名 mail_pass = \'password\' # 注意:此处填写的是邮箱的SMTP服务器授权码 s.login(user=mail_user,password=mail_pass) # 构造文本邮件内容 content = \'使用python测试发送邮件\' # 构建邮件内容 textcontent = MIMEText(content,_charset=\'utf8\') # _charset 指定编码格式 # 构造附件(二进制字节流形式) part = MIMEApplication(open("report.html",\'rb\').read(),_subtype=None) # part = MIMEApplication(open("report.html",\'rb\').read()) 需要查看_subtype=None 是否会引发异常 part.add_header(\'content-disposition\', \'attachment\', filename=\'report18.html\') # 对方收到邮件之后,附件在邮件中显示的名称 # 封装一封邮件 msg = MIMEMultipart() # 加入文本内容 msg.attach(textcontent) msg.attach(part) # 发送邮件 msg[\'From\'] = \'wl18814726725@163.com\' #发件人邮箱 msg[\'To\'] = \'1572533878@qq.com\' #收件人 #第五步:发送邮件 s.sendmail(from_addr=\'wl18814726725@163.com\',to_addrs=\'1572533878@qq.com\',msg=msg.as_string()) # 将邮件内容转换为字符串
使用python发送邮件时常见错误:
错误1:smtplib.SMTPAuthenticationError: (550, b\'User has no permission\')
我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的(对指定的邮箱大师客户端默认开启),因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码)。上述有专门的设置方法。
错误2:smtplib.SMTPAuthenticationError: (535, b\'Error: authentication failed\')
以163邮箱为例,在开启POP3/SMTP服务,并开启客户端授权密码时会设置授权码,将这个授权码代替smtplib.SMTP().login(user,password)方法中的password即可。
错误3:给多人发送邮件是,可能会出现“AttributeError: \'list\' object has no attribute \'encode\'”或者写了多个人,实际只给第一个人发了邮件等错误。
# 将所有的收件人邮箱写入到一个字符串中 msg[\'To\'] = \'1668010021@qq.com, 1572533878@qq.com, wangle@kyee.com.cn, 2685083419@qq.com\' # 发送邮件时,通过字符串函数split分割,分割后返回的每一个邮箱账号 s.sendmail(from_addr=msg[\'From\'], to_addrs=msg[\'To\'].split(\',\'), msg=msg.as_string())
以上是关于python发送email邮件的主要内容,如果未能解决你的问题,请参考以下文章