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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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