zoukankan      html  css  js  c++  java
  • python发邮件:

    通过SMTP发邮件

    首先要了解几个协议:
    • 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服务项,获取授权码。

    mpao cydz pzfj idge

    有了授权码,开干!

    发送普通文本邮件

     

    代码示例:

    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方 SMTP 服务
    mail_host = "smtp.qq.com"  # 设置服务器
    mail_user = "1206180814@qq.com"  # 用户名
    mail_pass = "dfpcglacrjbybafa"  # 获取授权码
    sender = '1206180814@qq.com'  # 发件人账号
    receivers = ['1206180814@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 = "1206180814@qq.com"  # 用户名
    mail_pass = "dfpcglacrjbybafa"  # 口令
    
    sender = '1206180814@qq.com'
    receivers = ['1206180814@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 = "1206180814@qq.com"  # 用户名
    mail_pass = "dfpcglacrjbybafa"  # 口令
    
    sender = '1206180814@qq.com'
    receivers = ['1206180814@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 = "1206180814@qq.com"  # 用户名
    mail_pass = "dfpcglacrjbybafa"  # 口令
    
    sender = '1206180814@qq.com'
    receivers = ['1206180814@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 = "1206180814@qq.com"  # 用户名
    mail_pass = "dfpcglacrjbybafa"  # 口令
    
    sender = '1206180814@qq.com'
    receivers = ['1206180814@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: 无法发送邮件")

    结果如下:

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12227476.html
Copyright © 2011-2022 走看看