import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
'''
使用Python及SMTP协议发送邮件(以163邮箱为例)
一是尝试封装成类,和支持with上下文管理器。
二是构建了text和mutli两种类型的邮件。
三是实现抄送和独立出附件添加。
'''class My163:def __init__(self):self._mail_host = 'smtp.163.com'  # 163邮箱服务器地址self._mail_user = 'xxxxxx@163.com'  # 163用户名self._mail_pass = 'HUHSANADHISAHSNDJ'  # 密码(部分邮箱为授权码)# self._smtpObj = smtplib.SMTP()  # 根据是否ssl认证进行二选一self._smtpObj = smtplib.SMTP_SSL(self._mail_host, port=465)  # 根据是否ssl认证进行二选一def __enter__(self):print('Info: Enter My163 ... ')try:# 连接到服务器# self._smtpObj.connect(host=self._mail_host, port=25)self._smtpObj.connect(host=self._mail_host, port=465)# 登录到服务器res = self._smtpObj.login(user=self._mail_user, password=self._mail_pass)print(f'登录结果:{res}')except smtplib.SMTPException as e:print("163 email login failed with error: %s" % e)  # 打印错误finally:return self  # 注意enter里面一定要返回类的对象self,否则无法调用run方法。def __exit__(self, exc_type, exc_val, exc_tb):print('Info: Exit My163')self._smtpObj.quit()def email_send(self, to_addrs, message):'''# 邮件发送:param to_addrs: 包含所有收件人的列表:param message: 邮件格式化的字符串,或邮件对象如 message = '\n'.join(['From: {}'.format(FROM), 'To: {}'.format(TO), 'Subject: {}'.format(SUBJECT), '', CONTENT]):return:'''try:rst = self._smtpObj.sendmail(from_addr=self._mail_user, to_addrs=to_addrs, msg=str(message))# print(f'rst: {rst}')return Trueexcept Exception as e:print("163 email login failed with error: %s" % e)  # 打印错误return Falsedef textMail_send(self,from_addr='Cameback_Tang',to_addrs=['111222333@qq.com'],cc_addrs=[],bcc_addrs=[],subject='emailTitle',content='messageText'):'''发送字符串等正文文本信息,使用 MIMEText 对象,不能附件:param from_addr: 其实只是别名,效果:XXXXX@163.com on behalf of xxxxxx@163.com:param to_addrs: 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发:param cc_addrs: 抄送人列表:param bcc_addrs: 秘密抄送人列表:param title: 邮件标题:param content: 邮件内容:return:'''## 1、邮件正文文本信息,可以使用 MIMEText 对象# 实例化简单邮件对象,邮件正文内容设置# 若_text参数传递了文本字符串,则_subtype参数应该传递’plain’。# 若_text参数传递了二进制文件,则_subtype参数应该传递’base64’。msg = MIMEText(content, 'plain', 'utf-8')# 2、设置设置邮件信息:邮件主题、发送人、收件人、抄送、秘密抄送# 我们使用三个引号来设置邮件信息,标准邮件需要三个头部信息: From, To, 和 Subject ,每个信息直接使用空行分割。# from email.header import Header# msg['Subject'] = Header('xmy的作业', 'utf-8').encode()msg['Subject'] = subject# msg['From'] = f'{from_addr}<{self._mail_user}>'msg['From'] = from_addrmsg['To'] = ";".join(to_addrs)  # 重复设置属追加字段,不会替换。msg['Cc'] = ";".join(cc_addrs)msg['Bcc'] = ";".join(bcc_addrs)# 3、给 所有收件人 send emailaddressees = to_addrs + cc_addrs + bcc_addrsreturn self.email_send(to_addrs=addressees, message=msg)def add_image_attachment(self, multiMsg, filePath, filenameInEmail=None):'''添加照片附件:param multiMsg: MIMEMultipart(),实例化复合邮件对象:param filePath: 文件路径:需要检查 filePath 是否存在:param filenameInEmail: 邮件中的附件命名,默认None即使用filePath中的文件名字:return:'''if os.path.exists(filePath):passelse:print(f'找不到附件:{filePath}')print('请将附件上传到项目目录')return multiMsgif filenameInEmail:passelse:filenameInEmail = os.path.basename(filePath)with open(filePath, 'rb') as fp:picture = MIMEImage(fp.read())picture['Content-Type'] = 'application/octet-stream'  # 附件设置内容类型,方便起见,设置为二进制流picture['Content-Disposition'] = f'attachment; filename="{filenameInEmail}"'  # 附件命名multiMsg.attach(picture)return multiMsgdef add_text_attachment(self, multiMsg, filePath, filenameInEmail=None):'''添加文本附件:param multiMsg: MIMEMultipart(),实例化复合邮件对象:param filePath: 文件路径:需要检查 filePath 是否存在 todo:param filenameInEmail: 邮件中的附件命名,默认None即使用filePath中的文件名字:return:'''if os.path.exists(filePath):passelse:print(f'找不到附件:{filePath}')print('请将附件上传到项目目录')return multiMsgif filenameInEmail:passelse:filenameInEmail = os.path.basename(filePath)# # 添加文件附件with open(filePath, 'rb') as f:# 以二进制读入文件,创建文本邮件对象file_data = MIMEText(f.read(), 'base64', 'utf-8')# file_data.add_header('Content-Disposition', 'attachment; filename="countryCode.xlsx"')file_data['Content-Type'] = 'application/octet-stream'  # 附件设置内容类型,方便起见,设置为二进制流file_data['Content-Disposition'] = f'attachment; filename="{filenameInEmail}"'  # 附件命名multiMsg.attach(file_data)  # 添加附件到复合邮件对象中, attach一次只能放一个简单邮件对象return multiMsgdef multiTypeMailer_send(self,from_addr='Cameback_Tang',to_addrs=['111222333@qq.com'],cc_addrs=[],bcc_addrs=[],subject='emailTitle',mail_html_msg='<p>人生苦短,我用Python</p>',attachments=None):'''发送带附件的邮件,首先要创建 MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,:param from_addr: 其实只是别名,效果:XXXXX@163.com on behalf of xxxxxx@163.com:param to_addrs: 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发:param cc_addrs: 抄送人列表:param bcc_addrs: 秘密抄送人列表:param title: 邮件标题:param mail_html_msg: 邮件内容:param attachments: 附件路径列表:return:'''# 1、构造MIMEMultipart对象作为根容器# 实例化复合邮件对象。它可以用来装载多个简单邮件对象msg = MIMEMultipart()# # 3、邮件正文# 推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等。    # 添加HTML内容, 三双引号# 可以使用 MIMEMultipart 对象,也可以使用 MIMEText 对象, 并添加正文到复合邮件对象中msgContent = MIMEMultipart()msg.attach(msgContent)msgContent.attach(MIMEText(mail_html_msg, 'html', 'utf-8'))# # 4、邮件附件,读取附件内容, 注意以“二进制读”方式读取# 文本、图片、音频if attachments:for attachment in attachments:basename = os.path.basename(attachment)attachment_type = basename.split('.')[1]  # 如'image1.png'為 image1if attachment_type in ['txt', 'csv', 'xlsx', 'py']:msg = self.add_text_attachment(msg, filePath=attachment, filenameInEmail=None)elif attachment_type in ['png', 'jpg']:msg = self.add_image_attachment(msg, filePath=attachment, filenameInEmail=None)else:print(f'附件添加失败,属代码不支持的未知文件类型:{attachment}')# 2、设置设置邮件信息# 邮件主题、发送人(可以别名)、收件人、抄送、秘密抄送# 5、给 所有收件人 send emailmsg['Subject'] = subjectmsg['From'] = f'{from_addr}<{self._mail_user}>'msg['to'] = ";".join(to_addrs)msg['Cc'] = ";".join(cc_addrs)msg['Bcc'] = ";".join(bcc_addrs)addressees = to_addrs + cc_addrs + bcc_addrsreturn self.email_send(message=msg, to_addrs=addressees)with My163() as my163:my163.textMail_send( from_addr='camebackTang@163.com',to_addrs=['112233@qq.com'])# my163.multiTypeMailer_send(attachments=['xinkula.png'])

关于from怎么设置以及有什么效果,还是要试试看才知道。好像不同的邮箱显示的效果也会不一样。

使用Python及SMTP协议发送邮件(以163邮箱为例)相关推荐

  1. Python 使用SMTP协议发送邮件

    引言 问题基于<计算机网络自定向下>第二章的课后套接字编程作业:邮件客户 题目的下载链接:python 压缩包 题目如下: 这个实验结束时,您将能够更好地了解SMTP协议.您还将获得使用P ...

  2. python应用系列教程——python使用smtp协议发送邮件:html文本邮件、图片邮件、文件附件邮件

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用smtp协议发送电子邮件.包含发送html文本邮件.包含图片附件的邮件,包含其他文件附件的邮件.可设置邮件的收发人,主题,内容 ...

  3. 命令行发送SMTP协议邮件(163邮箱)

    这里我们用163邮箱为例子,借助命令行发送smtp邮件 1.连接服务器 在终端上输入:telnet smtp.163.com 25 回车,然后就连接了服务器的25端口,成功会输出 220 163.co ...

  4. SMTP协议发送邮件

    网上找了一个smtp邮箱的发送工具类,还行,用我自己的qq测试可以发送package com.exampleimport javax.mail.Address; import javax.mail.S ...

  5. Linux 平台使用smtp协议发送邮件

    Linux平台使用smtp协议 发送邮件 前言 项目简介 项目开发环境 项目代码 测试结果以及存在问题 写在最后 前言 本人第一次写博客,主要目的是想记录一下自己的学习结果,本篇博客内容纯手打,参考资 ...

  6. smtp协议源ip是服务器地址吗,Smtp协议发送邮件

    Smtp协议发送邮件,是最全面的smtp协议发送邮件教程!有助于新手快速入门,从而跟好的进阶学习.本文档内容丰富,知识全面,简单易懂 Smtp协议发送邮件 MTP(Simple Mail Transf ...

  7. MATLAB: 用MATLAB发送邮件(以163邮箱为例)

    MATLAB: 用MATLAB发送邮件(以163邮箱为例) 问题描述 有时我们运行一些耗时很长的程序,就让计算机自己跑,人走开了.这种情况下如果程序出错或者运行完毕,程序员不能及时获得通知.但是强大的 ...

  8. python怎么发送邮件_python中是如何借助smtp协议发送邮件的?

    前言 现如今邮件已经逐渐替代了书信传递,成为日常办公不可缺少的一部分.在Java开发中,我们会利用POP3协议和SMTP协议借助java类来发送邮件,从而我们了解到,要想发送邮件,需要拥有可以发送邮件 ...

  9. Python 使用第三方 SMTP 服务发送邮件(qq邮箱)

    原文链接:http://www.runoob.com/python/python-email.html Python SMTP发送邮件 SMTP(Simple Mail Transfer Protoc ...

  10. 开发第一步之SMTP协议发送邮件,获取手机的详细信息

    目前是测试代码,只有一个页面,运行软件时会自动的获取系统信息,并且发送,开机自启动等. 布局准备把应用的图标让他从下往上旋转变大,应用的名称从左往右移动,应用的版本从右往左移动,现在只是用文字代替,看 ...

最新文章

  1. 深入分析jquery解析json数据
  2. 深度神经网络中的归一化技术
  3. Java实现用时间戳重命名上传的文件
  4. 终于等到DUDU把MetaBlog Api打开了
  5. 1.极限——ε-δ例子_7
  6. python爬虫怎么发布请求_http请求如何在python爬虫中实现?
  7. WMS仓储管理系统解决方案
  8. 双闭环直流调速系统仿真
  9. java-数字转换汉语中人民币的大写
  10. Java mail outlook发邮件提示升级TLS1.2
  11. 将串口转换成TCP连接
  12. ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式
  13. 基于子类的动态代理(使用CBl工具)
  14. 【千锋Python2205班9.29笔记-day09-字符串(一阶段)】
  15. 读书笔记——事务总结
  16. uiautomator2安卓测试框架报No tests found for given includes
  17. java 字符串转list_浅谈java 字符串,字符数组,list间的转化
  18. matlab 人工势能法,人工势能场(APF)的原理
  19. Android记事本NotePad应用功能拓展(五)
  20. 分布式面试之ActiveMQ面试题

热门文章

  1. 2018数字资产投资峰会:金融科技区块链支持可持续发展-北京站
  2. 如何提高计算机打字,如何练电脑打字速度,教你如何科学提高打字速度
  3. 计算机在汉语言文学专业中的应用,浅谈信息技术在中专学校汉语言文学专业中的应用...
  4. (附源码)基于Java SpringBoot的电影院管理系统设计与实现 毕业设计 011633
  5. 《Linux设备驱动开发详解 A》一一3.1 Linux内核的发展与演变
  6. 1075:字符串统计
  7. 用友U8 业务单据打印机设置
  8. Intel Hex概述 以及 intel2readmemh 和 Intel HEX to BINARY File Converter Utility
  9. 牛客小白月赛2 H 武 【Dijkstra】
  10. 解决WIN10本地账号绑定微软账号后无法解绑的方法