使用Python发送邮件

背景

公司内网有个论坛,各种公司的前沿消息都会有人在讨论。一忙起来,经常忘记逛论坛,所以写了个爬虫,爬取论坛前10页帖子,将回复量较多的帖子通过邮件发送给自己,这样,在没时间逛论坛的时候,也能关注到一些相关消息。

基于以上背景,涉及到了python发送邮件,写下这篇文章作为对相关知识的复习与巩固。


相关模块介绍

  • smtplib模块

  • SMTP类
    smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
    如上可看出,构造函数的参数都是可选参数。

    • 当没有参数的时候,会创建出一个SMTP连接实例
    • 当传入host和port参数时,在初始化SMTP实例时,会自动调用connect()函数
  • SMTP对象拥有的方法

    1. SMTP.connect([host[, port]])
      连接到给定端口的主机。
    • 没参数时,则通过标准的SMTP端口25连接到本地主机
    • 当host参数末尾加上:25(如"smtp.163.com:25"),则不需要指定port端口号
    • 函数返回值为一个包含两个元素的元组。一个返回状态码,一个服务器发送的连接反馈消息
    • 当创建实例时传入了hostname,该函数会被自动调用
    1. SMTP.login(user, password)
      登录到SMTP服务器。

    2. SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
      发送邮件。

    • from_addr 发件人地址
    • to_addrs 收件人地址列表,如果该参数为一个字符串,则把它当作数组的第一个元素
    • msg一个字符串格式的message报文
    1. SMTP.quit()
      结束SMTP会话并关闭连接。
  • 常见使用方式

smtpObj = smtplib.SMTP()
smtpObj.connect('hostname:port')
smtpObj.login(user,password)
smtpObj.sendmail(from,to,msg)
smtpObj.quit()

  • email模块

email模块是一个用来管理email消息的库,包含MIME和其他基于RFC2822的消息文档。它并不负责处理发送邮件。

  • email.mime子模块
    创建email和MIME对象

    • email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
      MIMEBase的一个子类,多个MIME对象的集合,
      • _subtype默认值为mixed。
      • boundary是MIMEMultipart的边界,默认边界是可数的。
      • _subparts可以转化成list的MIME对象。
      • 可通过message.attach将新的MIME对象添加到附件中。
  • email.mime.audio.MIMEAudio(_audiodata[, _subtype[,_encoder[, **_params]]])
    该类用来创建音频类型的MIME消息对象

    • _audiodata参数是一个包含音频数据流的字符串
    • 如果audiodata数据由标准库sndhdr
      译码,那么subtype则会被自动包含在Content-type头中,否则,必须显示的指定subtype参数
  • email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
    该类用来创建图像类型的MIME消息对象

    • 参数与上一个类相似,不做详细解释
  • email.mime.text.MIMEText(_text[, _subtype[, _charset]])
    该类用来创建文本类型的MIME消息对象

  • _subtype默认的plain格式

  • _charset是文本的字符集,默认为ascii

  • 如果文本为unicode编码格式,将使用_charset的output_charset(详见 email.charset
    )进行编码,否则,按照原来的格式输出

  • email.header子模块

    • email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
      创建一个遵从MIME的包含不同字符集编码字符串的header
      • 可选的s是header的初始化值,默认为空,如果没有赋值,可以通过append函数进行插入。
  • 例子

    1. 创建一个普通文本消息
        from email.mime.text import MIMEText
        from email.header import Header

        mes = MIMEText(body, 'plain', 'utf-8') # 正文
        mes['From'] = Header('xxx@xxx.com','utf-8') # 发件人
        mes['To'] = Header('xxx@xxx.com','utf-8') # 收件人
        mes['Cc'] = Header('xxx@xxx.com','utf-8') # 抄送人
        mes['Subject'] = Header(subject, 'utf-8')  # 主题
  1. 创建一个html文本消息
        from email.mime.text import MIMEText
        from email.header import Header

        mes = MIMEText(body, 'html', 'utf-8') # body按照html格式写
        mes['From'] = Header('xxx@xxx.com','utf-8') # 发件人
        mes['To'] = Header('xxx@xxx.com','utf-8') # 收件人
        mes['Cc'] = Header('xxx@xxx.com','utf-8') # 抄送人
        mes['Subject'] = Header(subject, 'utf-8')  # 主题
        msg['date']='xxxx-xx-xx' # 
3. 创建带附件邮件
        from email.mime.text import MIMEText
        from email.mime.multipart import MIMEMultipart
        
        #创建一个带附件的实例
        msg = MIMEMultipart()

        #构造附件1
        att1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'gb2312')
        att1["Content-Type"] = 'application/octet-stream'
        att1["Content-Disposition"] = 'attachment; filename="123.doc"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
        msg.attach(att1)

        #构造附件2
        att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
        att2["Content-Type"] = 'application/octet-stream'
        att2["Content-Disposition"] = 'attachment; filename="123.txt"'
        msg.attach(att2)

        #加邮件头
        msg['to'] = 'YYY@YYY.com'
        msg['from'] = 'XXX@XXX.com'
        msg['subject'] = 'hello world'
  1. 如果想发送一个带图片附件的邮件,同时图片还显示在正文中
  2. 按照3.的方式(图片用MIMEImage)插入图片附件hello.jpg
  3. 按照2.的方式,发送一个html文件,在html中插入img标签,src为图片的路径
![](cid:hello.jpg)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 一、相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1...
    LizPL阅读 1,344评论 0 3
  • 使用 python email smtplib 模块发送邮件 本例使用 QQ邮箱测试,需要打开 QQ邮箱的 smt...
    君惜丶阅读 255评论 0 0
  • 前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录、结果等等等相关信息通过自动的手段发送给相关人员...
    苦叶子阅读 634评论 0 5
  • 1天我奶奶带我去乡村,那里的蚊子可多了,我们去了我们的新家就我和我的两个妹妹,还有我的姐姐和我的弟弟。 ...
    侯浩子阅读 96评论 0 0
  • 用户体系: *新增用户属性字段。公司01初始股东02核心股东03众筹股东04合伙人05 *新增所属合伙人字段。合伙...
    b89678e71e97阅读 579评论 0 0