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多线程编程中的join函数使用心得
Sep 02 Python
python里大整数相乘相关技巧指南
Sep 12 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
python异常和文件处理机制详解
Jul 19 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
pandas 快速处理 date_time 日期格式方法
Nov 12 Python
python3用urllib抓取贴吧邮箱和QQ实例
Mar 10 Python
python神经网络Xception模型
May 06 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版本的cron定时任务执行器使用实例
2014/08/19 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
Python里面如何拷贝一个对象
2014/02/17 面试题
狼和鹿教学反思
2014/02/05 职场文书
网络书店创业计划书
2014/02/07 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
个人求职自荐信范文
2014/06/20 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
鲁冰花观后感
2015/06/10 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS