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中urllib2模块的8个使用细节分享
Jan 01 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
python中__slots__用法实例
Jun 04 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
python中redis的安装和使用
Dec 04 Python
Python rstrip()方法实例详解
Nov 11 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python和php哪个容易学
Jun 19 Python
python Tornado框架的使用示例
Oct 19 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
python_tkinter事件类型详情
Mar 20 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
php中转义mysql语句的实现代码
2011/06/24 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
JScript的条件编译
2007/05/29 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python绘制圆柱体的方法
2018/07/02 Python
python如何查看微信消息撤回
2018/11/27 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python中必要的名词解释
2019/11/20 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
信息部岗位职责
2013/11/12 职场文书
投标保密承诺书
2014/05/19 职场文书
社区护士演讲稿
2014/08/27 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis