Python 实现邮件发送功能(进阶)
上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题。
本章主要包含知识点:
1. 如何将图片放到邮件主体中发送
2. 如何发送附件
问题一: 如何将图片放在邮件主体中发送
从上篇中应该都已知道,其实发送邮件,就是发送Html格式的字符串,那么发送图片时,可不可以也放到html中去呢?答案是肯定的,但是html中有一个指定图片的地址或来源,那么邮件中该指向何处呢?答案是附件。
根据这个思路,在发送文本的代码上进行一个优化,先上代码:
class Email4Pic(Email): ''' 入参为filenames 即图片列表,即可以一次发送多张图片 ''' def __init__(self, filenames : list): super(Email4Pic, self).__init__() self.filenames = filenames def message_init(self, html): message = MIMEMultipart() message['subject'] = Header(self.subject, 'utf-8') message['From'] = self.sender message['To'] = ', '.join(self.receiver) message['Cc'] = ', '.join(self.cc) # 解决乱码, html是html格式的str message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 邮件正文内容 message.attach(message_context) # 邮件加入图片 cid = 0 for filename in self.filenames: m_file = MIMEBase('image','jpg') m_file.add_header('Content-Disposition', 'attachment') # 将图片放进附件 m_file.add_header('Content-ID', '<' + str(cid) + '>') # 设置图片id f = open(filename, 'rb') m_file.set_payload(f.read()) encoders.encode_base64(m_file) 32 message.attach(m_file) cid += 1 return message if __name__ == '__main__': print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png" pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg" pics = [] pics.append(pic1) pics.append(pic2) sendpic = Email4Pic(pics) sendpic.smtp = 'smtp.163.com' sendpic.username = 'wjian.coming@163.com' sendpic.password = 'passwd' sendpic.subject = 'Test/测试邮件' sendpic.sender = 'wjian.coming@163.com' sendpic.receiver.append('948001879@qq.com') sendpic.cc.append('948001879@qq.com') strs = '''<span>This is the first picture</span><br> <img src='cid:0'><br> <span>This is the Second picture</span><br> <img src='cid:1'>''' sendpic.send_email(strs) 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张呢,那不得用附件形式才更合理? 这正是接下来准备讲的,如何发送附件呢?
同样,有了上面的经验,我们也写一个子类,只不过这次只要将文件读入附件即可,不需要写到邮件 ad0 主体中,代码如下:
class Email4Attr(Email): ''' 入参为filenames 即文件列表,即可以一次发送多个附件 ''' def __init__(self, filenames : list): super(Email4Attr, self).__init__() self.filenames = filenames def message_init(self, html): message = MIMEMultipart() message['subject'] = Header(self.subject, 'utf-8') message['From'] = self.sender message['To'] = ', '.join(self.receiver) message['Cc'] = ', '.join(self.cc) # 解决乱码, html是html格式的str message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 邮件正文内容 message.attach(message_context) # 邮件加入图片 for filename in self.filenames: name = os.path.split(filename)[-1] # 从绝对路径中取出文件名 m_file = MIMEBase('image','jpg') m_file.add_header('Content-Disposition', 'attachment', filename = name) # 将文件放入附件 f = open(filename, 'rb') m_file.set_payload(f.read()) encoders.encode_base64(m_file) message.attach(m_file) return message if __name__ == '__main__': print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png" pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg" pics = [] pics.append(pic1) pics.append(pic2) sendAtt = Email4Attr(pics) sendAtt.smtp = 'smtp.163.com' sendAtt.username = 'wjian.coming@163.com' sendAtt.password = 'passwd' sendAtt.subject = 'Test/测试邮件' sendAtt.sender = 'wjian.coming@163.com' sendAtt.receiver.append('948001879@qq.com') sendAtt.cc.append('948001879@qq.com') strs = 'Please check the attachment ' sendAtt.send_email(strs) print('end')
可以看出,与图片不同的地方就是处理内容的方式不同,一个是放在附件中,并标记ID由主体内容读取,一个是直接放到附件中。
第26行:将文件写入附件中,利用filename这个关键属性命名附件
如上执行后,我们看下发送后的效果,此时两个图片已经被放进了附件中。对于文件类型的附件,都是一样处理,直接按规则调用就行了,这里就不再示例,有兴趣的伙伴可以自己下来试试呢。
综上,对于邮件的发送只要按照指定的框架即可轻松定制,这里只是做了个指引和参考,如果您有更好的想法,或更难的挑战,不妨评论区留言,我们来互相交流一下啊。
(希望我的文章能够助你一臂之力,成就更辉煌的你,关注我,我们一起进步)
- Python3实现发送QQ邮件功能(附件)
- Python django实现简单的邮件系统发送邮件功能
- python实现微信发送邮件关闭电脑功能
- python基础编程:selenium+python实现自动登陆QQ邮箱并发送邮件功能
- Python实现自动发送邮件功能
- python3.4实现邮件发送功能
- python_实现发送邮件功能
- python实现12306抢票及自动邮件发送提醒付款功能
- python自动发送测试报告邮件功能的实现
- Python基于SMTP协议实现发送邮件功能详解
- Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
- linux , python 发送邮件,基本实现了mutt常用功能
- python脚本实现发送邮件功能
- Python实现的查询mysql数据库并通过邮件发送信息功能
- python实现发送邮件功能
- Python3实现发送QQ邮件功能(html)
- Python smtplib实现发送邮件功能
- Python3实现发送QQ邮件功能(文本)
- Python脚本实现发送邮件功能
- python发送邮件功能实现代码