python使用SMTP发送电子邮件

                                         python使用SMTP发送电子邮件

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

一、发送纯文本邮件

注:以qq邮箱发送邮件为例,使用QQ邮箱发送邮件时,须提前开通SMTP服务,密码输入QQ邮箱的授权码。

使用到email模块中MIMEText构造文本邮件对象,在参数中传入。第一个参数是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。

使用smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。模块中的sendmail实例方法,用于执行邮件发送的工作。它需要三个参数 -

sender - 具有发件人地址的字符串。

receiver - 字符串列表,每个收件人一个。

message - 作为格式如在各种RFC中指定的字符串。

示例代码:

from email.mime.text import MIMEText

from email.header import Header

from smtplib import SMTP_SSL

# 发送纯文本格式邮件

def send_email_text():

    # 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱

    smtp_server = 'smtp.qq.com'

    sender_qq = '296****177@qq.com'

    password = 'wsvh********dcjg'

    sender_email = '296****177@qq.com'

    receiver = '130****7364@163.com'

    # receiver = ['1@123.com','2@123.com','3@123.com']  # 给多人发送邮件,收件人传入列表中,以逗号隔开

    # 邮件内容:正文+标题

    mail_content = '您好,这是一封使用python登录QQ邮箱发送文本邮件的测试'

    mail_title = '文本格式邮件测试'

    # 发送邮件:连接smtp服务+登录账号+组装邮件

    smtp = SMTP_SSL(smtp_server)  # 连接服务器

    smtp.ehlo(smtp_server) 

    smtp.login(sender_qq, password)  # 登录账号

    msg = MIMEText(mail_content, 'plain', 'utf-8')  # 指定邮件正文为纯文本格式,以utf-8编码

msg['Subject'] = Header(mail_title, 'utf-8')  # 邮件主题中包含中文,需要通过Header对象进行编码

    msg['From'] = sender_email

    msg['To'] = receiver

    smtp.sendmail(sender_email, receiver, msg.as_string())

    smtp.close()


二、发送html格式邮件

发送html格式邮件,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了。

示例代码:

from email.mime.text import MIMEText

from email.header import Header

from smtplib import SMTP_SSL

# 使用Python发送HTML格式的邮件

    def send_email_html(self):

        # 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱

        smtp_server = 'smtp.qq.com'

        sender_qq = '296****177@qq.com'

        password = 'wsvh********dcjg'

        sender_email = '296****177@qq.com'

        receiver = '130****7364@163.com'

        # receiver = ['1@123.com','2@123.com','3@123.com']  # 给多人发送邮件

        # 邮件内容:正文+标题

        # 传入Html格式的邮件内容

mail_content = '<html><body><h2>您好</h2>,<p>这是一封使用python登录QQ邮箱发送文本邮件的测试</p></body></html>'

        mail_title = '发送网页格式邮件测试'

        # 登录smtp服务器并发送邮件

        smtp = SMTP_SSL(smtp_server)

        smtp.ehlo(smtp_server)  # 由客户端发送,指示 ESMTP 会话开始

        smtp.login(sender_qq, password)

        msg = MIMEText(mail_content, 'html', 'utf-8')# 构建邮件对象,指定为html格式,以utf-8编码

        msg['Subject'] = Header(mail_title, 'utf-8')  # 邮件主题中包含中文,需要通过Header对对象进行编码

        msg['From'] = sender_email

        msg['To'] = receiver

        smtp.sendmail(sender_email, receiver, msg.as_string())

        smtp.close()


三、发送混合格式(带附件)的邮件

发送带附件格式的邮件,使用到email模块下multipart中的MIMEMultipart方法,构建混合格式邮件对象,构造附件变量对象,再加载附件。

  # 使用Python发送带附件的邮件

    def send_email_mixture(self, report_file):

        # 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱

        smtp_server = 'smtp.qq.com'

        sender_qq = '296****177@qq.com'

        password = 'wsv********lndcjg'

        sender_email = '296****177@qq.com'

        receiver = '130****7364@163.com'

        # receiver = ['1@123.com','2@123.com','3@123.com']  # 给多人发送邮件

        # 邮件内容:正文+标题

        # 传入Html格式的邮件内容

        mail_content = '<html><body><h2>您好</h2>,<p>这是一封使用python登录QQ邮箱发送网页格式带附件邮件的测试</p></body></html>'

        mail_title = '发送网页格式带附件的邮件测试'

        # 登录smtp服务器并发送邮件

        smtp = SMTP_SSL(smtp_server)

        smtp.ehlo(smtp_server)  # 由客户端发送,指示 ESMTP 会话开始

        smtp.login(sender_qq, password)

       msg = MIMEMultipart()  # 构建混合格式邮件对象

        msg.attach(MIMEText(mail_content, 'html', 'utf-8'))  # 邮件正文

        msg['Subject'] = Header(mail_title, 'utf-8')  # 邮件主题中包含中文,需要通过Header对对象进行编码

        msg['From'] = sender_email

        msg['To'] = receiver

        # 加载附件

       att = MIMEText(open(report_file, 'rb').read(), 'base64', 'utf-8')  # 打开文件并以二进制方式读取,以base64位加密,utf-8编码保存作为附件

        att['Content-Type'] = 'application/octet-stream'  # 声明附件内容类型

        att['Content-Disposition'] = 'attachment; filename="report.html"'  # 声明附件描述及附件名称

        msg.attach(att)

        smtp.sendmail(sender_email, receiver, msg.as_string())

        smtp.close()


四、发送HTML文本中带图片的邮件

将图片嵌于邮件中,需要使用到email中的image模块的MIMEImage方法,先构建混合邮件对象并指定指定subtype是alternative,同时兼容HTML和Plain格式。使用MIMEImage方法实例化图片对象,并加载到邮件中。邮件正文HTML内容中添加图片,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。

示例代码:

from email.mime.multipart import MIMEMultipart

from email.mime.image import MIMEImage

from smtplib import SMTP_SSL

from config.cif import *

# 发送HTML文本中带图片的邮件

    def send_email_html_img(self, data_file):

        # 邮件服务信息:邮件服务+发件人QQ邮箱信息+发件人邮箱+收件人邮箱

        smtp_server = 'smtp.qq.com'

        sender_qq = '296****177@qq.com'

        password = 'wsv********lndcjg'

        sender_email = '296****177@qq.com'

        receiver = '130****7364@163.com'

        # receiver = ['1@123.com','2@123.com','3@123.com']  # 给多人发送邮件

        # 邮件内容:正文+标题

        # 传入Html格式的邮件内容

        mail_content = '''

                    <html><body>

                    <h2>您好</h2>,

                    <p>这是一封使用python登录QQ邮箱发送网页格式带图片邮件的测试</p>,

                    <p>图片演示:</p>,

<p><img src="cid:01"></p>

                    </body></html>

                    '''

        mail_title = '发送网页格式带图片邮件测试'

        # 登录smtp服务器并发送邮件

        smtp = SMTP_SSL(smtp_server)

        smtp.ehlo(smtp_server)  # 由客户端发送,指示 ESMTP 会话开始

        smtp.login(sender_qq, password)

        msg = MIMEMultipart('alternative')  # 同时支持HTML和Plain格式

        msg.attach(MIMEText(mail_content, 'html', 'utf-8'))  # 构建邮件对象,指定为html格式,以utf-8编码

        msg['Subject'] = Header(mail_title, 'utf-8')  # 邮件主题中包含中文,需要通过Header对对象进行编码

        msg['From'] = sender_email

        msg['To'] = receiver

        # 指定图片

      img = MIMEImage(open(data_file, 'rb').read())

        # 定义图片ID

       img.add_header('Content-ID', '0')

       msg.attach(img)

        smtp.sendmail(sender_email, receiver, msg.as_string())

        smtp.close()


参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000

https://www.yiibai.com/python/python_sending_email.html

https://www.jianshu.com/p/abb2d6e91c1f

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

推荐阅读更多精彩内容

  • Linux多线程同步机制 - 信号量信号量函数定义如下:include int semctl(int sem_i...
    molscar阅读 719评论 0 0
  • 文本邮件的发送 1.邮件发送流程 ​ 邮件的发送是主动行为:主要通过 MUA/邮件客户端软件,将邮件内容发送给对应...
    YiFoErLiu阅读 239评论 0 1
  • 前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录、结果等等等相关信息通过自动的手段发送给相关人员...
    苦叶子阅读 634评论 0 5
  • 类 !/usr/bin/python -- coding: UTF-8 -- class Employee:'所有...
    SkTj阅读 946评论 0 0
  • “青春在风中飘着”,记得,最初看到这句话时,是在五月天的一首歌里,霎时间觉得它带着一份熟悉的意境,一种涌上心头的美...
    沧海桑田雨落千年阅读 383评论 0 0