本帖最后由 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毕竟只能验证过程与原理.
|