zoukankan      html  css  js  c++  java
  • Python发邮件

    MTP发邮件

    首先要了解几个协议:

    • SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。它定义了邮件客户端和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
    • POP3(Post Office Protocol),邮局协议,它定义了邮件客户端软件和POP3邮件服务器的通信规则。
    • IMAP(Internet Message Access Protocol),消息访问协议,它是POP3协议的一种扩展。
    • Exchange Server 是微软公司的一套电子邮件服务组件,是个消息与协作系统。 简单而言,Exchange server可以被用来构架应用于企业、学校的邮件系统。
    • CardDAV是一种通讯录同步的开放协议。使用 CardDAV 同步的通讯录可以编辑、修改或者删除,并且你在手机上的这些操作也同样会和服务器同步,并同时同步到你的其他设备上。

    下图演示了用户A从QQ邮箱发送邮件到用户B的163邮箱的过程:

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

    一般的,我们可以在本地搭建支持SMTP的服务,如sendmail,但为了省事,我们可以使用其他的邮件服务商的SMTP服务访问,如QQ、网易等。

    这里以QQ邮箱为例,首先要拿到授权码,这里登录你的QQ邮箱,在设置中,选择账号选项,下拉到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务项,获取授权码。

    然后手机发送短信验证。

    然后点击我已发送,就出现了授权码页面。

    有了授权码,开干!

    发送普通文本邮件

    代码示例:

    import unittest
    from HTMLTestRunner import HTMLTestRunner
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    from email.mime.multipart import MIMEMultipart
    
       def send_mail(self):
            
            # 第三方 SMTP 服务
            mail_host = "smtp.qq.com"  # 设置服务器
            mail_user = "154439155@qq.com"  # 用户名
            mail_pass = "whiippbwtecgbiif"  # 获取授权码
            sender = '154439155@qq.com'  # 发件人账号
            receivers = ['154439155@qq.com']  # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱
    
            send_content = 'Python 邮件发送测试...'
            message = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容,第二个设置文本格式,第三个设置编码
            message['From'] = Header("我是发件人", 'utf-8')  # 发件人
            message['To'] = Header("我是收件人", 'utf-8')  # 收件人
    
            subject = '邮件大标题'
            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: 无法发送邮件")

    发送HTML格式邮件

    授权码都不变,只需将MIMEText的第二个参数的文本类型改一下即可

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方 SMTP 服务
            mail_host = "smtp.qq.com"  # 设置服务器
            mail_user = "154439155@qq.com"  # 用户名
            mail_pass = "**"  # 获取授权码
            sender = '154439155@qq.com'  # 发件人账号
            receivers = ['154439155@qq.com']  # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱
    
    send_content = """
    <h1>天不生我李淳罡</h1>
    <h1>剑道万古如长夜</h1>
    <p>小二上酒</p>
    <img src="https://ss0.baidu.com/73t1bjeh1BF3odCf/it/u=858168512,2130327819&fm=85&s=2E4020DF1CD035FBDC9D940A0300F0F3">
    <div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
    """
    message = MIMEText(send_content, 'html', 'utf-8')  # 第一个参数为邮件内容
    message['From'] = Header("我是发件人", 'utf-8')  # 发件人
    message['To'] = Header("我是收件人", 'utf-8')  # 收件人
    
    subject = '雪中悍刀行'
    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: 无法发送邮件")

    发送HTML中带本地图片的邮件

    上一个示例中的图片,是一个远程连接,那么我们要发送本地的图片,就要采用下面的方式了:

    import smtplib
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    
    # 第三方 SMTP 服务
       mail_host = "smtp.qq.com"  # 设置服务器
            mail_user = "154439155@qq.com"  # 用户名
            mail_pass = "whiippbwtecgbiif"  # 获取授权码
            sender = '154439155@qq.com'  # 发件人账号
            receivers = ['154439155@qq.com']  # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱
    
    
    message = MIMEMultipart('related')
    message['From'] = Header("我是发件人", 'utf-8')  # 发件人
    message['To'] = Header("我是收件人", 'utf-8')  # 收件人
    
    subject = '雪中悍刀行--本地图片版'
    message['Subject'] = Header(subject, 'utf-8')
    
    msg = MIMEMultipart('alternative')
    message.attach(msg)
    
    
    send_content = """
    <h1>天不生我李淳罡</h1>
    <h1>剑道万古如长夜</h1>
    <p>小二上酒</p>
    <img src="cid:image">
    <div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
    """
    msg.attach(MIMEText(send_content, 'html', 'utf-8'))  # 第一个参数为邮件内容
    
    # 读取当前目录下的图片
    f = open('img.jpg', 'rb')
    img_msg = MIMEImage(f.read())
    f.close()
    
    # 定义图片在HTML文本中的位置
    img_msg.add_header('Content-ID', '<image>')   # 根据id定位
    message.attach(img_msg)
    
    
    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: 无法发送邮件")

    发送带各式类型附件的邮件

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

    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    
    # 第三方 SMTP 服务
     mail_host = "smtp.qq.com"  # 设置服务器
            mail_user = "154439155@qq.com"  # 用户名
            mail_pass = "whiippbwtecgbiif"  # 获取授权码
            sender = '154439155@qq.com'  # 发件人账号
            receivers = ['154439155@qq.com']  # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱
    # 创建一个带附件的实例
    message = MIMEMultipart()
    message['From'] = Header("我是发件人", 'utf-8')  # 发件人
    message['To'] = Header("我是收件人", 'utf-8')   # 收件人
    
    subject = 'Python发送带附件的邮件示例'
    message['Subject'] = Header(subject, 'utf-8')
    
    # 邮件正文内容
    send_content = 'hi man,你收到附件了吗?'
    content_obj = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容
    message.attach(content_obj)
    
    # 构造附件1,发送当前目录下的 t1.txt 文件
    att1 = MIMEText(open('t1.txt', 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="t1.txt"'
    message.attach(att1)
    
    # 构造附件2,发送当前目录下的 t2.py 文件
    att2 = MIMEText(open('t2.py', 'rb').read(), 'base64', 'utf-8')
    att2["Content-Type"] = 'application/octet-stream'
    att2["Content-Disposition"] = 'attachment; filename="t2.py"'
    message.attach(att2)
    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: 无法发送邮件")

    如果要发送其他类型的,如果PDF、doc、xls、MP3格式的,我们都可以通过MIMEApplication来完成,MIMEApplication默认子类型是application/octet-stream,而application/octet-stream表明这是个二进制文件,但愿接收方知道怎么处理!!!,然后客户端收到这个声明后会根据文件扩展名来猜测。

    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.application import MIMEApplication
    from email.header import Header
    
    # 第三方 SMTP 服务
     mail_host = "smtp.qq.com"  # 设置服务器
            mail_user = "154439155@qq.com"  # 用户名
            mail_pass = "whiippbwtecgbiif"  # 获取授权码
            sender = '154439155@qq.com'  # 发件人账号
            receivers = ['154439155@qq.com']  # 接收邮件(可以多个),可设置为你的QQ邮箱或者其他邮箱
    # 创建一个带附件的实例
    message = MIMEMultipart()
    message['From'] = Header("我是发件人", 'utf-8')  # 发件人
    message['To'] = Header("我是收件人", 'utf-8')   # 收件人
    
    subject = 'Python发送带附件的邮件示例'
    message['Subject'] = Header(subject, 'utf-8')
    
    # 邮件正文内容
    send_content = 'hi man,你收到附件了吗?'
    content_obj = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容
    message.attach(content_obj)
    
    # 构造附件1,发送当前目录下的 t1.txt 文件
    part1 = MIMEApplication(open('t1.txt', 'rb').read())
    part1.add_header('Content-Disposition', 'attachment', filename='t1.txt')
    message.attach(part1)
    
    
    # 构造附件2,发送当前目录下的 bg.mp3 文件
    part2 = MIMEApplication(open('bg.mp3', 'rb').read())
    part2.add_header('Content-Disposition', 'attachment', filename='bg.mp3')
    message.attach(part2)
    
    
    # 构造附件3,发送当前目录下的 t3.xls 文件
    part3 = MIMEApplication(open('t3.xls', 'rb').read())
    part3.add_header('Content-Disposition', 'attachment', filename='t3.xls')
    message.attach(part3)
    
    # 构造附件4,发送当前目录下的 t4.doc 文件
    part4 = MIMEApplication(open('t4.doc', 'rb').read())
    part4.add_header('Content-Disposition', 'attachment', filename='t4.doc')
    message.attach(part4)
    
    
    # 构造附件5,发送当前目录下的 t5.pdf 文件
    part5 = MIMEApplication(open('t5.pdf', 'rb').read())
    part5.add_header('Content-Disposition', 'attachment', filename='t5.pdf')
    message.attach(part5)
    
    # 构造附件6,发送当前目录下的 img.jpg 文件
    part6 = MIMEApplication(open('img.jpg', 'rb').read())
    part6.add_header('Content-Disposition', 'attachment', filename='img.jpg')
    message.attach(part6)
    
    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模块—socket
    mac os系统的快捷键
    教你如何将UIImageView视图中的图片变成圆角
    关于ASP.NET MVC
    iOS 日期格式的转换
    将App通过XCode上传到AppStore 出现这个错误“An error occurred uploading to the iTunes Store”的解决方法
    关于MAC OS下面两个软件的功能改进——Dictionary和Fit 输入法
    分享一下上个星期的香港行程
    【博客园IT新闻】博客园IT新闻 iPhone 客户端发布
    解决Entity Framework Code First 的问题——Model compatibility cannot be checked because the database does not contain model metadata
  • 原文地址:https://www.cnblogs.com/TodayWind/p/14942641.html
Copyright © 2011-2022 走看看