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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
解析Python中的异常处理
Apr 28 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 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中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
php读取本地json文件的实例
2018/03/07 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
深入解析contentWindow, contentDocument
2013/07/04 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
canvas绘制多边形
2017/02/24 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
档案信息化建设方案
2014/05/16 职场文书
教研处工作方案
2014/05/26 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server