文档开发者中心
我的

【Python成长之路】用python实现邮件发送功能

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>

<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)



【参考】

点赞
收藏
回复
2
分享
举报
浏览1816 发布于2019-11-25 15:32未知归属地
全部评论
最多点赞
最新发布
最早发布

多多分享啊,我还挺喜欢看的


1楼回复于2019-11-27 18:31 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。