首页 > 编程语言 > 详细

Python 实现邮件发送功能(进阶)

时间:2020-07-18 00:49:22      阅读:82      评论:0      收藏:0      [点我收藏+]

上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题。

  本章主要包含知识点:

1. 如何将图片放到邮件主体中发送

2. 如何发送附件

问题一: 如何将图片放在邮件主体中发送

从上篇中应该都已知道,其实发送邮件,就是发送Html格式的字符串,那么发送图片时,可不可以也放到html中去呢?答案是肯定的,但是html中有一个指定图片的地址或来源,那么邮件中该指向何处呢?答案是附件。

根据这个思路,在发送文本的代码上进行一个优化,先上代码:

 1 class Email4Pic(Email):
 2     ‘‘‘ 
 3         入参为filenames 即图片列表,即可以一次发送多张图片
 4     ‘‘‘
 5     def __init__(self, filenames : list):
 6         super(Email4Pic, self).__init__()
 7         self.filenames = filenames
 8     
 9     def message_init(self, html):
10         message = MIMEMultipart()
11         message[subject] = Header(self.subject, utf-8)
12         message[From] = self.sender
13         message[To] = , .join(self.receiver)
14         message[Cc] = , .join(self.cc)
15 
16         # 解决乱码, html是html格式的str
17         message_context = MIMEText(html, _subtype=html, _charset=utf-8)
18 
19         # 邮件正文内容
20         message.attach(message_context)
21 
22         # 邮件加入图片
23         cid = 0
24         for filename in self.filenames:
25             m_file = MIMEBase(image,jpg)
26             m_file.add_header(Content-Disposition, attachment)     # 将图片放进附件
27             m_file.add_header(Content-ID, < + str(cid) + >)      # 设置图片id
28             
29             f = open(filename, rb)
30             m_file.set_payload(f.read())
31             encoders.encode_base64(m_file)
32             message.attach(m_file)
33             cid += 1
34         return message
35 
36 if __name__ == __main__:
37     print(start……)
38 
39     pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
40     pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
41     pics = []
42     pics.append(pic1)
43     pics.append(pic2)
44 
45     sendpic = Email4Pic(pics)
46 
47     sendpic.smtp = smtp.163.com
48     sendpic.username = wjian.coming@163.com
49     sendpic.password = passwd
50     sendpic.subject = Test/测试邮件
51     sendpic.sender = wjian.coming@163.com
52     sendpic.receiver.append(948001879@qq.com)
53     sendpic.cc.append(948001879@qq.com)
54 
55     strs = ‘‘‘<span>This is the first picture</span><br> <img src=‘cid:0‘><br> 
56               <span>This is the Second picture</span><br> <img src=‘cid:1‘>‘‘‘
57 
58     sendpic.send_email(strs) 
59 
60     print(end)

没错!发送图片即在原来的父类上做了个子类,并复用了父类中的属性和部分方法(send_email),并在message_init方法基础上添加了图片处理的一些逻辑。

第6行:即继承父类的属性

第25~32行:将图片放进附件缓存中,并将每个图片标记ID,再读取后放入邮件主体文本中

第55~56行:此字符串就是即将发送的html格式文件,其中 <img src=‘cid:0‘> 即读取编号为0的图片,从附件缓存中读取的,作为html文件的图片来源

第58行:调用父类的send_email方法,发送邮件

如上执行后,我们看下发送后的效果(图片2太大,没有完全截图出来)。

这样就可以理解,只要编辑好Html就可以发送任意内容啦~

技术分享图片

 

 

 

问题二: 如何发送附件

这时,又有人出来问了,你这是两张图片,那要是100张呢,那不得用附件形式才更合理? 这正是接下来准备讲的,如何发送附件呢?

同样,有了上面的经验,我们也写一个子类,只不过这次只要将文件读入附件即可,不需要写到邮件主体中,代码如下:

 1 class Email4Attr(Email):
 2     ‘‘‘ 
 3         入参为filenames 即文件列表,即可以一次发送多个附件
 4     ‘‘‘
 5     def __init__(self, filenames : list):
 6         super(Email4Attr, self).__init__()
 7         self.filenames = filenames
 8     
 9     def message_init(self, html):
10         message = MIMEMultipart()
11         message[subject] = Header(self.subject, utf-8)
12         message[From] = self.sender
13         message[To] = , .join(self.receiver)
14         message[Cc] = , .join(self.cc)
15 
16         # 解决乱码, html是html格式的str
17         message_context = MIMEText(html, _subtype=html, _charset=utf-8)
18 
19         # 邮件正文内容
20         message.attach(message_context)
21 
22         # 邮件加入图片
23         for filename in self.filenames:
24             name = os.path.split(filename)[-1]    # 从绝对路径中取出文件名
25             m_file = MIMEBase(image,jpg)
26             m_file.add_header(Content-Disposition, attachment, filename = name)    # 将文件放入附件
27             f = open(filename, rb)
28 
29             m_file.set_payload(f.read())
30             encoders.encode_base64(m_file)
31             message.attach(m_file)
32         return message
33 
34 if __name__ == __main__:
35     print(start……)
36 
37     pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
38     pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
39     pics = []
40     pics.append(pic1)
41     pics.append(pic2)
42 
43     sendAtt = Email4Attr(pics)
44 
45     sendAtt.smtp = smtp.163.com
46     sendAtt.username = wjian.coming@163.com
47     sendAtt.password = passwd
48     sendAtt.subject = Test/测试邮件
49     sendAtt.sender = wjian.coming@163.com
50     sendAtt.receiver.append(948001879@qq.com)
51     sendAtt.cc.append(948001879@qq.com)
52 
53     strs = Please check the attachment 
54     sendAtt.send_email(strs)
55 
56     print(end)

可以看出,与图片不同的地方就是处理内容的方式不同,一个是放在附件中,并标记ID由主体内容读取,一个是直接放到附件中。

第26行:将文件写入附件中,利用filename这个关键属性命名附件

如上执行后,我们看下发送后的效果,此时两个图片已经被放进了附件中。对于文件类型的附件,都是一样处理,直接按规则调用就行了,这里就不再示例,有兴趣的伙伴可以自己下来试试呢。

技术分享图片

 

 

 

综上,对于邮件的发送只要按照指定的框架即可轻松定制,这里只是做了个指引和参考,如果您有更好的想法,或更难的挑战,不妨评论区留言,我们来互相交流一下啊。

(希望我的文章能够助你一臂之力,成就更辉煌的你,关注我,我们一起进步)

 

Python 实现邮件发送功能(进阶)

原文:https://www.cnblogs.com/potato-find/p/13334078.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!