公司每天要发送日报,最近没事搞了一下如何自动发邮件,用的是腾讯企业邮箱,跟大家分享一下我的研究过程吧。

以前弄的发邮件的是用qq邮箱发的,当时在网上查资料最后达到了能发图片,网页,自定义收件人展示,主题等比较简

单的,但没想到说发送个word附件,后来才发现原来email里的MIMEText就可以,先上代码吧

# coding:utf8
"""
日报
"""
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart class MyEmail:
def __init__(self):
self.user = None
self.passwd = None
self.to_list = []
self.cc_list = []
self.tag = None
self.doc = None def send(self):
"""
发送邮件
"""
try:
server = smtplib.SMTP_SSL("smtp.exmail.qq.com", port=465)
server.login(self.user, self.passwd)
server.sendmail("<%s>" % self.user, self.to_list, self.get_attach())
server.close()
print("send email successful")
except Exception as e:
print("send email failed %s" % e) def get_attach(self):
"""
构造邮件内容
"""
attach = MIMEMultipart()
if self.tag is not None:
# 主题,最上面的一行
attach["Subject"] = self.tag
if self.user is not None:
# 显示在发件人
attach["From"] = "发件人姓名,可以自定义<%s>" % self.user
if self.to_list:
# 收件人列表
attach["To"] = ";".join(self.to_list)
if self.cc_list:
# 抄送列表
attach["Cc"] = ";".join(self.cc_list)
if self.doc:
# 估计任何文件都可以用base64,比如rar等
# 文件名汉字用gbk编码代替
name = os.path.basename(self.doc).encode("gbk")
f = open(self.doc, "rb")
doc = MIMEText(f.read(), "base64", "gb2312")
doc["Content-Type"] = 'application/octet-stream'
doc["Content-Disposition"] = 'attachment; filename="' + name + '"'
attach.attach(doc)
f.close()
return attach.as_string() if __name__ == "__main__":
my = MyEmail() my.user = "name@name.com"
my.passwd = "password"
my.to_list = ["", ]
my.cc_list = ["", ]
my.tag = "日报"
my.doc = u"C:\Documents and Settings\Administrator\Desktop\日报.doc"
my.send()

首先使用腾讯企业邮箱需要使用ssl,不过在smtplib中有这个功能,一般使用SMTP,需要ssl的时候使用SMTP_SSL,在明白这个之前
我费了好大的力气去找怎么用ssl,后来才发现原来除了换个模块外别的根本不用变化,
在登录的时候我用的是@前面的帐号名,一直上不去,一直不知道为什么,第二天心里突然闪过一个想法:把完整邮箱地址当做帐号,一
试,哈哈,登录成功了
然后就是发送附件了,首先是需要发送一个word文档,找了半天才发现用
(from email.mime.text import MIMEText)
MIMEText就可以,本来我以为他只能处理文本的txt,原来他不仅可以处理文本,doc,rar都可以用它添加到附件里,只要在初始化的
时候使用base64就可以,后面的参数是doc使用的字符集吧,这个没研究过,不确定
doc["Content-Type"] = 'application/octet-stream'
doc["Content-Disposition"] = 'attachment; filename=123.doc' 这个指定类型和描述,在描述里可以自定义文件名貌似这个文件名是gbk编码的,
我的附件名字是中文,先使用u""把文件名声明为unicode,再转为gbk,如果使用unicode的话好像不行,文件名会变成系统定义的文件
名,不过文件仍然可以用,下载下来改个名字没什么区别,使用utf8会出现乱码
好吧,发现一个漏洞,抄送的邮件没发出去

在
server.sendmail("<%s>"%self.user, self.to_list, self.get_attach())
中第二个参数表示的是想要发送到的地址,需要把抄送的地址也放在这个列表里,如下
server.sendmail("<%s>"%self.user, self.to_list + self.cc_list, self.get_attach())
至于在构造邮件时设置的不用变,那个只起到显示的作用,和发给谁没关系,只是在邮件内容中说明了一下发给谁,抄送给谁而已,实际
上谁真正收到需要在sendmail里添加

最新文章

  1. 12款简化 Web 开发的 JavaScript 开发框架
  2. echo.js 延迟加载图片控件
  3. bzoj2683
  4. maven 使用tomcat插件 自动化部署war
  5. 使用oh-my-zsh后导致的卡顿问题
  6. 一个ORM的实现(附源代码)
  7. 关于Windows下安装mongodb和加入Windows系统启动项
  8. PyAMF and django ForeignKey
  9. rightTeam SCRUM第一个冲刺周期
  10. [转]]将 ASP.NET MVC3 Razor 项目部署到虚拟主机中
  11. bzoj 3687 bitset的运用
  12. iostat命令详解 IO性能分析
  13. Moses 里的参数(未完成)
  14. HttpClient 4.x 执行网站登录并抓取网页的代码
  15. Cacti监控Linux主机
  16. django: startproject
  17. poj2676解题报告
  18. 五、pig学习
  19. arcgis for js 之 获取两点之间的距离
  20. http随笔

热门文章

  1. redhat 防火墙禁止允许的IP链接指定的端口
  2. Apache Commons Codec 与消息摘要算法(hash算法)
  3. week1-绪论
  4. Hive任务优化--控制hive任务中的map数和reduce数
  5. Solr-DIH建立索引并执行简单初步的查询
  6. 手工编写servlet
  7. jdbc练习demo
  8. poj-3253-Fence Repair(哈夫曼)
  9. CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点
  10. Firefox 被Snap.do 劫持