python 发送邮件的示例代码(Python2/3都可以直接使用)


Posted in Python onDecember 03, 2020

发送普通邮件

发送文本和html普通邮件如下:

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):
  name, addr = parseaddr(s)
  return formataddr((Header(name, 'utf-8').encode(), addr))

def get_server(username):
  """
  通过邮箱地址获得邮箱服务器
  :param username:用户名,比如:123456@qq.com
  :return: 邮箱服务器地址,可以根据自己实际业务添加,比如:smtp.qq.com
  """
  servers = {'qq' : 'smtp.qq.com'
        , '126' : 'smtp.126.com'
        , '163' : 'smtp.163.com'
        , '139' : 'smtp.139.com'}

  for key,value in servers.items():
    if key in username:
      return value

def send_mail(username, password, to, sender_name, subject, content, email_type):
  """
  :param username: 
  :param password: 
  :param to: 接收者列表 []
  :param sender_name: 
  :param subject: 
  :param content: 
  :param email_type: 
  :return: 
  """
  from_addr = username
  password = password
  to_addr = to
  smtp_server = get_server(username)

  # 邮件正文是MIMEText类型
  msg = MIMEText('%s'%(content), '%s'%(email_type), 'utf-8')
  msg['From'] = _format_addr('%s<%s>' % (sender_name, from_addr))
  msg['To'] = _format_addr('<%s>' % to_addr)
  msg['Subject'] = Header('%s'%(subject), 'utf-8').encode()

  # 普通登陆端口是25,带ssl验证时候端口是465
  # smtp_server = 'smtp.exmail.qq.com'
  # server = smtplib.SMTP_SSL(smtp_server, 465)
  server = smtplib.SMTP(smtp_server, 25)
  server.set_debuglevel(1)
  server.login(from_addr, password)
  server.sendmail(from_addr, to_addr, msg.as_string())
  server.quit()

if __name__ == '__main__':
  """发送简单文本邮件"""
  username = '******@126.com'
  password = '******'
  sender_name = '******@126.com'
  subject = 'test 邮件'
  content = '<html><h1>ikeguang 的来信</h1></html> <a href="http://www.ikeguang.com" rel="external nofollow" >ikeguang.com</a></html>'
  # email_type 取值:plain,文本类型邮件;html,html类型邮件
  email_type = 'html'
  _to = ['******@126.com', '******@qq.com']
  for to in _to:
    send_mail(username, password, to, sender_name, subject, content, email_type)
    print('send mail to %s success' % to)

发送带附件的邮件

def send_mail_multipart(username, password, to, sender_name, subject, content, email_type):
  from_addr = username
  password = password
  to_addr = to
  smtp_server = get_server(username)

  msg = MIMEMultipart()
  # 邮件正文是MIMEText类型
  msg.attach(MIMEText('%s'%(content), '%s'%(email_type), 'utf-8'))
  msg['From'] = _format_addr('%s<%s>' % (sender_name, from_addr))
  msg['To'] = _format_addr('<%s>' % to_addr)
  msg['Subject'] = Header('%s'%(subject), 'utf-8').encode()

  # 读取附件
  filename = 'D:/我的文件/Codes/PyCode/source/image/0.jpg'
  with open(filename, 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'jpg', filename='0.jpg')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='0.jpg')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)

  # 普通登陆端口是25,带ssl验证时候端口是465
  # smtplib.SMTP_SSL(smtp_server, 465)
  server = smtplib.SMTP(smtp_server, 25)
  server.set_debuglevel(1)
  server.login(from_addr, password)
  server.sendmail(from_addr, [to_addr], msg.as_string())
  server.quit()
Python 相关文章推荐
python判断端口是否打开的实现代码
Feb 10 Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
详解Python中for循环的使用方法
May 14 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
Django密码系统实现过程详解
Jul 19 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
python字符串替换re.sub()实例解析
Feb 09 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 #Python
python 调整图片亮度的示例
Dec 03 #Python
Python 实现PS滤镜的旋涡特效
Dec 03 #Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 #Python
python字符串拼接+和join的区别详解
Dec 03 #Python
python二维图制作的实例代码
Dec 03 #Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 #Python
You might like
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
[03:08]Ti4观战指南上
2014/07/07 DOTA
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python使用wxPython实现计算器
2018/01/30 Python
python构建深度神经网络(续)
2018/03/10 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
Python 的AES加密与解密实现
2019/07/09 Python
python函数的万能参数传参详解
2019/07/26 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
python numpy中cumsum的用法详解
2019/10/17 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
大学新闻系应届生求职信
2014/06/02 职场文书
义和团口号
2014/06/17 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
代领报检证委托书范本
2014/10/11 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python