通过python发送带附件(支持多个附件)的邮件
2016-09-20 15:16
453 查看
目的:实现通过邮件,自动发送自动化脚本执行结果给对应的人
记录点:1 发送账号的密码设置,通过QQ发送的时候,目前QQ邮件的smtp设置的时候,都是通过授权码来进行账号认证,如果直接在脚本中写入QQ邮箱的密码,在执行脚本的时候,QQ服务器也会将密码认为是授权码进行编译,这样就导致失败。具体的如果获取授权码就不介绍了,进入QQ邮箱的设置里面,有介绍说明
2 参考网上的写法,总是失败,都是在邮箱服务器认证上面的,参考资料写的都是smtplib.SMTP("smtp server address")
方法来进行邮箱认证,但是总是失败,后来改成了smtplib.SMTP("smtp server address",port) ,就可以认证通过了。
认证不通过给出的错误提示为:smtplib.SMTPAuthenticationError: (530, 'Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28')
以下为例子
进一步改造:
发送多个附件。自己理解是多个附件,只是循环对每一个附件进行编码后进行发送,所以把附件的路径设置成一个list 依次读取list中的路径,逐个编码。经过测试,是可以这样实现的,具体的改造如下:
#coding:GBK
import os
import smtplib
import email.MIMEMultipart# import MIMEMultipart
import email.MIMEText# import MIMEText
import email.MIMEBase# import MIMEBase
import mimetypes
#
# command='''"c:\Program Files\WinRAR\Rar.exe" a d:\\download11\\1a23b.rar d:\download11\*.png -df'''
# os.system(command)
<pre name="code" class="python">From = "*****@qq.com" # 发送邮箱
To = "*****" #接受邮箱# file_name = "d:\\download11\\1a23b.rar"server = smtplib.SMTP_SSL("smtp.qq.com",465)server.login("281449451@qq.com","xxeumtamrbtvcbcf") #仅smtp服务器需要验证时# 构造MIMEMultipart对象做为根容器main_msg = email.MIMEMultipart.MIMEMultipart()#
构造MIMEText对象做为邮件显示内容并附加到根容器text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8")main_msg.attach(text_msg)# 构造MIMEBase对象做为文件附件内容并附加到根容器## 循环读入文件内容并格式化 [方式1]------------------------------file_names=["d:\\download11\\1a23b.rar","d:\\download11\\aa.rar"]for
file_name in file_names: data = open(file_name, 'rb') ctype,encoding = mimetypes.guess_type(file_name) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype,subtype = ctype.split('/',1) file_msg = email.MIMEBase.MIMEBase(maintype,
subtype) file_msg.set_payload(data.read()) data.close( ) email.Encoders.encode_base64(file_msg)#把附件编码 basename = os.path.basename(file_name) file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改邮件头 main_msg.attach(file_msg)# 设置根容器属性main_msg['From']
= Frommain_msg['To'] = Tomain_msg['Subject'] = "attach test "main_msg['Date'] = email.Utils.formatdate( )# 得到格式化后的完整文本fullText = main_msg.as_string( )# 用smtp发送邮件try: server.sendmail(From, To, fullText)finally: server.quit()
记录点:1 发送账号的密码设置,通过QQ发送的时候,目前QQ邮件的smtp设置的时候,都是通过授权码来进行账号认证,如果直接在脚本中写入QQ邮箱的密码,在执行脚本的时候,QQ服务器也会将密码认为是授权码进行编译,这样就导致失败。具体的如果获取授权码就不介绍了,进入QQ邮箱的设置里面,有介绍说明
2 参考网上的写法,总是失败,都是在邮箱服务器认证上面的,参考资料写的都是smtplib.SMTP("smtp server address")
方法来进行邮箱认证,但是总是失败,后来改成了smtplib.SMTP("smtp server address",port) ,就可以认证通过了。
认证不通过给出的错误提示为:smtplib.SMTPAuthenticationError: (530, 'Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28')
以下为例子
# -*- coding: utf-8 -*- import smtplib import email.MIMEMultipart# import MIMEMultipart import email.MIMEText# import MIMEText import email.MIMEBase# import MIMEBase import os.path import mimetypes From = "*****@qq.com" # 发送邮箱 To = "*****" #接受邮箱 file_name = "d://download//a.txt" #附件名(带路径) server = smtplib.SMTP_SSL("smtp.qq.com", 465) server.login("<span><span><span></span></span></span>*****@qq.com","授权码") #仅smtp服务器需要验证时 <span><span></span></span># 构造MIMEMultipart对象做为根容器 main_msg = email.MIMEMultipart.MIMEMultipart() # 构造MIMEText对象做为邮件显示内容并附加到根容器 text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8") main_msg.attach(text_msg) # 构造MIMEBase对象做为文件附件内容并附加到根容器 ## 读入文件内容并格式化 [方式1]------------------------------ data = open(file_name, 'rb') ctype,encoding = mimetypes.guess_type(file_name) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype,subtype = ctype.split('/',1) file_msg = email.MIMEBase.MIMEBase(maintype, subtype) file_msg.set_payload(data.read()) data.close( ) email.Encoders.encode_base64(file_msg)#把附件编码 ''' 测试识别文件类型:mimetypes.guess_type(file_name) rar 文件 ctype,encoding值:None None(ini文件、csv文件、apk文件) txt text/plain None py text/x-python None gif image/gif None png image/x-png None jpg image/pjpeg None pdf application/pdf None doc application/msword None zip application/x-zip-compressed None encoding值在什么情况下不是None呢?以后有结果补充。 ''' #--------------------------------------------- ## 设置附件头 basename = os.path.basename(file_name) file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改邮件头 main_msg.attach(file_msg) # 设置根容器属性 main_msg['From'] = From main_msg['To'] = To main_msg['Subject'] = "attach test " main_msg['Date'] = email.Utils.formatdate( ) # 得到格式化后的完整文本 fullText = main_msg.as_string( ) print 'df' # 用smtp发送邮件 try: server.sendmail(From, To, fullText) finally: server.quit()
进一步改造:
发送多个附件。自己理解是多个附件,只是循环对每一个附件进行编码后进行发送,所以把附件的路径设置成一个list 依次读取list中的路径,逐个编码。经过测试,是可以这样实现的,具体的改造如下:
#coding:GBK
import os
import smtplib
import email.MIMEMultipart# import MIMEMultipart
import email.MIMEText# import MIMEText
import email.MIMEBase# import MIMEBase
import mimetypes
#
# command='''"c:\Program Files\WinRAR\Rar.exe" a d:\\download11\\1a23b.rar d:\download11\*.png -df'''
# os.system(command)
<pre name="code" class="python">From = "*****@qq.com" # 发送邮箱
To = "*****" #接受邮箱# file_name = "d:\\download11\\1a23b.rar"server = smtplib.SMTP_SSL("smtp.qq.com",465)server.login("281449451@qq.com","xxeumtamrbtvcbcf") #仅smtp服务器需要验证时# 构造MIMEMultipart对象做为根容器main_msg = email.MIMEMultipart.MIMEMultipart()#
构造MIMEText对象做为邮件显示内容并附加到根容器text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8")main_msg.attach(text_msg)# 构造MIMEBase对象做为文件附件内容并附加到根容器## 循环读入文件内容并格式化 [方式1]------------------------------file_names=["d:\\download11\\1a23b.rar","d:\\download11\\aa.rar"]for
file_name in file_names: data = open(file_name, 'rb') ctype,encoding = mimetypes.guess_type(file_name) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype,subtype = ctype.split('/',1) file_msg = email.MIMEBase.MIMEBase(maintype,
subtype) file_msg.set_payload(data.read()) data.close( ) email.Encoders.encode_base64(file_msg)#把附件编码 basename = os.path.basename(file_name) file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改邮件头 main_msg.attach(file_msg)# 设置根容器属性main_msg['From']
= Frommain_msg['To'] = Tomain_msg['Subject'] = "attach test "main_msg['Date'] = email.Utils.formatdate( )# 得到格式化后的完整文本fullText = main_msg.as_string( )# 用smtp发送邮件try: server.sendmail(From, To, fullText)finally: server.quit()
相关文章推荐
- python发送邮件的实例代码(支持html、图片、附件)
- [python snippets] 邮件发送 (带附件,多收件人, 支持SMTP 和Postfix )
- Java发送邮件(支持多个附件)
- python发送邮件脚本(支持多个附件,中文)
- 基于python的图形化邮件发送程序(支持添加附件)
- 用Python实现在Linux环境发送带附件的邮件,支持文本/html格式
- python发送邮件的实例代码(支持html、图片、附件)
- python发送邮件的实例代码(支持html、图片、附件)
- SSL邮件发送(腾讯企业邮箱测试通过,可以支持多附件)
- 我的python学习之路----发送带附件邮件(基于smtp)
- python - 如何通过GMail发送邮件:smtplib的使用
- linux下c代码如何把指定文件作为附件,通过evolution发送邮件
- 如何使用Python发送带(附件)的邮件
- GAE(python)中发送带附件的邮件
- Python 发送带 附件 邮件 脚本
- C#发送邮件小程序(支持群发,附件)winform
- 使用javaMail发送复杂邮件,支持附件发送
- python邮件发送(带附件,解决中文乱码问题)
- 如何使用Python发送带附件的邮件
- C# 带附件邮件发送(支持多附件)