python2.7实现邮件发送功能


Posted in Python onDecember 12, 2018

要想实现一个能够发送带有文本、图片、附件的python程序,首先要熟悉两大模块:

email以及smtplib

然后对于MIME(邮件扩展)要有一定认知,因为有了扩展才能发送附件以及图片这些媒体或者非文本信息

最后一个比较细节的方法就是MIMEMultipart,要理解其用法以及对应参数所实现的功能区别

发送邮件三部曲:

创建协议对象
连接邮件服务器
登陆并发送邮件

from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import mimetypes

from email.mime.multipart import MIMEMultipart
import os
import smtplib

from email import Encoders as email_encoders


class Message(object):
 def __init__(self, from_addr, to_addr, subject="", html="", text=None, cc_addr=[], attachment=[]):

  self.from_addr = from_addr
  self.subject = subject

  if to_addr:
   if isinstance(to_addr, list):
    self.to_addr = to_addr
   else:
    self.to_addr = [d for d in to_addr.split(',')]
  else:
   self.to_addr = []

  if cc_addr:
   if isinstance(cc_addr, list):
    self.cc_addr = cc_addr
   else:
    self.cc_addr = [d for d in cc_addr.split(',')]
  else:
   self.cc_addr = []

  if html is not None:
   self.body = html
   self.body_type = "html"
  else:
   self.body = text
   self.body_type = "plain"

  self.parts = []
  if isinstance(attachment, list):
   for file in attachment:
    self.add_attachment(file)

 def add_attachment(self, file_path, mimetype=None):
  """
   If *mimetype* is not specified an attempt to guess it is made. If nothing
   is guessed then `application/octet-stream` is used.
  """
  if not mimetype:
   mimetype, _ = mimetypes.guess_type(file_path)

  if mimetype is None:
   mimetype = 'application/octet-stream'

  type_maj, type_min = mimetype.split('/')
  with open(file_path, 'rb') as fh:
   part_data = fh.read()

   part = MIMEBase(type_maj, type_min)
   part.set_payload(part_data)
   email_encoders.encode_base64(part)

   part_filename = os.path.basename(file_path)
   part.add_header('Content-Disposition', 'attachment; filename="%s"'
       % part_filename)
   part.add_header('Content-ID', part_filename)

   self.parts.append(part)

 def __to_mime_message(self):
  """Returns the message as
  :py:class:`email.mime.multipart.MIMEMultipart`."""

  ## To get the message work in iOS, you need use multipart/related, not the multipart/alternative
  msg = MIMEMultipart('related')
  msg['Subject'] = self.subject
  msg['From'] = self.from_addr
  msg['To'] = ','.join(self.to_addr)

  if len(self.cc_addr) > 0:
   msg['CC'] = ','.join(self.cc_addr)

  body = MIMEText(self.body, self.body_type)
  msg.attach(body)

  # Add Attachment
  for part in self.parts:
   msg.attach(part)

  return msg

 def send(self, smtp_server='localhost'):

  smtp = smtplib.SMTP()
  smtp.connect(smtp_server)
  smtp.sendmail(from_addr=self.from_addr, to_addrs=self.to_addr + self.cc_addr, msg=self.__to_mime_message().as_string())
  smtp.close()

对于实际发送程序,要注意个参数的类型,比如from_addr是字符串,to_addr和cc_addr以及attachment都是列表

from mail_base import Message
import datetime
from_addr = 'xxx'
mail_to = 'xxx'


def send_go():
 time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
 attach_files = ['testcsv.xlsm','test1.jpg','test2.jpg','test3.jpg']
 mail_msg = """
  <p>Hi Lockey:</p>
  <p><img src="cid:test1.jpg"></p>####要特别注意这里,正文插入图片的特殊格式!!!
  <hr/>
  <p style="text-indent:16px">Here is the latest paper link from The Economist, you can click <a href="https://lockeycheng.github.io/iooi/index.html" rel="external nofollow" >Go</a> for a full view!</p>
  <hr/>
  <p>Best Regards</p>
  <p>
   Any question please mail to <a href='mailto:iooiooi23@163.com'>Lockey23</a>.
  </p>
  <p>Sent at {} PST</p>
  """.format(time_now)
 subject = '[Halo] - ' + 'A new paper published!'
 msg = Message(from_addr=from_addr,
     to_addr=[mail_to],
     cc_addr=[mail_to],
     subject=subject,
     attachment=attach_files,
     html=mail_msg
     )
 msg.send()

if __name__ == '__main__':
 send_go()

对于测试程序我们命名为sendGo.py,运行测试程序

~$ python sendGo.py

python2.7实现邮件发送功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python里对list中的整数求平均并排序
Sep 12 Python
轻松实现python搭建微信公众平台
Feb 16 Python
python使用opencv进行人脸识别
Apr 07 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
浅析matlab中imadjust函数
Feb 27 Python
python3 简单实现组合设计模式
Jul 02 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
python flask框架快速入门
May 14 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
对python csv模块配置分隔符和引用符详解
Dec 12 #Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 #Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 #Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 #Python
在python中pandas读文件,有中文字符的方法
Dec 12 #Python
python处理两种分隔符的数据集方法
Dec 12 #Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 #Python
You might like
又一个php 分页类实现代码
2009/12/03 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php将html转为图片的实现方法
2017/05/19 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python 写的一个爬虫程序源码
2016/02/28 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
html Table 表头固定的实现
2019/01/22 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
七一表彰活动方案
2014/01/18 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
土地转让协议书范本
2014/04/15 职场文书
2014年市场部工作总结
2014/11/25 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
Mysql开启外网访问
2022/05/15 MySQL