第39章 Python3 SMTP发送邮件教程

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python创建 SMTP 对象语法如下:


    import smtplib
    
    smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP server 主机。 陛下您可以指定主机的ip地址或者域名如:blog.youkuaiyun.com/phlcsdn2023,这个是非必输参数。
  • port: 如果陛下您提供了 host 参数, 陛下您需要指定 SMTP 服务使用的端口号,一般情况下SMTP端口号为25。
  • local_hostname: 如果SMTP在陛下您的本机上,陛下您只需要指定server 地址为 localhost 即可。

Python SMTP对象使用sendmail方法发送邮件,语法如下:


    SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

这里要注意一下第三个参数,msg是字符串,表示邮件。咱们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

实例

以下是一个使用Python发送邮件简单的实例:


    实例 
     
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
     
    sender = 'from@blog.youkuaiyun.com/phlcsdn2023'
    receivers = ['phlcsdn2023@qq.net']  # 接收邮件,可设置为陛下您的QQ邮箱或者其他邮箱
     
    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
    message['From'] = Header("phlcsdn2023教程", 'utf-8')     # 发送者
    message['To'] =  Header("测试", 'utf-8')          # 接收者
     
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
     
    try:
        smtpObj = smtplib.SMTP('localhost')
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")

咱们使用三个引号来设置邮件信息,标准邮件需要三个头部信息: From, To, 和 Subject ,每个信息直接使用空行分割。

咱们通过实例化 smtplib 模块的 SMTP 对象 smtpObj 来连接到 SMTP 访问,并使用 sendmail 方法来发送信息。

执行以上程序,如果陛下您本机install sendmail,就会输出:


    $ python3 test.py 
    邮件发送成功

查看咱们的收件箱(一般在垃圾箱),就可以查看到邮件信息:

如果咱们本机没有 sendmail 访问,也可以使用其他服务商的 SMTP 访问(QQ、网易、Google等)。


    实例 
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
     
    # 第三方 SMTP 服务
    mail_host="smtp.XXX.net"  #设置server 
    mail_user="XXXX"    #用户名
    mail_pass="XXXXXX"   #口令 
     
     
    sender = 'from@blog.youkuaiyun.com/phlcsdn2023'
    receivers = ['phlcsdn2023@qq.net']  # 接收邮件,可设置为陛下您的QQ邮箱或者其他邮箱
     
    message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
    message['From'] = Header("phlcsdn2023教程", 'utf-8')
    message['To'] =  Header("测试", 'utf-8')
     
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
     
     
    try:
        smtpObj = smtplib.SMTP() 
        smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
        smtpObj.login(mail_user,mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")


使用Python发送HTML格式的邮件

Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:


    实例 
    
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
     
    sender = 'from@blog.youkuaiyun.com/phlcsdn2023'
    receivers = ['phlcsdn2023@qq.net']  # 接收邮件,可设置为陛下您的QQ邮箱或者其他邮箱
     
    mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://blog.youkuaiyun.com/phlcsdn2023">这是一个链接</a></p>
    """
    message = MIMEText(mail_msg, 'html', 'utf-8')
    message['From'] = Header("phlcsdn2023教程", 'utf-8')
    message['To'] =  Header("测试", 'utf-8')
     
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
     
     
    try:
        smtpObj = smtplib.SMTP('localhost')
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")

执行以上程序,如果陛下您本机install sendmail,就会输出:


    $ python3 test.py 
    邮件发送成功

查看咱们的收件箱(一般在垃圾箱),就可以查看到邮件信息:


Python 发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。


    实例 
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
     
    sender = 'from@blog.youkuaiyun.com/phlcsdn2023'
    receivers = ['phlcsdn2023@qq.net']  # 接收邮件,可设置为陛下您的QQ邮箱或者其他邮箱
     
    #创建一个带附件的实例
    message = MIMEMultipart()
    message['From'] = Header("phlcsdn2023教程", 'utf-8')
    message['To'] =  Header("测试", 'utf-8')
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
     
    #邮件正文内容
    message.attach(MIMEText('这是phlcsdn2023教程Python 邮件发送测试……', 'plain', 'utf-8'))
     
    # 构造附件1,传送当前目录下的 test.txt 文件
    att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="test.txt"'
    message.attach(att1)
     
    # 构造附件2,传送当前目录下的 phlcsdn2023.txt 文件
    att2 = MIMEText(open('phlcsdn2023.txt', 'rb').read(), 'base64', 'utf-8')
    att2["Content-Type"] = 'application/octet-stream'
    att2["Content-Disposition"] = 'attachment; filename="phlcsdn2023.txt"'
    message.attach(att2)
     
    try:
        smtpObj = smtplib.SMTP('localhost')
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")


    $ python3 test.py 
    邮件发送成功

查看咱们的收件箱(一般在垃圾箱),就可以查看到邮件信息:


在 HTML 文本中添加图片

邮件的 HTML 文本中一般邮件服务商添加外链是无效的,正确添加图片的实例请在输出结果查看


    实例 
    
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
     
    sender = 'from@blog.youkuaiyun.com/phlcsdn2023'
    receivers = ['phlcsdn2023@qq.net']  # 接收邮件,可设置为陛下您的QQ邮箱或者其他邮箱
     
    msgRoot = MIMEMultipart('related')
    msgRoot['From'] = Header("phlcsdn2023教程", 'utf-8')
    msgRoot['To'] =  Header("测试", 'utf-8')
    subject = 'Python SMTP 邮件测试'
    msgRoot['Subject'] = Header(subject, 'utf-8')
     
    msgAlternative = MIMEMultipart('alternative')
    msgRoot.attach(msgAlternative)
     
     
    mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://blog.youkuaiyun.com/phlcsdn2023">phlcsdn2023教程链接</a></p>
    <p>图片演示:</p>
    <p><img decoding="async" src="cid:image1"></p>
    """
    msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
     
    # 指定图片为当前目录
    fp = open('test.png', 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
     
    # 定义图片 ID,在 HTML 文本中引用
    msgImage.add_header('Content-ID', '<image1>')
    msgRoot.attach(msgImage)
     
    try:
        smtpObj = smtplib.SMTP('localhost')
        smtpObj.sendmail(sender, receivers, msgRoot.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")


    $ python3 test.py 
    邮件发送成功

查看咱们的收件箱(如果在垃圾箱可能需要移动到收件箱才可正常显示),就可以查看到邮件信息:


使用第三方 SMTP 服务发送

这里使用了 QQ 邮箱(陛下您也可以使用 163,Gmail等)的 SMTP 服务

QQ 邮箱通过生成授权码来设置password

QQ 邮箱 SMTP server 地址:smtp.qq.net,ssl 端口:465。

以下实例陛下您需要修改:发件人邮箱(陛下您的QQ邮箱),password ,收件人邮箱(可发给自己)。


    QQ SMTP 
    
    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
     
    my_sender='phlcsdn2023@qq.net'    # 发件人邮箱账号
    my_pass = 'xxxxxxxxxx'              # 发件人邮箱password 
    my_user='phlcsdn2023@qq.net'      # 收件人邮箱账号,我这边发送给自己
    def mail():
        ret=True
        try:
            msg=MIMEText('填写邮件内容','plain','utf-8')
            msg['From']=formataddr(["Fromphlcsdn2023",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
            msg['To']=formataddr(["FK",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号
            msg['Subject']="phlcsdn2023教程发送邮件测试"                # 邮件的主题,也可以说是标题
     
            server=smtplib.SMTP_SSL("smtp.qq.net", 465)  # 发件人邮箱中的SMTPserver ,端口是25
            server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱password 
            server.sendmail(my_sender,[my_user,],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
            server.quit()  # 关闭连接
        except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
            ret=False
        return ret
     
    ret=mail()
    if ret:
        print("邮件发送成功")
    else:
        print("邮件发送失败")


    $ python test.py 
    邮件发送成功

发送成功后,登陆收件人邮箱即可查看

更多内容请参阅:https://docs.python.org/3/library/email-examples.html

本专栏所有文章

第1章 Python3 教程第2章 Python3 简介教程
第3章 Python3 环境搭建教程第4章 Python3 VScode教程
第5章 Python3 基础语法教程第6章 Python3 基本数据类型教程
第7章 Python3 数据类型转换教程第8章 Python3 推导式教程
第9章 Python3 解释器教程第10章 Python3 注释教程
第11章 Python3 运算符教程第12章 Python3 数字(Number)教程
第13章 Python3 字符串教程第14章 Python3 列表教程
第15章 Python3 元组教程第16章 Python3 字典教程
第17章 Python3 集合教程第18章 Python3 编程第一步教程
第19章 Python3 条件控制教程第20章 Python3 循环语句教程
第21章 Python3 迭代器与生成器教程第22章 Python3 函数教程
第23章 Python3 数据结构教程第24章 Python3 模块教程
第25章 Python3 输入和输出教程第26章 Python3 File教程
第27章 Python3 OS教程第28章 Python3 错误和异常教程
第29章 Python3 面向对象教程第30章 Python3 命名空间/作用域教程
第31章 Python3 标准库概览教程第32章 Python3 实例教程
第33章 Python 测验教程第34章 Python3 正则表达式教程
第35章 Python3 CGI编程教程第36章 Python3 MySQL(mysql-connector)教程
第37章 Python3 MySQL(PyMySQL)教程第38章 Python3 网络编程教程
第39章 Python3 SMTP发送邮件教程第40章 Python3 多线程教程
第41章 Python3 XML 解析教程第42章 Python3 JSON教程
第43章 Python3 日期和时间教程第44章 Python3 内置函数教程
第45章 Python3 MongoDB教程第46章 Python3 urllib教程
第47章 Python uWSGI 安装配置教程第48章 Python3 pip教程
第49章 Python3 operator教程第50章 Python math教程
第51章 Python requests教程第52章 Python random教程
第53章 Python3 os.replace() 方法教程

寄语

本文有 phlcsdn2023 原创,欢迎点赞、转载,博客地址:https://blog.youkuaiyun.com/phlcsdn2023

  • 其他人都要有自尊心、自信心、独立性,不然就是奴才。但自尊不是轻人,自信不是自满,独立不是弧立。
  • 既异想天开,又实事求是,这是科学工作者特有的风格,让我们在无穷的宇宙长河中去探索无穷的真理吧。
  • 敢于在沙漠中顽强跋涉的人,才有希望找到属于自己心目中的绿洲。
  • 努力是会上瘾的,特别是尝到甜头的时候,不努力也会上瘾,特别是习惯懒散了以后。把时间用在丰富自己的见识上,才是正事,
  • 赛场就是战场,勇者不可阻挡,敢赢才能称王;信心起希望,无畏豪情万丈,拼搏铸就辉煌;努力,加油,成功就在前方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你得不到的念想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值