欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 22:26:34
...

哈喽大家好,我是鹏哥。

好久没有写博客了,最近是有点偷懒。今天想学习记录的内容是 —— 邮件发送。

~~~上课铃~~~

【Python成长之路】用python实现邮件发送功能Time BackBad Style - Kontrabanda【Python成长之路】用python实现邮件发送功能

1

课题背景

其实在写Python成长之路系列,慢慢有些懈怠了,不知道要如何督促自己来学习成长。结果前段时间由于工作需要,需要经常以邮件方式发项目进展给同事。自然就联想到了用python来替我完成机械式的动作。

2

效果展示

1、邮件正文发送,并将图片、文本等以附件形式添加

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

 

2、以html超文本形式,将文本和图片一起在正文里显示

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

3

遇到的坑(敲黑板啦)

其实关于python实现邮件发送的示例代码或者网上有很多类似的帖子,从示例代码来 看也很简单。但是绝知此事要躬行后,会发现有几个坑等着我去跳。

1、第一个坑:通过smtp登录时,发现登录报错。错误码如下:smtplib.SMTPHeloError: (500, b'Error: bad syntax')

开始遇到这个错误,网上一查,很快就找到了问题原因:是由于163邮箱没有开户客户端授权,如下图

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

这个问题很好解决,只需要根据界面提示开启下授权。(这里有个小细节,在代码登录时用的并不邮箱登录密码,而是这里的授权码;并且授权码设置时不能和登录密码一样。)

 

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”这个信息。

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

 

解决方法:

在“控制版面”中点击“查看网络状态和任务”进入“网络和共享中心”,点击现在使用的网络连接,点击网络连接的【属性】按钮,双击“Internet 协议版本 4(TCP/IPv4)”这一项,再点击【高级】按钮,切换到“DNS”标签,把“此连接的 DNS 后缀”修改为 HOST 或清空,然后依次确认保存。

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

▲DNS后缀改为"HOST"

之后对应内容就会变成如下:

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

至此,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"'

 

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

(2)邮件账号只需要@前面的内容或者自己的邮箱昵称。

示例代码

1、邮件正文发送,并将图片、文本等以附件形式添加​​​​​​

# coding=utf-8# @Auther : "鹏哥贼优秀"# @Date : 2019/11/22# @Software : PyCharm
import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.header import Headerimport 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 = 'aaa@qq.com'    receiver = ['aaa@qq.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成长之路】用python实现邮件发送功能

【Python成长之路】用python实现邮件发送功能点击下方诗句,可以互动留言……

愿你遇良人,予你欢喜城,长歌暖浮生

 

扫描二维码

  与鹏哥一起学

python吧!

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

 

【参考】https://www.sohu.com/a/194137114_650589