python中如何实现qt发送邮件发送附件及附件功能的具体详解

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Python实现Smtplib发送带有各种附件的邮件实例
摘要:这两天对Python的邮件模块比较感兴趣,于是就查了查资料。同时在实际的编码过程中也遇到了各种各样的问题。下面我就来分享一下我与smtplib的故事。前提条件我的上一篇博文里面讲解了,发送邮件必须的条件。这里同样是适用的。大致就是要开启邮箱的SMPT/POP服务等等。核心知识点因为今天主要讲解的是如何发送带有附件的邮件,那么核心肯定是附件了。怎么才能发附件呢?其实我们换个思路,就不难理解了。因为我们发送邮件,经过了应用层
这两天对Python的邮件模块比较感兴趣,于是就查了查资料。同时在实际的编码过程中也遇到了各种各样的问题。下面我就来分享一下我与smtplib的故事。
我的上一篇博文里面讲解了,发送邮件必须的条件。这里同样是适用的。大致就是要开启邮箱的SMPT/POP服务等等。
核心知识点
因为今天主要讲解的是如何发送带有附件的邮件,那么核心肯定是附件了。怎么才能发附件呢?
其实我们换个思路,就不难理解了。因为我们发送邮件,经过了应用层
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Python实现Smtplib发送带有各种附件的邮件实例相关信息,包括
的信息,所有Python实现Smtplib发送带有各种附件的邮件实例相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International博客分类:
import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
mail_host=''
mail_user=''
mail_pass=''
mail_postfix=''
def send_mail(to_list,sub,content,files=None):
me='' + '&' + mail_user + '@' + mail_postfix + '&'
text = MIMEText(content,_subtype='html',_charset='utf-8')
msg = MIMEMultipart()
msg.attach(text)
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ';'.join(to_list)
for f in files or []:
with open(f, "rb") as fil:
msg.attach(MIMEApplication(
fil.read(),
Content_Disposition=' filename="%s"' % basename(f),
Name=basename(f)
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me, to_list, msg.as_string())
return True
except Exception, e:
print str(e)
return False
浏览: 304178 次
来自: 北京
这个类运行不起来呀
这类如何导出数据呀
你好,请问我想写个excelToExcel 另存一个excel ...
记录一下学习。
鞋的不错啊。呵呵额
确认jacob dll是否已经放入系统路径,jacob版本不同 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'本文实例讲述了Python实现读取邮箱中的邮件功能。分享给大家供大家参考,具体如下:
#-*- encoding: utf-8 -*-
import sys
import locale
import poplib
from email import parser
import email
import string
# 确定运行环境的encoding
__g_codeset = sys.getdefaultencoding()
if "ascii"==__g_codeset:
__g_codeset = locale.getdefaultlocale()[1]
def object2double(obj):
if(obj==None or obj==""):
return float(obj)
def utf8_to_mbs(s):
return s.decode("utf-8").encode(__g_codeset)
def mbs_to_utf8(s):
return s.decode(__g_codeset).encode("utf-8")
host = 'pop.exmail.qq.com'
username = ''
password = 'password'
pop_conn = poplib.POP3_SSL(host)
pop_conn.user(username)
pop_conn.pass_(password)
#Get messages from server:
# 获得邮件
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
#print messages
#print "--------------------------------------------------"
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#print messages
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for index in range(0,len(messages)):
message = messages[index];
i = i + 1;
subject = message.get('subject')
h = email.Header.Header(subject)
dh = email.Header.decode_header(h)
subject = unicode(dh[0][0], dh[0][1]).encode('utf8')
mailName = "mail%d.%s" % (i, subject)
f = open('%d.log'%(i), 'w');
print && f, "Date: ", message["Date"]
print && f, "From: ", email.utils.parseaddr(message.get('from'))[1]
print && f, "To: ", email.utils.parseaddr(message.get('to'))[1]
print && f, "Subject: ", subject
print && f, "Data: "
for part in message.walk():
fileName = part.get_filename()
contentType = part.get_content_type()
mycode=part.get_content_charset();
# 保存附件
if fileName:
data = part.get_payload(decode=True)
h = email.Header.Header(fileName)
dh = email.Header.decode_header(h)
fname = dh[0][0]
encodeStr = dh[0][1]
if encodeStr != None:
fname = fname.decode(encodeStr, mycode)
fEx = open("%s"%(fname), 'wb')
fEx.write(data)
fEx.close()
elif contentType == 'text/plain':# or contentType == 'text/html':
data = part.get_payload(decode=True)
content=str(data);
if mycode=='gb2312':
content= mbs_to_utf8(content)
nPos = content.find('降息')
print("nPos is %d"%(nPos))
print && f, data
pop_conn.quit()
更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。Python实现自动发送邮件功能
转载 &更新时间:日 16:34:23 & 作者:Stephen_XMC
这篇文章主要为大家详细介绍了Python实现自动发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。
SMTP通讯的基本流程可以概括为以下几点:
1.连接SMTP服务器
2.登陆用户名和密码
3.发送指定邮件内容
4.退出SMTP连接
一、发送纯文本格式邮件
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from smtplib import SMTP
from email.mime.text import MIMEText
from email.header import Header
#构造纯文本邮件内容
msg = MIMEText('hello,send by Python.....','plain','utf-8')
#发送者邮箱
sender = '.cn'
#发送者的登陆用户名和密码
user = '.cn'
password = 'xxxxxx'
#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx'
#接收者的邮箱地址
receiver = ['',''] #receiver 可以是一个list
smtp = smtplib.SMTP() #实例化SMTP对象
smtp.connect(smtpserver,25) #(缺省)默认端口是25 也可以根据服务器进行设定
smtp.login(user,password) #登陆smtp服务器
smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数
login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文
是一个str,as_string()把MIMEText对象变成str。
smtp.quit()
运行之后就会收到邮件:
但是仔细观察会发现:
1.邮件没有主题
2.看不到收件人的信息
这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件:
msg = MIMEText('hello,send by Python.....','plain','utf-8')
msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
subject = 'python SMTP 测试邮件'
msg['Subject'] = Header(subject,'utf-8')
二、发送HTML格式的邮件
如果我们要发送HTML邮件,而不是普通的纯文本文件怎么办?方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:
msg = MIMEText('&html&&h1&你好!&h1&&html&','html','utf-8')
#发送HTML格式邮件就只需要把对应的第二个参数改为html即可
三、发送带附件的邮件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
#发送邮件服务器
smtpserver = 'xxxxx'
#发送邮箱用户名和密码
user = 'xxxxxx'
password = 'xxxxxx'
sender = 'xxxxx'
receiver = 'xxxxxxx'
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header('Python 测试','utf-8')
message['To'] = Header('测试','utf-8')
subject = 'Python SMTP邮件测试'
message['Subject'] = Header(subject,'utf-8')
#邮件正文内容
message.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))
#构造附件1,传送当前目录下的test.txt文件
att1 = MIMEText(open('123.txt','rb').read(),'base64','utf-8')
att1['Content-Type'] = 'application/octet-stream'
#这里的filename可以任意写,写什么名字 邮件中就显示什么名字
att1['Content-Disposition'] = 'filename:"123.txt"'
message.attach(att1)
smtp = smtplib.SMTP()
smtp.connect(smtpserver,25)
smtp.login(user,password)
smtp.sendmail(sender,receiver,message.as_string())
smtp.quit()
使用Python的smtplib发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。
构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
+- MIMEBase
&& +- MIMEMultipart
&& +- MIMENonMultipart
&&&&& +- MIMEMessage
&&&&& +- MIMEText
&&&&& +- MIMEImage
这种嵌套关系就可以构造出任意复杂的邮件。你可以通过查看它们所在的包以及详细的用法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Python发送邮件(常见四种邮件内容)
转自:http://lizhenliang.blog.51cto.com/5330
在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调用运营商邮箱服务器。
对于Python来说,需要编写脚本调用邮件服务器来发送邮件,使用的协议是SMTP。接收邮件,使用的协议是POP3和IMAP。我想有必要说明下 ,POP3和IMAP的区别:POP3在客户端邮箱中所做的操作不会反馈到邮箱服务器,比如删除一封邮件,邮箱服务器并不会删除。IMAP则会反馈到邮箱服务器,会做相应的操作。
Python分别提供了收发邮件的库,smtplib、poplib和imaplib。
本章主要讲解如果使用smtplib库实现发送各种形式的邮件内容。在smtplib库中,主要主要用smtplib.SMTP()类,用于连接SMTP服务器,发送邮件。
这个类有几个常用的方法:
SMTP.set_debuglevel(level)
设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring])
发送一个命令到SMTP服务器
SMTP.connect([host[, port]])
连接到指定的SMTP服务器
SMTP.helo([hostname])
使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname)
使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed()
如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name)
判断指定名称是否在SMTP服务器上
SMTP.verify(address)
判断邮件地址是否在SMTP服务器上
SMTP.starttls([keyfile[, certfile]])
使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
SMTP.login(user, password)
登录SMTP服务器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
from_addr:邮件发件人
to_addrs:邮件收件人
msg:发送消息
SMTP.quit()
关闭SMTP会话
SMTP.close()
关闭SMTP服务器连接
看下官方给的示例:
&&& import smtplib
&&& s=smtplib.SMTP("localhost")
&&& tolist=["one@one.org","two@two.org","three@three.org","four@four.org"]
&&& msg = '''\
... From: Me@my.org
... Subject: testin'...
... This is a test '''
&&& s.sendmail("me@my.org",tolist,msg)
{ "three@three.org" : ( 550 ,"User unknown" ) }
&&& s.quit()
我们根据示例给自己发一个邮件测试下:
我这里测试使用本地的SMTP服务器,也就是要装一个支持SMTP协议的服务,比如sendmail、postfix等。
CentOS安装sendmail:yum install sendmail
&&& import smtplib
&&& s = smtplib.SMTP("localhost")
&&& tolist = ["", ""]
&&& msg = '''\
... From: Me@my.org
... Subject: test
... This is a test '''
&&& s.sendmail("me@my.org", tolist, msg)
{}进入腾讯和网易收件人邮箱,就能看到刚发的测试邮件,一般都被邮箱服务器过滤成垃圾邮件,所以收件箱没有,你要去垃圾箱看看。
可以看到,多个收件人可以放到一个列表中进行群发。msg对象里From表示发件人,Subject是邮件标题,换行后输入的是邮件内容。
上面是使用本地SMTP服务器发送的邮件,测试下用163服务器发送邮件看看效果:
&&& import smtplib
&&& s = smtplib.SMTP("smtp.163.com")
&&& s.login("", "xxx")
(235, 'Authentication successful')
&&& tolist = ["", ""]
&&& msg = '''\
... Subject: test
... This is a test '''
&&& s.sendmail("", tolist, msg)
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
File "/usr/lib64/python2.6/smtplib.py", line 725, in sendmail
raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp10,DsCowAAXIdDIJAtYkZiTAA--.7125592,please see http://mail.163.com/help/help_spam_16.htm?ip=119.57.73.67&hostid=smtp10&time=')
访问给出的163网址,SMTP554错误是: "554 DT:SUM 信封发件人和信头发件人不匹配;"
大概已经明白啥意思,看上面再使用本地SMTP服务器时候,收件人位置是“undisclosed-recipients”,看这样163的SMTP服务器不给我们服务的原因就是这里收件人没指定。
重新修改下msg对象,添加上收件人:
&&& msg = '''\
... Subject: test
... This is a test '''
&&& s.sendmail("", tolist, msg)
好了,可以正常发送邮件了。msg这个格式是SMTP规定的,一定要遵守。
1、Python发送邮件并抄送
#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
def sendMail(body):
smtp_server = 'smtp.163.com'
from_mail = ''
mail_pass = 'xxx'
to_mail = ['', '']
cc_mail = ['']
from_name = 'monitor'
subject = u'监控'.encode('gbk')
# 以gbk编码发送,一般邮件客户端都能识别
msg = '''\
# From: %s &%s&
# Subject: %s
# %s''' %(from_name, from_mail, to_mail_str, subject, body)
# 这种方式必须将邮件头信息靠左,也就是每行开头不能用空格,否则报SMTP 554
"From: %s &%s&" % (from_name, from_mail),
"To: %s" % ','.join(to_mail),
# 转成字符串,以逗号分隔元素
"Subject: %s" % subject,
"Cc: %s" % ','.join(cc_mail),
msg = '\n'.join(mail)
# 这种方式先将头信息放到列表中,然后用join拼接,并以换行符分隔元素,结果就是和上面注释一样了
s = smtplib.SMTP()
s.connect(smtp_server, '25')
s.login(from_mail, mail_pass)
s.sendmail(from_mail, to_mail+cc_mail, msg)
except smtplib.SMTPException as e:
print "Error: %s" %e
if __name__ == "__main__":
sendMail("This is a test!")
s.sendmail(from_mail, to_mail+cc_mail, msg) 在这里注意下,收件人和抄送人为什么放一起发送呢?其实无论是收件人还是抄送人,它们收到的邮件都是一样的,SMTP都是认为收件人这样一封一封的发出。所以实际上并没有抄送这个概念,只是在邮件头加了抄送人的信息罢了!另外,如果不需要抄送人,直接把上面cc的信息去掉即可。
2 Python发送邮件带附件
由于SMTP.sendmail()方法不支持添加附件,所以可以使用email模块来满足需求。email模块是一个构造邮件和解析邮件的模块。
先看下如何用email库构造一个简单的邮件:
message = Message()
message['Subject'] = '邮件主题'
message['From'] = from_mail
message['To'] = to_mail
message['Cc'] = cc_mail
message.set_payload('邮件内容')
基本的格式就是这样的!
继续回到主题,发送邮件带附件:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body, attachment):
smtp_server = 'smtp.163.com'
from_mail = ''
mail_pass = 'xxx'
to_mail = ['', '']
# 构造一个MIMEMultipart对象代表邮件本身
msg = MIMEMultipart()
# Header对中文进行转码
msg['From'] = formatAddr('管理员 &%s&' % from_mail).encode()
msg['To'] = ','.join(to_mail)
msg['Subject'] = Header('监控', 'utf-8').encode()
# plain代表纯文本
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 二进制方式模式文件
with open(attachment, 'rb') as f:
# MIMEBase表示附件的对象
mime = MIMEBase('text', 'txt', filename=attachment)
# filename是显示附件名字
mime.add_header('Content-Disposition', 'attachment', filename=attachment)
# 获取附件内容
mime.set_payload(f.read())
encoders.encode_base64(mime)
# 作为附件添加到邮件
msg.attach(mime)
s = smtplib.SMTP()
s.connect(smtp_server, "25")
s.login(from_mail, mail_pass)
s.sendmail(from_mail, to_mail, msg.as_string())
# as_string()把MIMEText对象变成str
except smtplib.SMTPException as e:
print "Error: %s" % e
if __name__ == "__main__":
sendMail('附件是测试数据, 请查收!', 'test.txt')3 Python发送HTML邮件
#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body):
smtp_server = 'smtp.163.com'
from_mail = ''
mail_pass = 'xxx'
to_mail = ['', '']
# 构造一个MIMEMultipart对象代表邮件本身
msg = MIMEMultipart()
# Header对中文进行转码
msg['From'] = formatAddr('管理员 &%s&' % from_mail).encode()
msg['To'] = ','.join(to_mail)
msg['Subject'] = Header('监控', 'utf-8').encode()
msg.attach(MIMEText(body, 'html', 'utf-8'))
s = smtplib.SMTP()
s.connect(smtp_server, "25")
s.login(from_mail, mail_pass)
s.sendmail(from_mail, to_mail, msg.as_string())
# as_string()把MIMEText对象变成str
except smtplib.SMTPException as e:
print "Error: %s" % e
if __name__ == "__main__":
body = """
&h1&测试邮件&/h1&
&h2 style="color:red"&This is a test&/h1&
sendMail(body)4 Python发送图片邮件
#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body, image):
smtp_server = 'smtp.163.com'
from_mail = ''
mail_pass = 'xxx'
to_mail = ['', '']
# 构造一个MIMEMultipart对象代表邮件本身
msg = MIMEMultipart()
# Header对中文进行转码
msg['From'] = formatAddr('管理员 &%s&' % from_mail).encode()
msg['To'] = ','.join(to_mail)
msg['Subject'] = Header('监控', 'utf-8').encode()
msg.attach(MIMEText(body, 'html', 'utf-8'))
# 二进制模式读取图片
with open(image, 'rb') as f:
msgImage = MIMEImage(f.read())
# 定义图片ID
msgImage.add_header('Content-ID', '&image1&')
msg.attach(msgImage)
s = smtplib.SMTP()
s.connect(smtp_server, "25")
s.login(from_mail, mail_pass)
s.sendmail(from_mail, to_mail, msg.as_string())
# as_string()把MIMEText对象变成str
except smtplib.SMTPException as e:
print "Error: %s" % e
if __name__ == "__main__":
body = """
&h1&测试图片&/h1&
&img src="cid:image1"/&
# 引用图片
sendMail(body, 'test.png')上面发邮件的几种常见的发邮件方法基本满足日常需求了。
python调用sendmail发送邮件
python 收发邮件
python 发邮件。可以带附件列表
Python 发送邮件竟如此简单
Python 发邮件
Zmail--永不拒信,发送简单的python邮件模块
Python发送电子邮件.
Python利用itchat库向好友或者公众号发消息
python发送邮件 大全汇总
Python 发送邮件脚本
没有更多推荐了,
(window.slotbydup=window.slotbydup || []).push({
id: '5865577',
container: s,
size: '300,250',
display: 'inlay-fix'

我要回帖

更多关于 附件具有什么 的文章

 

随机推荐