一、准备工作
使用第三方SMTP服务,首先需要开启相应邮箱的SMTP服务,并生成口令或授权码。(参考:腾讯企业邮箱怎样获取16位授权密码)
1、腾讯企业邮箱
smtp服务器地址:smtp.exmail.qq.com,端口号:25
2、qq邮箱smtp服务器地址:smtp.qq.com, 端口号:456
3、163邮箱smtp服务器地址:smtp.163.com,端口号:25
二、代码实现
1、思路
一、导入需要的包
二、提前设置信息
smtp发件服务器地址、用户名(带邮件后缀)、16位口令或授权码;
发收件人邮箱、收件人邮箱列表;
主题-字符串对象、正文内容-字符串对象;
附件文件的路径、附件文件的名称。
2、具体过程
# 一、导入需要的包
import smtplib
from email.mime.multipart import MIMEMultipart # 发送带附件的邮件,首先要创建MIMEMultipart()实例
from email.mime.text import MIMEText # html格式和文本格式邮件
from email.mime.application import MIMEApplication # 被用来表示主要类型的MIME消息对象应用 ???
from email.header import Header
# 二、提前设置信息
mail_host = "smtp.exmail.qq.com" # 这里我用的是腾讯企业邮箱。
mail_user = "XXX@hkaspire.cn" # 用户名
mail_pass = "VNiUx8PKH3rFNfJS" # 口令,参考:腾讯企业邮箱怎样获取16位授权密码。
sender = 'XXX@hkaspire.cn' # 发件人的邮箱-字符串
receivers = ['fXXdXXXfXfXXX@hkaspire.cn', # 收件人的邮箱-字符串列表
# 'bb@hkaspire.cn',
# 'cc@hkaspire.cn',
'XXXXX@hkaspire.cn']
print(now_my)
subject = '8月XXXXXXXXXXX订单_at{}'.format(now_my) # 主题-字符串对象
mainText = '附件为,8月XXXXXXXXXXX订单_at{},请查收。'.format(now_my) # 正文-字符串对象
fpath = r"F:\XXXXXXXXXXXXXXXXXXXXXXXXXXX\\" # 附件文件的路径
fname = '8月XXXXXXXXXXX订单_at%s.xlsx'%now_my # 附件文件的名称
# 三、定义函数
def mySendEmail():
# 1、实例化【message对象】
message = MIMEMultipart()
# 2、【message对象】的属性:发件人名称、收件人名称、主题
message['From'] = sender # 一般直接使用发件人邮箱
message['To'] = ','.join(receivers) # 用“,”将列表中的元素,拼接为一个大字符串,比如:'aa,bb,cc,dd'
message['Subject'] = Header(subject, 'utf-8')
# 3、【message对象】的方法:正文内容
content = MIMEText(mainText)
message.attach(content)
# 3、【message对象】的方法:附件文件
xlsx = MIMEApplication(open(fpath+fname, 'rb').read()) # 打开Excel,读取Excel文件
xlsx["Content-Type"] = 'application/octet-stream' # 设置内容类型
xlsx.add_header('Content-Disposition', 'attachment', filename=fname) # ?
message.attach(xlsx)
# 4、发送邮件
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 Exception as e:
print(e)
print("邮件发送失败......")
# 四、调用函数
mySendEmail()