登录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
以下是几个类的介绍
def __init__(self, _text, _subtype='plain', _charset=None, *, policy=None):
创建一个text / *类型的MIME文档。
def __init__(self, _imagedata, _subtype=None,
_encoder=encoders.encode_base64, *, policy=None, **_params):
创建一个iamge/ *类型的MIME文档。
def __init__(self, _subtype='mixed', boundary=None, _subparts=None,
*, policy=None,
**_params):
创建multipart / *类型的消息。默认情况下,使用适当的Content-Type和MIME-Version头创建一个多部分/混合消息。
这是从SMTP派生的子类,该子类通过SSL加密套接字连接(要使用此类,您需要使用SSL支持编译的套接字模块)。
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
将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}")
主要有四个要素:
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)
def html_format():
content = """
Python mail sending test
"""
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 = """
send to my wife
image
"""
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='' )
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邮件的批量发送(其他邮件操作类似),一般正式的邮件只需要改动下称呼,然后直接套用模板。如何增强适用性?我们可以给收件人的称呼和账号之间建立一个映射(或者直接从保存好的文件中读取),对不同的人进行分类,对应于不同的邮件模板