• python 学习笔记(5)——SMTP 使用QQ邮箱发送邮件


    目录

    发送邮件

    1、准备工作:

    2、发送纯文本信息内容:

    3、发送 HTML 格式的内容:

    4、发送带附件的邮件:

    5、群发(一个邮件,发给多个人):


    发送邮件

            以下都 以 QQ邮箱 为发送方举例;

     

    1、准备工作:

             使用 QQ邮箱发送邮件,需要到 “设置”=>“账号” 中 开启 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

            开启服务后,点击 管理服务

            然后会跳转到账号与安全页面,点击生成授权码以生成授权码,并记录下授权码:

    参考:

    https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode

    2、发送纯文本信息内容:

    1. import smtplib
    2. import time
    3. from email.mime.text import MIMEText
    4. def send_QQ_email_plain():
    5. sender = user = 'sender@qq.com' # 发送方的邮箱账号
    6. passwd = 'abcdefgxxxxx' # 授权码
    7. receiver = 'receiver@qq.com' # 接收方的邮箱账号,不一定是QQ邮箱
    8. # 纯文本内容
    9. msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')
    10. # From 的内容是有要求的,前面的abc为自己定义的 nickname,如果是ASCII格式,则可以直接写
    11. msg['From'] = f'abc '
    12. msg['To'] = receiver
    13. msg['Subject'] = 'Python SMTP 邮件测试' # 点开详情后的标题
    14. try:
    15. # 建立 SMTP 、SSL 的连接,连接发送方的邮箱服务器
    16. smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
    17. # 登录发送方的邮箱账号
    18. smtp.login(user, passwd)
    19. # 发送邮件 发送方,接收方,发送的内容
    20. smtp.sendmail(sender, receiver, msg.as_string())
    21. print('邮件发送成功')
    22. smtp.quit()
    23. except Exception as e:
    24. print(e)
    25. print('发送邮件失败')

            对于 msg['Form'] 的要求:

     

            如果自定义的 nickname 是非 ASCII 字符,则直接写会报错,如:

    msg['From'] = f'好 '

     

            正确的格式为:

    1. msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= '

            如果接收方是 QQ 邮箱,则前面的 nickname 会显示在该位置:

            如果不需要自己定义 nickname,也可以直接使用邮箱账号:

    msg['From'] = '12345@qq.com'

            则会显示邮箱账号:

     

             点开邮件查看详情:

     

    3、发送 HTML 格式的内容:

    1. import base64
    2. import smtplib
    3. import time
    4. from email.mime.text import MIMEText
    5. def send_QQ_mail_HTML():
    6. user = 'sender@qq.com'
    7. passwd = 'abcdefxxxx'
    8. receiver = 'receiver@qq.com'
    9. # 直接写
    10. # html_content = '''
    11. #

      这个是邮件的内容

    12. # '''
    13. # 读入 html 文件的内容
    14. with open('./for_email.html', mode='r', encoding='utf-8') as f:
    15. html_content = f.read()
    16. # 指定类型是 html
    17. msg = MIMEText(html_content, 'html', 'utf-8')
    18. msg['From'] = user
    19. msg['To'] = receiver
    20. msg['Subject'] = '测试发送 HTML 内容'
    21. try:
    22. smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
    23. smtp.login(user, passwd)
    24. smtp.sendmail(user, receiver, msg.as_string())
    25. print('发送成功')
    26. except:
    27. print('发送失败')

            for_email.html 的内容:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <style>
    7. h1{
    8. color: brown;
    9. }
    10. p{
    11. margin: 5px;
    12. color: purple;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <h1>这是一个邮件内容的标头h1>
    18. <img src="https://img1.baidu.com/it/u=1890390320,3399874998&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800">
    19. <div>
    20. <h3>From合法性检查h3>
    21. <p>一、根据RFC5322协议,邮件标头中需要包含'From'信息。p>
    22. <p>二、根据RFC2047, RFC822协议,邮件标头中的'From'形式为:p>
    23. <p>1. 邮箱地址形式:prefix@domain, 如 'abc@qq.com'。p>
    24. <p>2. 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>,其中,nickname为ASCII字符集中字符组合或编码文本:p>
    25. <p>(1)如果昵称全为ASCII字符,如'ABC',邮箱地址为'abc@qq.com',则标头中的'From'为'ABC <abc@qq.com>'。
    26. 注意'ABC'和'<abc@qq.com>'之间用空格隔开;p>
    27. <p>(2)如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。nickname最终的形式为
    28. :"=?" charset "?" encoding "?" encoded-text "?="。其中,charset为字符集;
    29. encoding为编码方式,'B'代表base64;encoded-text为编码后的文本。例如,昵称为'QQ邮箱昵称示例',
    30. 邮箱地址为'abc@qq.com',则对昵称进行base64编码,字符集使用UTF-8,则
    31. nickname为 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最终邮件标头中的
    32. 'From'为'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" <abc@qq.com>'。
    33. 注意编码文本和邮件地址间用空格隔开。p>
    34. div>
    35. body>
    36. html>

     

            该html中含有引用了外链的img图片,如果接收方为QQ邮箱,则默认不会显示图片:

            如果是其他的邮箱,图片有可能可以显示(如企业微信的邮箱),html 的样式也可能会丢失不奏效。

    4、发送带附件的邮件:

    1. import base64
    2. import smtplib
    3. import time
    4. from email.mime.application import MIMEApplication
    5. from email.mime.text import MIMEText
    6. from email.mime.multipart import MIMEMultipart
    7. def send_QQ_email_mul():
    8. sender = user = 'sender@qq.com'
    9. passwd = 'abcdefghijk' # 不是密码,是生成的 授权码
    10. receiver = 'receiver@qq.com'
    11. content = MIMEMultipart() # 创建一个包含多个部分的内容
    12. content['From'] = user
    13. content['To'] = receiver
    14. content['Subject'] = 'Test Email'
    15. # 添加文本内容
    16. # text = MIMEText('this is a test email.', 'plain', 'utf-8')
    17. # content.attach(text)
    18. # 添加html内容
    19. with open('./for_email.html', mode='r', encoding='utf-8') as f:
    20. html_content = f.read()
    21. msg = MIMEText(html_content, 'html', 'utf-8')
    22. content.attach(msg)
    23. # 添加附件
    24. with open('./data.xlsx', 'rb') as f:
    25. attachment = MIMEApplication(f.read()) # 读取为附件
    26. attachment.add_header('Content-Disposition', 'attachment', filename='data.xlsx')
    27. content.attach(attachment)
    28. try:
    29. smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
    30. smtp.login(user, passwd)
    31. smtp.sendmail(sender, receiver, content.as_string())
    32. print('邮件发送成功')
    33. except Exception as e:
    34. print(e)
    35. print('发送邮件失败')

    5、群发(一个邮件,发给多个人):

            将 receiver 写成每个人的邮箱账号数组即可

    1. import base64
    2. import smtplib
    3. import time
    4. from email.mime.text import MIMEText
    5. def send_QQ_mail():
    6. sender = user = '12345@qq.com'
    7. passwd = 'ABCD'
    8. # 写成数组,将发给这三者
    9. receiver = ['abcdef@qq.com','aaa@xxx.edu.cn','abcd@gmail.com']
    10. msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')
    11. msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= '
    12. msg['To'] = 'you' # 每个人都会看到这个内容
    13. msg['Subject'] = 'Python SMTP 邮件测试' # 点开详情后的标题
    14. try:
    15. # 建立 SMTP 、SSL 的连接
    16. smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
    17. # 登录
    18. smtp.login(user, passwd)
    19. # 发送邮件 发送方,接收方,发送的内容
    20. smtp.sendmail(sender, receiver, msg.as_string())
    21. print('邮件发送成功')
    22. smtp.quit()
    23. except Exception as e:
    24. print(e)
    25. print('发送邮件失败')

     

     

  • 相关阅读:
    ArcEngine(五)用ICommand接口实现放大缩小
    MAXScript - tyFlow for 3dsMax
    “深入探究SpringMVC的工作原理与入门实践“
    计算机毕业设计选题推荐-springboot 企业在线培训系统
    css实现的图片悬停旋转弹出文本框html页面前端源码
    【Redis底层解析】跳跃表
    SOCKS5 认证的方法
    好用的vscode vue3插件
    【第13天】SQL进阶-索引的隐藏索引(SQL 小虚竹)
    记一次asp.net 8 服务器爆满的解决过程
  • 原文地址:https://blog.csdn.net/hao_13/article/details/132818286