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

哈喽大家好,我是鹏哥。

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

~~~上课铃~~~

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)邮件账号只需要@前面的内容或者自己的邮箱昵称。

示例代码

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 = '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吧!

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值