Python SMTP模块使用QQ邮箱发送邮件

前言:

    尝试实现《Python编程快速上手  让繁琐工作自动化》书籍中的第十六章习题部分,使用python发送email信息,尝试发送Html,附件和正文都同时存在的邮件,使用QQ邮箱,最终实现根据表格标记对不同用户发不同邮件功能。(根据之前编写的读取表格示例可以实现,思路是读取联系人,邮箱,标志位,根据标志位判断使用不同邮件模板发送,就不编程实现了)

过程:

首先确认QQ邮箱 smtp地址,端口:QQ邮箱的POP3与SMTP服务器是什么?

QQ邮箱 POP3 和 SMTP 服务器地址设置如下:

邮箱POP3服务器(端口995)SMTP服务器(端口465或587)
qq.compop.qq.comsmtp.qq.com
SMTP服务器需要身份验证。

    根据提示开启相关服务,选择生成授权码,得到后用于后续代码登陆部分

    整体流程也比较简单,顺序流程:登陆smtp服务器-》输入账号密码信息-》确定收发件人信息-》填写主题、正文和附件-》发送并退出。附代码

#! python3
"""
    此脚本尝试实现《Python编程快速上手  让繁琐工作自动化》书籍中的第十六章习题部分
    尝试使用python发送email信息,尝试发送Html,附件和正文都存在的邮件,使用QQ邮箱
    最后修改时间:2018-06-23  最后修改作者:QiYe005
"""
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart   

import os,sys
from nt import chdir#判断目录是否存在并切换目录

print("脚本运行开始")
#登陆邮件服务器
smtpObj=smtplib.SMTP('smtp.qq.com', 587)
smtpObj.ehlo()
smtpObj.starttls()
#传入相应的账号密码信息
smtpObj.login('XXXXXXXX@qq.com', '生成的授权码')

#邮件收发信人信息
sender = 'XXXXXX@qq.com'#发件人信息
receivers = ['XXXXXXX@163.com']#收件人信息

#完善发件人收件人,主题信息
message=MIMEMultipart()
message['From'] = formataddr(["发件人昵称",sender]) 
message['To'] = formataddr(["收件人昵称",''.join(receivers)]) 
subject = 'Python SMTP 邮件, 包括html和附件整体混合邮件'
message['Subject'] = Header(subject, 'utf-8')

#正文部分
textmessage = MIMEText('<p>Python SMTP2 ,html文本</p>'+
'<p>主要参考: <a href="https://www.cnblogs.com/saneri/p/5845048.html">Python SMTP邮件模块</a></p>'+
'<p><img src="G:\test_Python\AutomateTheBoringStuffWithPythonTest\16EmailAndMessageTest\picture001.jpg"/></p>','html', 'utf-8')
message.attach(textmessage)

#附件部分,此处尝试添加txt,图片,word,pdf,表格,音乐文4类
workLoc = os.path.join('G:\\', 'test_Python','AutomateTheBoringStuffWithPythonTest','16EmailAndMessageTest')
print('预设存放表格路径为:'+str(workLoc))        
#检查路径有效性
if (os.path.exists(workLoc))&(os.path.isdir(workLoc)):
  #尝试改变当前工作路径:
  chdir(workLoc)
  print('预设工作路径有效,改变当前工作路径为:'+str(os.getcwd()))
else:
  print('预设工作路径无效,请从新检查')
  sys.exit() 
#尝试添加txt附近
textFile='text001.txt'
print("文本附件文件名为:%s" %textFile)
textFileLoc=os.path.join(workLoc,textFile)
textAtt= MIMEText(open(textFileLoc, 'rb').read(), 'base64', 'utf-8')
textAtt["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,但是实际测试如果在线查看及下载查看,名称默认为此处设置的名字,所以后续直接就是原始附件名,方便下载、在线查看
textAtt.add_header('Content-Disposition', 'attachment', filename=textFile)
message.attach(textAtt)
#尝试添加图片附件
pictureFile='picture001.jpg'
print("图片附件文件名为:%s" %pictureFile)
pictureFileLoc=os.path.join(workLoc,pictureFile)
pictureAtt = MIMEApplication(open(pictureFileLoc,'rb').read())
pictureAtt.add_header('Content-Disposition', 'attachment', filename=pictureFile)
message.attach(pictureAtt)
#尝试添加word附件
wordFile='word001.doc'
print("word附件文件名为:%s" %wordFile)
wordFileLoc=os.path.join(workLoc,wordFile)
wordAtt= MIMEText(open(wordFileLoc, 'rb').read(), 'base64', 'utf-8')
wordAtt.add_header('Content-Disposition', 'attachment', filename=wordFile)
message.attach(wordAtt)
#尝试添加表格附件
sheetFile='sheet001.xls'
print("表格附件文件名为:%s" %sheetFile)
sheetFileLoc=os.path.join(workLoc,sheetFile)
sheetAtt= MIMEText(open(sheetFileLoc, 'rb').read(), 'base64', 'utf-8')
sheetAtt.add_header('Content-Disposition', 'attachment', filename=sheetFile)
message.attach(sheetAtt)
#尝试添加pdf附件
pdfFile='pdf001.pdf'
print("表格附件文件名为:%s" %pdfFile)
pdfFileLoc=os.path.join(workLoc,pdfFile)
pdfAtt= MIMEText(open(pdfFileLoc, 'rb').read(), 'base64', 'utf-8')
pdfAtt.add_header('Content-Disposition', 'attachment', filename=pdfFile)
message.attach(pdfAtt)
#尝试添加声音wav附件
musicFile='music001.wav'
print("表格附件文件名为:%s" %musicFile)
musicFileLoc=os.path.join(workLoc,musicFile)
musicAtt= MIMEApplication(open(musicFileLoc,'rb').read())
musicAtt.add_header('Content-Disposition', 'attachment', filename=musicFile)
message.attach(musicAtt)

#发送邮件操作
smtpObj.sendmail(sender,receivers, message.as_string())
smtpObj.quit()
print("脚本运行结束")

效果如下:


查询是否登录成功可通过QQ邮箱-》已发送-》查看发信投递状态查看。


总结:

   过程中遇到了message['To'] 部分代码错误无法发送,自动归档到草稿箱的问题;短时间频繁登陆发送无意义邮件被认为是垃圾邮件的问题,通过修改代码和邮件内容均可解决。最后就是html代码本人知识欠缺,添加图片失败,如果大神路过请留言改正。


参考:

Python SMTP邮件模块

Python SMTP发送邮件-菜鸟教程

python自动发送邮件自定义邮件发件人和收件人的显示内容

Python用QQ邮箱发送邮件时授权码问题


展开阅读全文

没有更多推荐了,返回首页