关于python的两个难题
有两个问题不知如何解决。
一、ftp编程时,如何返回ftp server上的目录列表?
二、发送mail时,smtp服务器要验证,该如何写代码发送邮件?
python虽然大家吹捧的挺厉害,但是我想可能就是跨平台、web编程稍微好一点,功能也并不十分强大,win平台下做什么事情的话,还是delphi来一下,感觉更爽。
[解决办法]
第一个很简单就不用说了,
第二个看我自己写的代码:
#************************************
#SMTP operation
#************************************
def smtpinit(self, sname, user, passwd, port = 25):
self.smtpsname = sname
self.smtpuser = user
self.smtppasswd = passwd
self.smtpport = port
def _smtpconnect(self):
self.smtpserver = smtplib.SMTP(self.smtpsname)
self.smtpserver.login(self.smtpuser,self.smtppasswd)
def smtpmailconfig(self, mto, mfrom, mheader, mmsg, msub, mcharset= 'utf8 ', mtype= 'plain ', mafile= ' '):
self.mailto = mto
self.mailfrom = mfrom
self.mailheader = mheader
self.mailmsg = mmsg
self.mailsub = msub
self.mailcharset = mcharset
self.mailtpye = mtype
self.mailafile = mafile
def smtpsend(self):
outer = MIMEMultipart()
#msg=email.Message.Message() #一个实例
outer[ 'Date ']=time.ctime() #时间日期
#outer[ 'To ']=COMMASPACE.join(To) #发送到哪里
outer[ 'To ']=self.mailto #发送到哪里
outer[ 'From ']=self.mailfrom #自己的邮件地址
#outer[ 'Subject ']=email.Header.Header( 'python_email_测试 ', 'gb2312 ')
outer[ 'Subject ']=email.Header.Header(self.mailheader,self.mailcharset)
#in testing***********************************
outer.preamble = 'You will not see this in a MIME-aware mail reader.\n '
outer.epilogue = ' '
#*********************************************
#msg=MIMEText( '******************邮件内容测试 ',_subtype= 'plain ',_charset= 'utf8 ')
msg=MIMEText(self.mailmsg, _subtype=self.mailtpye, _charset=self.mailcharset)
outer.attach(msg)
#如果有附件则添加附件
if self.mailafile != ' ':
ctype, encoding = mimetypes.guess_type(self.mailafile)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream '
maintype, subtype = ctype.split( '/ ', 1)
# msg=MIMEText(open( 'D:\work\linsoft\project\python_mail\python_mail.py ', 'r ').read(),_subtype=subtype)
msg=MIMEText(open(self.mailafile, 'rb ').read(),_subtype= 'base64 ', _charset=self.mailcharset)
# Encoders.encode_base64(msg)
# msg.replace_header( 'Content-type ', 'application/txt;name= "python_mail.py " ')
rheader = 'application/ '+subtype+ ';name= " '+os.path.basename(self.mailafile)+ ' " '
msg.replace_header( 'Content-type ',rheader)
# msg.add_header( 'Content-type ', 'attachment;name= "python_mail.py " ')
aheader = 'attachment;name= " '+os.path.basename(self.mailafile)+ ' " '
msg.add_header( 'Content-type ',aheader)
if self.debuglevel > 0: print 'ctype= ',ctype
if self.debuglevel > 0: print 'subtype= ',subtype
if self.debuglevel > 0: print 'header= ',rheader
if self.debuglevel > 0: print 'aheader= ',aheader
if self.debuglevel > 0: print 'msg= ',msg
outer.attach(msg)
self.smtpserver=smtplib.SMTP(self.smtpsname) #你发送服务器的地址
self.smtpserver.login(self.smtpuser, self.smtppasswd) #用户名和密码
# server.sendmail(self.mailfrom,self.mailto,msg.as_string()+body.as_string())
self.smtpserver.sendmail(self.mailfrom,self.mailto,outer.as_string())
if self.debuglevel > 0: print outer.as_string()
[解决办法]
首先建议参看ESMTP的RFC文档,或者参看一本叫做《Internet Email编程》的书。
在已知mail服务器需要验证的前提下,如下:
import smtplib
server = smptlib.SMTP( "smpt.sohu.com ")
server.ehlo()
server.login( "username ", "password ")
ehlo方法的调用是可选的,如果在调用login方法之前没有调用ehlo,那么login会替你完成此项工作。ehlo方法的返回值包含mail服务器对ehlo命令的相应文本,从中能够判断出mail服务器是否需要登录验证。