python发送带附件的邮件

xuyapeng1991 2014-06-26 03:15:15
刚用Python写了一个收发邮件的程序,但用它发送可执行文件的时候Python编译器就死机了。求解救方法。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
from email import encoders
import mimetypes,sys
import os

class IMessagePtr:
From = ""
charSet = ""
MailServerUserName = ""
MailServerPassWord = ""

msgRoot = MIMEMultipart()

vecRecv = []
vecCopy = []

def setUserName(self,userName):
self.MailServerUserName = userName

def setPassWord(self,passWord):
self.MailServerPassWord = passWord

def setFrom(self,name):
self.From = name

def setCharSet(self,CharSet):
self.charSet = CharSet

def AddRecipient(self,name):
self.vecRecv.append(name)

def AddRecipientCC(self,name):
self.vecCopy.append(name)

def SetSubject(self,subject):
self.msgRoot['Subject'] = subject

def AddBody(self,Text):
body = MIMEText(Text,'plain',self.charSet)
self.msgRoot.attach(body)




def AddAttachment(self,path):
ctype,encoding = mimetypes.guess_type(path)
if ctype is None or encoding is not None:
ctype='application/octet-stream'
maintype,subtype = ctype.split('/',1)

#att=MIMEImage(open(filename,'r').read(),subtype)
att=MIMEImage(open(path, 'rb').read(),subtype)
print ctype,encoding
att["Content-Disposition"] = 'attachmemt;filename="THS_alpha_20130718.exe"'
#msg.attach(att)
#part = MIMEBase('application', 'octet-stream')
#part.set_payload(open('E:\\xyp\\python小程序\\THS_alpha_20130718.rar','rb').read())
#Encoders.encode_base64(part)
#part.add_header('Content-Disposition', 'attachment; filename="THS_alpha_20130718.rar"')
#att = MIMEImage(open("E:\\xyp\\python小程序\\THS_alpha_20130718.rar",'rb').read(),'octet-stream')

#att = MIMEText(open('E:\\xyp\\python小程序\\新建文件夹.rar', 'rb').read(), 'base64', 'gb2312')
#att["Content-Type"] = 'application/octet-stream'
#att["Content-Disposition"] = 'attachment; filename="新建文件夹.rar"'
self.msgRoot.attach(att)
print path
# 读入文件内容并格式化,此处文件为当前目录下,也可指定目录 例如:open(r'/tmp/123.txt','rb')


## 设置附件头



def getStrFromList(self,lStr):
listLen=len(lStr)
resultStr=lStr[0]
i=1
while(i<listLen):
resultStr=resultStr+','+lStr[i]
i=i+1
return resultStr

def sendMail(self,stmpServer):
self.msgRoot['From']=self.From
self.msgRoot['To'] = self.getStrFromList(self.vecRecv)
#print self.msgRoot['To']
self.msgRoot['CC'] = self.getStrFromList(self.vecCopy)
smtp = smtplib.SMTP()
try:
smtp.connect(stmpServer)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.set_debuglevel(1)
self.vecRecv.extend(self.vecCopy)
smtp.login(self.MailServerUserName,self.MailServerPassWord)
smtp.sendmail(self.From,self.vecRecv,self.msgRoot.as_string())
#smtp.sendmail(self.From,self.vecCopy,self.msgRoot.as_string())

except Exception :
smtp.quit()
return str(e)
smtp.quit()
return 1;

import poplib
from email import parser
import base64
import types

class IPOP3Ptr:
pop_conn = 1
userName = ""
def Connect(self,userName,passWord,host):
self.pop_conn = poplib.POP3_SSL(host)
try:
self.pop_conn.user(userName)
self.userName = userName
self.pop_conn.pass_(passWord)
return 0
except poplib.error_proto:
return -1

messages = 1
def getMessages(self):
self.messages = [self.pop_conn.retr(i) for i in range(1, len(self.pop_conn.list()[1]) + 1)]
self.messages = ["\n".join(mssg[1]) for mssg in self.messages]
self.messages = [parser.Parser().parsestr(mssg) for mssg in self.messages]
return self.messages

def getStrFromBase64(self,str1):
if(type(str1) == types.NoneType):
return ""
str_decode = ['=?UTF-8?B?','=?utf-8?b?','=?GB2312?B?','=?gb2312?B?']
result=""
strLen = len(str1)
for strDecode in str_decode:
strDecodeLen = len(strDecode)
numNext = str1.find(strDecode)
if(numNext != -1):
while(numNext != -1):
result = result + str1[:numNext]
strTemp = str1[(strDecodeLen + numNext - strLen):]
numPre = strTemp.find('?=')
if(numPre != -1):
strTemp = strTemp[:(numPre+2)]
strTemp = base64.b64decode(strTemp)
result = result + strTemp
str1 = str1[(strDecodeLen + numNext+2+numPre):]
strLen = len(str1)
numNext = str1.find(strDecode)
return result

#截取
return str1

def getMsgFrom(self,num):
mailFrom = self.messages[num]['From']
mailFrom = self.getStrFromBase64(mailFrom)
return mailFrom

def getMsgSubject(self,num):
subject = self.messages[num]['Subject']
subject = self.getStrFromBase64(subject)
return subject

def getMsgBody(self,num):
for part in self.messages[num].walk():
contentType = part.get_content_type()
if contentType == 'text/plain':
data = part.get_payload(decode = True)
return data
def getMsgCount(self):
count = len(self.messages)
#print count
return count

def getMsgUID(self,num):
strTemp = self.userName+hex(num)+self.getMsgFrom(num)
UID = base64.encodestring(strTemp)
return UID

def deleteMsg(self,num):
self.pop_conn.dele(num+1)
self.getMsgCount()

def disConnect(self):
self.pop_conn.quit()


xu=IMessagePtr()
xu.setFrom("xuyapeng@myhexin.com")
xu.AddRecipient("xuyapeng@myhexin.com")

xu.AddRecipientCC("xuyapeng@myhexin.com")
xu.AddAttachment("E:\\xyp\\python小程序\\THS_alpha_20130718.exe")
xu.setCharSet("GB2312")
xu.SetSubject("classTest")
xu.AddBody("this is a test")
xu.setUserName("xuyapeng@myhexin.com")
xu.setPassWord("xuyapeng1991")
xu.sendMail("mail.myhexin.com")

mailPop = IPOP3Ptr()
mailPop.Connect('xuyapeng@myhexin.com','xuyapeng1991','mail.myhexin.com')
#mailPop.Connect('gonghuabin@myhexin.com','ghb2823320','mail.myhexin.com')
mailPop.getMessages()
mailPop.getMsgCount()
#mailPop.deleteMsg(0)
mailPop.disConnect()


各种方法均试过,都不行。跪求大神解答。
...全文
204 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
星域之外 2014-07-04
  • 打赏
  • 举报
回复
附件attach时,用MIMEbase,然后set_payload 比如下面这样试试 retval = email.mime.base.MIMEBase(maintype,subtype) retval.set_payload(fd.read()) email.encoders.encode_base64(retval) retval.add_header("Content-Disposition","attachment",filename = filename)
The_Third_Wave 2014-06-26
  • 打赏
  • 举报
回复
xu.AddAttachment("E:\\xyp\\python小程序\\THS_alpha_20130718.exe") 路径中文不太好吧?你确定是只发exe出问题?换个英文路径呢?换个其他后缀的文件,换个小文件先做下测试先。
xuyapeng1991 2014-06-26
  • 打赏
  • 举报
回复
木有人回复要我怎么结贴???
xuyapeng1991 2014-06-26
  • 打赏
  • 举报
回复
自己先顶一下。求大神解答。。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧