本帖最后由 zhanzr21 于 2016-3-31 17:15 编辑
上文的理论知识过后, 动手验证邮件收发流程。事先试验过,板子上的python是2.7的,所以我也特地下载了python2.7在我的开发主机上。关于版本一定要注意。python3在桌面开发上成主流了。不过很多嵌入式环境都只支持python2的版本。为了开发效率,最好在桌面上也使用python2来开发验证,到了开发板就不会再来一次移植.关于python2, python3之间的恩怨差别等等,请参考这个连接:我就不详叙了。后面提到的python都是说的python2.
给纠结python2与python3的人看的连接
先来试验python发邮件, python就有一个smtplib管这事情的,所以相对简单,但是板子上面的python2缺少email这个package, 这个package用来管理email信息组织的。我采取了简单的解决方案:
直接把桌面python2的email相关的.py文件给copy到板子的/usr/lib/python2.7/路径,因为python的特点就是代码级别的跨平台。所以还真解决了我的问题。当然这不是解决问题的正确的方法,道德高尚的人应该重新编译内核才对。我暂且这么用着吧。参考的连接是:
Python smtplib 参考
上代码:
import smtplib
import time
from email.message import Message
from time import sleep
import email.utils
import base64
smtpserver='smtp-mail.outlook.com'
username='yourname@outlook.com'
password='password'
from_addr='from@from.com'
to_addr='b@qq.com'
cc_addr='a@foxmail.com'
time=email.utils.formatdate(time.time(),True)
message=Message()
message['Subject']='Mail Subject'
message['From']=from_addr
message['To']=to_addr
message['Cc']=cc_addr
message.set_payload('mail content'+time)
msg=message.as_string()
sm=smtplib.SMTP(smtpserver, port=587, timeout=20)
sm.set_debuglevel(1)
sm.ehlo()
#send: 'ehlo [127.0.1.1]\r\n'
#reply:b'250-BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\r\n'
#reply:b'250-TURN\r\n'
#reply:b'250-SIZE 41943040\r\n'
#reply:b'250-ETRN\r\n'
#reply:b'250-PIPELINING\r\n'
#reply:b'250-DSN\r\n'
#reply:b'250-ENHANCEDSTATUSCODES\r\n'
#reply:b'250-8bitmime\r\n'
#reply:b'250-BINARYMIME\r\n'
#reply:b'250-CHUNKING\r\n'
#reply:b'250-VRFY\r\n'
#reply:b'250-TLS\r\n'
#reply:b'250-STARTTLS\r\n'
#reply:b'250 OK\r\n'
#reply:retcode (250); Msg: b'BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK'
#(250, b'BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
sm.starttls()
#send: 'STARTTLS\r\n'
#reply:b'220 2.0.0 SMTP server ready\r\n'
#reply:retcode (220); Msg: b'2.0.0 SMTP server ready'
#(220, b'2.0.0 SMTP server ready')
sm.ehlo()
#send: 'ehlo [127.0.1.1]\r\n'
#reply:b'250-BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\r\n'
#reply:b'250-TURN\r\n'
#reply:b'250-SIZE 41943040\r\n'
#reply:b'250-ETRN\r\n'
#reply:b'250-PIPELINING\r\n'
#reply:b'250-DSN\r\n'
#reply:b'250-ENHANCEDSTATUSCODES\r\n'
#reply:b'250-8bitmime\r\n'
#reply:b'250-BINARYMIME\r\n'
#reply:b'250-CHUNKING\r\n'
#reply:b'250-VRFY\r\n'
#reply:b'250-AUTH LOGIN PLAIN XOAUTH2\r\n'
#reply:b'250 OK\r\n'
#reply:retcode (250); Msg: b'BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nAUTH LOGIN PLAIN XOAUTH2\nOK'
#(250, b'BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nAUTH LOGIN PLAIN XOAUTH2\nOK')
sm.login(username, password)
#send: 'AUTH PLAIN AGNldGVzdHNoaaaabbbbsb29rLmNvbQBpZGxlUFlUSE9O\r\n'
#reply:b'235 2.7.0 Authentication succeeded\r\n'
#reply:retcode (235); Msg: b'2.7.0 Authentication succeeded'
#(235, b'2.7.0 Authentication succeeded')
sm.sendmail(from_addr, to_addr, msg)
#send: 'mail FROM:<from@from.com> size=135\r\n'
#reply:b'250 2.1.0 from@from.com....Sender OK\r\n'
#reply:retcode (250); Msg: b'2.1.0 from@from.com....Sender OK'
#send: 'rcpt TO:<a@qq.com>\r\n'
#reply:b'250 2.1.5 d[url=home.php?mod=space&uid=752448]@qq.com[/url] \r\n'
#reply:retcode (250); Msg: b'2.1.5 b@qq.com'
#send: 'data\r\n'
#reply:b'354 Start mail input; end with <CRLF>.<CRLF>\r\n'
#reply:retcode (354); Msg: b'Start mail input; end with <CRLF>.<CRLF>'
#data: (354, b'Start mail input; end with <CRLF>.<CRLF>')
#send: b'Subject: Mail Subject\r\nFrom: from@from.com\r\nTo: ashi@qq.com\r\nCc: a@b.com\r\n\r\nmail contentSat, 27 Feb 2016 02:18:47 +0800\r\n.\r\n'
#reply:b'250 2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery\r\n'
#reply:retcode (250); Msg: b'2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery'
#data: (250, b'2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery')
#{}
sleep(5)
sm.quit()
#send: 'quit\r\n'
#reply:b'221 2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel\r\n'
#reply:retcode (221); Msg: b'2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel'
#(221, b'2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel')
注意用户名密码我修改了,你们要用得改成你们自己的。smtp的地址也的相应修改。
再来imap的收邮件, python中也有个package叫做imaplib
文档在python官网上找,imap的部分我参考了sina博客上面的一个同学的代码,但是现在搜索不到了,所以没法给连接了,代码中有他名字
代码分两部分:
checkMail.py
#-*- encoding: utf-8 -*-
#author : rayment
#CreateDate : 2012-06-24
import imaplib
import email
import InfoOutPut
import sys
reload(sys)
sys.setdefaultencoding('gbk')
def my_unicode(s, encoding):
if encoding:
return unicode(s, encoding)
else:
return unicode(s)
def checkMail(mailhost, accout, password):
con = imaplib.IMAP4_SSL(mailhost)
con.login(accout, password)
try:
con.select('INBOX', readonly=True)
flag, data = con.search(None, 'ALL')
InfoOutPut.initOutPut()
InfoOutPut.InfoOutPut('Accout : ' + accout)
for num in (data[0]).split(' '):
typ, msg_data = con.fetch(num, '(RFC822)')
InfoOutPut.InfoOutPut('No : ' + num)
for response_part in msg_data:
if isinstance(response_part, tuple):
msg = email.message_from_string(response_part[1])
ls = msg["From"].split(' ')
strfrom = ''
if(len(ls) == 2):
fromname = email.Header.decode_header((ls[0]).strip('\"'))
strfrom = 'From : ' + my_unicode(fromname[0][0], fromname[0][1]) + ls[1]
InfoOutPut.InfoOutPut(strfrom, 2)
else:
strfrom = 'From : ' + msg["From"]
InfoOutPut.InfoOutPut(strfrom, 2)
strdate = 'Date : ' + msg["Date"]
InfoOutPut.InfoOutPut(strdate, 2)
subject = email.Header.decode_header(msg["Subject"])
strsub = 'Subject : ' + my_unicode(subject[0][0], subject[0][1])
InfoOutPut.InfoOutPut(strsub)
finally:
try:
con.close()
except:
pass
con.**ut()
if __name__ == '__main__':
checkMail('imap-mail.outlook.com', 'yourname@outlook.com', 'password')
InfoOutput.py
#-*-coding:utf-8-*-
#author : rayment
#CreateDate : 2012-06-24
def initOutPut():
Border = "+----------------------------------------------------------------------------+"
print Border
def InfoOutPut(strparam, first = 0):
'''
Information input method
param: string
param: integer
'''
maxlen = 76
Border = "+----------------------------------------------------------------------------+"
Mark = "|"
if first == 1:
print "\n"
print Border
#count length of string,if it more than maxlen then break off it
strlen = len(strparam.encode('gbk'))
totallength = strlen
#print "strlen = %d"%strlen
if strlen > maxlen:
start = 0
end = maxlen
while(strlen > 0):
#print "start = %d"%start
#print "end = %d"%end
row = []
row.append(Mark)
row.append(strparam[start:end])
if strlen > maxlen:
start = start + maxlen
if (end + maxlen) > totallength:
end = totallength
else:
end = end + maxlen
else:
row.append(' ' * (maxlen - strlen))
start = start + strlen
end = end + strlen
#print "last start = %d"%start
#print "last end = %d"%end
row.append(Mark)
print ''.join(row)
strlen = strlen - maxlen
#print "current strlen= %d\n"%strlen
else:
newrow = []
newrow.append(Mark)
newrow.append(strparam)
newrow.append(' ' * (maxlen - strlen))
newrow.append(Mark)
print ''.join(newrow)
if first == 0 or first == 1:
print Border
if __name__ == '__main__':
'''
test unit
'''
str1 = "Account : xxxxxx@126.com"
str2 = "Account : xxxxx@163.com"
str3 = "From : xxxx@university.com"
str5 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaavvvvvvvvvvvvvvvvvvvvssssssssssssssssssccccccccccccccccccccc72rrrrrrrrrrrrrrrrrrrreeeeeeeeeeeeeeeeeeeeeeeejjjjjjjjjjjjjjjjjjjjjjjjjjjjjj5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0llllllllllluuouou"
str4 = "Date : 2012-6-24 13:00"
str6 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaav72rrrrrrrrrrrrrrrrrrrreeeeeee"
str7 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaav72rrrrrrrrrrrrrrrrrrrreeeeeee9ddddddpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp4"
initOutPut()
InfoOutPut(str6)
InfoOutPut(str7)
InfoOutPut(str5)
老规矩,用户名密码我隐去了。
这两个过程我都在host机器上搞通了。又下载到板子上运行通过了。除了上面年说的email缺失之外,host与开发板子上几乎无区别.
下一篇介绍交叉编译C语言程序的过程。python毕竟只能验证过程与原理. |