python 发送QQ邮箱

开启QQ邮箱的STMP服务

在这里插入图片描述

登录QQ邮箱->账号设置->开启服务->获取授权码
获取授权码的时候需要手机验证码
在这里插入图片描述

做完这步就可以进入正题了

导包

为了方便, 我把授权码保存在了文件"./license.py"中

import smtplib
import time
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from license import pass_word

以下是几个类的介绍

MIMEText
def __init__(self, _text, _subtype='plain', _charset=None, *, policy=None):

创建一个text / *类型的MIME文档。

  • _text是此消息对象的字符串。你要发的邮箱内容
  • _subtype是MIME子内容类型,默认为“plain”。 可以理解为文本格式
  • _charset是添加到Content-Type标头的字符集参数。默认为“ us-ascii”。请注意,作为关联作用,还将设置Content-Transfer-Encoding标头。意思是需要同时设置
MIMEImage
def __init__(self, _imagedata, _subtype=None,
             _encoder=encoders.encode_base64, *, policy=None, **_params):

创建一个iamge/ *类型的MIME文档。

  • _imagedata是包含原始图像数据的字符串。如果标准的Python`imghdr’模块可以解码该数据,则该子类型将自动包含在Content-Type标头中。否则,您可以通过
  • _subtype参数指定特定的图像子类型。
  • _encoder是将执行实际编码以传输图像数据的功能。它接受一个参数,即此Image实例。它应该使用get_payload()和set_payload()将有效负载更改为编码形式。它还应根据需要向邮件添加任何Content-Transfer-Encoding或其他标头。默认编码为Base64。任何其他关键字参数都将传递给基类构造函数,该构造函数会将它们转换为Content-Type标头上的参数。
MIMEMultipart
def __init__(self, _subtype='mixed', boundary=None, _subparts=None,
             *, policy=None,
             **_params):

创建multipart / *类型的消息。默认情况下,使用适当的Content-Type和MIME-Version头创建一个多部分/混合消息。

  • _subtype是多部分内容类型的子类型,默认为’mixed’。 boundary是多部分边界字符串。默认情况下,将根据需要进行计算。
  • _subparts是有效负载的初始子部分序列。它必须是可迭代的对象,例如列表。您始终可以使用 attach() 方法将新的子部件附加到消息中。 Content-Type标头的其他参数来自关键字参数(或传递给_params参数)。
STMP_SSL

这是从SMTP派生的子类,该子类通过SSL加密套接字连接(要使用此类,您需要使用SSL支持编译的套接字模块)。

  • 如果未指定host,则使用”(本地主机)。如果省略端口,则使用标准的SMTP over SSL端口(465)。
  • local_hostname和source_address具有与SMTP类中相同的含义。密钥文件和证书文件也是可选的-它们可以包含用于SSL连接的PEM格式的私钥和证书链文件。
  • context也是可选的,可以包含SSLContext,并且是keyfile和certfile的替代方案;如果已指定,则密钥文件和证书文件都必须为“无”。
def __init__(self, host='', port=0, local_hostname=None,
             keyfile=None, certfile=None,
             timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
             source_address=None, context=None):

了解完这几个类的功能和参数后,开始敲代码

设置收发邮箱账号

sender = "*@qq.com"  # sender email account
receivers = ['*@qq.com']  # list or str of receiver's email

创建SMTP_SSL实例

将message发送给指定账号

def try_send(message):
    """third party services"""
    try:
        # smtpObj = smtplib.SMTP()
        # smtpObj.connect('smtp.qq.com', 465)
        smtpObj = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
        smtpObj.login(user=sender, password=pass_word)
        smtpObj.sendmail(from_addr=sender, to_addrs=receivers, msg=message.as_string())
        print("sent successfully")
        smtpObj.quit()
    except smtplib.SMTPException as e:
        print(f"failed: {e}")

邮箱内容

主要有四个要素:

  • From:标识发件人
  • To:标识收件人
  • Subject:邮件的主题或者标题,一个好的标题可以让邮件的目的一目了然
  • text content:邮件正文
纯文本

发送一个无主题的纯文本邮件,QQ邮箱中查看运行结果,如图
在这里插入图片描述

def plain_text():
    subject = "Python mail sending test"
    # Three parameters: text content, text format, encoding
    message = MIMEText(_text=subject, _subtype='plain', _charset='utf-8')
    message['From'] = 'husband'
    message['To'] = 'my lover'

    try_send(message)
HTML格式文本

发送一个有主题的HTML格式文本邮件,运行结果如图
在这里插入图片描述

def html_format():
    content = """
    <p>Python mail sending test</p>
    <p><a href='http://www.baidu.com'>This is a link</a></p>
    """
    message = MIMEText(content, 'html', 'utf-8')
    message['From'] = 'your lover'
    message['To'] = 'pink big'
    subject = 'Python STMP mail sending test. HTML formatation'
    message['Subject'] = subject

    try_send(message)
带附件

邮件中携带附件,运行结果如图
在这里插入图片描述

def with_attachment():
    message = MIMEMultipart()
    message['From'] = 'I miss you'
    message['To'] = 'people who miss day and night'
    subject = 'Python SMTP mail sending test'
    message['Subject'] = subject

    # message body content
    message.attach(MIMEText('want to see you now', 'plain', 'utf-8'))

    # Construct Attachment 1 and transfer the "quotes.csv" file in the current directory
    with open('quotes.csv', 'rb') as fp:
        att1 = MIMEText(fp.read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    att1["Content-Disposition"] = 'attachment; filename="quotes.csv"'
    message.attach(payload=att1)

    try_send(message)
附件中含图片

邮件中携带图片,运行结果如图
在这里插入图片描述

def attach_image():
    msgRoot = MIMEMultipart(_subtype='related')
    msgRoot['From'] = 'for the rest of your life'
    msgRoot['To'] = 'hai ping'
    subject = "Python SMTP mail sending test"
    msgRoot['Subject'] = subject

    msgRoot.attach(msgAlternative := MIMEMultipart('alternative'))

    mail_msg = """
    <p>send to my wife</p>
    <p><a href='http://www.baidu.com'>a link</a></p>
    <p>image</p>
    <p><img src='cid:image1'></p>
    """
    msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

    # specify picture
    with open(r'C:\Users\QQ\Downloads\308c43f46bd3b2bbcf46aa63f5dec1c2.jpg', 'rb') as fp:
        msgImage = MIMEImage(fp.read())

    # Define the picture ID, quote in HTML text
    msgImage.add_header(_name='Content-ID', _value='<image1>')
    msgRoot.attach(msgImage)

    try_send(msgRoot)

程序主入口

if __name__ == '__main__':
    # date: 2020.05.04
    # version: python 3.8.2, Pycharm 2020.1
    plain_text()
    time.sleep(2)
    html_format()
    time.sleep(2)
    with_attachment()
    time.sleep(2)
    attach_image()

注: 代码中用到了f-string和海象运算符, 由于不向后兼容, 旧版本中会报错

以上代码可实现QQ邮件的批量发送(其他邮件操作类似),一般正式的邮件只需要改动下称呼,然后直接套用模板。如何增强适用性?我们可以给收件人的称呼和账号之间建立一个映射(或者直接从保存好的文件中读取),对不同的人进行分类,对应于不同的邮件模板

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值