哈喽大家好,我是鹏哥。
好久没有写博客了,最近是有点偷懒。今天想学习记录的内容是 —— 邮件发送。
~~~上课铃~~~
Time BackBad Style - Kontrabanda
1
课题背景
其实在写Python成长之路系列,慢慢有些懈怠了,不知道要如何督促自己来学习成长。结果前段时间由于工作需要,需要经常以邮件方式发项目进展给同事。自然就联想到了用python来替我完成机械式的动作。
2
效果展示
1、邮件正文发送,并将图片、文本等以附件形式添加
2、以html超文本形式,将文本和图片一起在正文里显示
3
遇到的坑(敲黑板啦)
其实关于python实现邮件发送的示例代码或者网上有很多类似的帖子,从示例代码来 看也很简单。但是绝知此事要躬行后,会发现有几个坑等着我去跳。
1、第一个坑:通过smtp登录时,发现登录报错。错误码如下:smtplib.SMTPHeloError: (500, b'Error: bad syntax')
开始遇到这个错误,网上一查,很快就找到了问题原因:是由于163邮箱没有开户客户端授权,如下图
这个问题很好解决,只需要根据界面提示开启下授权。(这里有个小细节,在代码登录时用的并不邮箱登录密码,而是这里的授权码;并且授权码设置时不能和登录密码一样。)
2、第二个坑:解决完授权码后,运行代码仍然报smtplib.SMTPHeloError: (500, b'Error: bad syntax')
这次为了查找解决方法就有点费神了。其实这里报错,还 有一个原因,就是自己网络问题。如果打印出和邮箱之间的消息交互,会发现这样一段日志:
send: ‘ehlo xxx—pc.DHCP HOST-xxxxxxxxxrn’
reply: ‘500 Error: bad syntaxrn’
这是因为DHCP和HOST之间有空格导致!我的天!可以查看自己的网络详细信息中,“连接特定的DNS后缀”里有“DHCP HOST”这个信息。
解决方法:
在“控制版面”中点击“查看网络状态和任务”进入“网络和共享中心”,点击现在使用的网络连接,点击网络连接的【属性】按钮,双击“Internet 协议版本 4(TCP/IPv4)”这一项,再点击【高级】按钮,切换到“DNS”标签,把“此连接的 DNS 后缀”修改为 HOST 或清空,然后依次确认保存。
▲DNS后缀改为"HOST"
之后对应内容就会变成如下:
至此,smtplib.SMTPHeloError: (500, b'Error: bad syntax')完全解决。
3、第3个坑:无法将图片加到正文中。
开始编写代码时,虽然知道要以html方式添加图片,但是同时我还留有
# 添加文字内容
text = "Hi!\n我是鹏哥,欢迎关注我的公众号'鹏哥贼优秀'!"
text_plain = MIMEText(text, 'plain', 'utf-8')
self.message.attach(text_plain)# 添加文字内容
由于plain格式和html格式冲突,导致图片最后并没有真正以html方式添加到正文里。因此,为了实现此功能,需要将plain相关代码删除,将文本内容以html标题或者正文方式加进去。
4、其他的一些细节问
(1)、如果添加图片时,想把图片重命名为中文名称,结果会图片名称会被自动命名,如下图:
myimage["Content-Disposition"] = 'attachment; filename="公众号.bmp"'myimage["Content-Disposition"] = 'attachment; filename="公众号.bmp"'
(2)邮件账号只需要@前面的内容或者自己的邮箱昵称。
4 示例代码
1、邮件正文发送,并将图片、文本等以附件形式添加
# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/11/22
# @Software : PyCharm
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header
import traceback
class Email():
def __init__(self,user,passwd,sender,receiver):
self.user = user
self.passwd = passwd
self.sender = sender
self.receiver = receiver
def send_email(self):
try:
# 登入163邮箱
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com',25)
smtp.login(self.user, self.passwd)
# 构造邮件对象MIMEMultipart对象
self.message = MIMEMultipart('mixed')
# 设置邮件发送者、接收者、邮件主题
self.message['From'] = Header('鹏哥贼优秀','utf-8') # 发送者
self.message['To'] = Header('test') # 接收者
self.message['Subject'] = Header('Python SMTP 邮件测试', 'utf-8') #邮件主题
# 添加文字内容
text = "Hi!\n我是鹏哥,欢迎关注我的公众号'鹏哥贼优秀'!"
text_plain = MIMEText(text, 'plain', 'utf-8')
self.message.attach(text_plain)
# 添加图片附件
pic = open(r'F:\素材\图片\公众号.bmp', 'rb').read()
myimage = MIMEImage(pic)
myimage.add_header('Content-ID', '<image1>')
myimage["Content-Disposition"] = 'attachment; filename="公众号.bmp"'
self.message.attach(myimage)
# 添加文件作为附件
file = open(r'F:\Python成长之路\邮件发送\test.txt', 'rb').read()
myfile = MIMEText(file, 'base64', 'utf-8')
myfile["Content-Type"] = 'application/octet-stream'
myfile["Content-Disposition"] = 'attachment; filename="newtest.txt"'
self.message.attach(myfile)
# 发送邮件
smtp.sendmail(self.sender, self.receiver, self.message.as_string())
smtp.quit()
print('邮件发送成功!')
except:
traceback.print_exc()
print('邮件发送失败!')
if __name__ == "__main__":
user = '账号'
passwd = '密码'
sender = 'XXXX@163.com'
receiver = ['XXXX@163.com']
email = Email(user,passwd,sender,receiver)
email.send_email()
2、将图片加到正文中。(多数代码是一样的,仅message处不一致,因此只附这段代码)
# 添加文字内容
text = '''<html lang="en">
<body>
<h1>下面是我的公众号</h1>
<img src="cid:0">
</body>
</html>'''
text_plain = MIMEText(text, 'html', 'utf-8')
self.message.attach(text_plain)
# 添加图片附件
pic = open(r'F:\素材\图片\公众号.bmp', 'rb').read()
myimage = MIMEImage(pic)
myimage.add_header('Content-ID', '<0>')
myimage["Content-Disposition"] = 'attachment; filename="公众号.bmp"'
self.message.attach(myimage)
点击下方诗句,可以互动留言……
扫描二维码
与鹏哥一起学
python吧!