[活动] 【项目挑战】Offline Email Box贴子之二 使用python脚本验证收...

[复制链接]
 楼主| zhanzr21 发表于 2016-3-31 16:08 | 显示全部楼层 |阅读模式
本帖最后由 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 参考
上代码:
  1. import smtplib
  2. import time
  3. from email.message import Message
  4. from time import sleep
  5. import email.utils
  6. import base64

  7. smtpserver='smtp-mail.outlook.com'
  8. username='yourname@outlook.com'
  9. password='password'
  10. from_addr='from@from.com'
  11. to_addr='b@qq.com'
  12. cc_addr='a@foxmail.com'

  13. time=email.utils.formatdate(time.time(),True)

  14. message=Message()
  15. message['Subject']='Mail Subject'
  16. message['From']=from_addr
  17. message['To']=to_addr
  18. message['Cc']=cc_addr
  19. message.set_payload('mail content'+time)
  20. msg=message.as_string()

  21. sm=smtplib.SMTP(smtpserver, port=587, timeout=20)
  22. sm.set_debuglevel(1)

  23. sm.ehlo()
  24. #send: 'ehlo [127.0.1.1]\r\n'
  25. #reply:b'250-BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\r\n'
  26. #reply:b'250-TURN\r\n'
  27. #reply:b'250-SIZE 41943040\r\n'
  28. #reply:b'250-ETRN\r\n'
  29. #reply:b'250-PIPELINING\r\n'
  30. #reply:b'250-DSN\r\n'
  31. #reply:b'250-ENHANCEDSTATUSCODES\r\n'
  32. #reply:b'250-8bitmime\r\n'
  33. #reply:b'250-BINARYMIME\r\n'
  34. #reply:b'250-CHUNKING\r\n'
  35. #reply:b'250-VRFY\r\n'
  36. #reply:b'250-TLS\r\n'
  37. #reply:b'250-STARTTLS\r\n'
  38. #reply:b'250 OK\r\n'
  39. #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'
  40. #(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')
  41. sm.starttls()
  42. #send: 'STARTTLS\r\n'
  43. #reply:b'220 2.0.0 SMTP server ready\r\n'
  44. #reply:retcode (220); Msg: b'2.0.0 SMTP server ready'
  45. #(220, b'2.0.0 SMTP server ready')
  46. sm.ehlo()
  47. #send: 'ehlo [127.0.1.1]\r\n'
  48. #reply:b'250-BLU436-SMTP196.smtp.hotmail.com Hello [171.43.226.36]\r\n'
  49. #reply:b'250-TURN\r\n'
  50. #reply:b'250-SIZE 41943040\r\n'
  51. #reply:b'250-ETRN\r\n'
  52. #reply:b'250-PIPELINING\r\n'
  53. #reply:b'250-DSN\r\n'
  54. #reply:b'250-ENHANCEDSTATUSCODES\r\n'
  55. #reply:b'250-8bitmime\r\n'
  56. #reply:b'250-BINARYMIME\r\n'
  57. #reply:b'250-CHUNKING\r\n'
  58. #reply:b'250-VRFY\r\n'
  59. #reply:b'250-AUTH LOGIN PLAIN XOAUTH2\r\n'
  60. #reply:b'250 OK\r\n'
  61. #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'
  62. #(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')
  63. sm.login(username, password)
  64. #send: 'AUTH PLAIN AGNldGVzdHNoaaaabbbbsb29rLmNvbQBpZGxlUFlUSE9O\r\n'
  65. #reply:b'235 2.7.0 Authentication succeeded\r\n'
  66. #reply:retcode (235); Msg: b'2.7.0 Authentication succeeded'
  67. #(235, b'2.7.0 Authentication succeeded')
  68. sm.sendmail(from_addr, to_addr, msg)
  69. #send: 'mail FROM:<from@from.com> size=135\r\n'
  70. #reply:b'250 2.1.0 from@from.com....Sender OK\r\n'
  71. #reply:retcode (250); Msg: b'2.1.0 from@from.com....Sender OK'
  72. #send: 'rcpt TO:<a@qq.com>\r\n'
  73. #reply:b'250 2.1.5 d[url=home.php?mod=space&uid=752448]@qq.com[/url] \r\n'
  74. #reply:retcode (250); Msg: b'2.1.5 b@qq.com'
  75. #send: 'data\r\n'
  76. #reply:b'354 Start mail input; end with <CRLF>.<CRLF>\r\n'
  77. #reply:retcode (354); Msg: b'Start mail input; end with <CRLF>.<CRLF>'
  78. #data: (354, b'Start mail input; end with <CRLF>.<CRLF>')
  79. #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'
  80. #reply:b'250 2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery\r\n'
  81. #reply:retcode (250); Msg: b'2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery'
  82. #data: (250, b'2.6.0 <BLU436-SMTP196pH71y00000fb9@BLU436-SMTP196.smtp.hotmail.com> Queued mail for delivery')
  83. #{}
  84. sleep(5)

  85. sm.quit()
  86. #send: 'quit\r\n'
  87. #reply:b'221 2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel\r\n'
  88. #reply:retcode (221); Msg: b'2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel'
  89. #(221, b'2.0.0 BLU436-SMTP196.smtp.hotmail.com Service closing transmission channel')



注意用户名密码我修改了,你们要用得改成你们自己的。smtp的地址也的相应修改。

再来imap的收邮件, python中也有个package叫做imaplib
文档在python官网上找,imap的部分我参考了sina博客上面的一个同学的代码,但是现在搜索不到了,所以没法给连接了,代码中有他名字
代码分两部分:
checkMail.py
  1. #-*- encoding: utf-8 -*-
  2. #author : rayment
  3. #CreateDate : 2012-06-24
  4. import imaplib
  5. import email
  6. import InfoOutPut

  7. import sys
  8. reload(sys)
  9. sys.setdefaultencoding('gbk')


  10. def my_unicode(s, encoding):
  11.     if encoding:
  12.         return unicode(s, encoding)
  13.     else:
  14.         return unicode(s)


  15. def checkMail(mailhost, accout, password):
  16.     con = imaplib.IMAP4_SSL(mailhost)
  17.     con.login(accout, password)
  18.     try:
  19.         con.select('INBOX', readonly=True)
  20.         flag, data = con.search(None, 'ALL')
  21.         InfoOutPut.initOutPut()
  22.         InfoOutPut.InfoOutPut('Accout : ' + accout)
  23.         for num in (data[0]).split(' '):
  24.             typ, msg_data = con.fetch(num, '(RFC822)')
  25.             InfoOutPut.InfoOutPut('No : ' + num)
  26.             for response_part in msg_data:
  27.                 if isinstance(response_part, tuple):
  28.                     msg = email.message_from_string(response_part[1])
  29.                     ls = msg["From"].split(' ')
  30.                     strfrom = ''
  31.                     if(len(ls) == 2):
  32.                         fromname = email.Header.decode_header((ls[0]).strip('"'))
  33.                         strfrom = 'From : ' + my_unicode(fromname[0][0], fromname[0][1]) + ls[1]
  34.                         InfoOutPut.InfoOutPut(strfrom, 2)
  35.                     else:
  36.                         strfrom = 'From : ' + msg["From"]
  37.                         InfoOutPut.InfoOutPut(strfrom, 2)
  38.                     strdate = 'Date : ' + msg["Date"]
  39.                     InfoOutPut.InfoOutPut(strdate, 2)
  40.                     subject = email.Header.decode_header(msg["Subject"])
  41.                     strsub = 'Subject : ' + my_unicode(subject[0][0], subject[0][1])
  42.                     InfoOutPut.InfoOutPut(strsub)      
  43.     finally:
  44.         try:
  45.             con.close()
  46.         except:
  47.             pass
  48.         con.**ut()

  49. if __name__ == '__main__':
  50.     checkMail('imap-mail.outlook.com', 'yourname@outlook.com', 'password')

InfoOutput.py
  1. #-*-coding:utf-8-*-
  2. #author : rayment
  3. #CreateDate : 2012-06-24


  4. def initOutPut():
  5.     Border = "+----------------------------------------------------------------------------+"
  6.     print Border


  7. def InfoOutPut(strparam, first = 0):
  8.     '''
  9.        Information input method
  10.        param: string
  11.        param: integer
  12.     '''
  13.     maxlen = 76
  14.     Border = "+----------------------------------------------------------------------------+"
  15.     Mark = "|"
  16.     if first == 1:
  17.         print "\n"
  18.         print Border

  19.     #count length of string,if it more than maxlen then break off it
  20.     strlen = len(strparam.encode('gbk'))
  21.     totallength = strlen
  22.     #print "strlen = %d"%strlen
  23.     if strlen > maxlen:
  24.         start = 0
  25.         end = maxlen

  26.         while(strlen > 0):
  27.             #print "start = %d"%start
  28.             #print "end = %d"%end
  29.             
  30.             row = []
  31.             row.append(Mark)
  32.             row.append(strparam[start:end])

  33.             if strlen > maxlen:
  34.                 start = start + maxlen
  35.                 if (end + maxlen) > totallength:
  36.                     end = totallength
  37.                 else:
  38.                     end = end + maxlen
  39.             else:
  40.                 row.append(' ' * (maxlen - strlen))
  41.                 start = start + strlen
  42.                 end = end + strlen
  43.                 #print "last start = %d"%start
  44.                 #print "last end = %d"%end
  45.                
  46.             row.append(Mark)
  47.             print ''.join(row)
  48.             strlen = strlen - maxlen
  49.             #print "current strlen= %d\n"%strlen
  50.                
  51.     else:
  52.         newrow = []
  53.         newrow.append(Mark)
  54.         newrow.append(strparam)
  55.         newrow.append(' ' * (maxlen - strlen))
  56.         newrow.append(Mark)
  57.         print ''.join(newrow)

  58.     if first == 0 or first == 1:
  59.         print Border
  60.    
  61.    
  62. if __name__ == '__main__':
  63.     '''
  64.        test unit
  65.     '''
  66.     str1 = "Account : xxxxxx@126.com"
  67.     str2 = "Account : xxxxx@163.com"
  68.     str3 = "From : xxxx@university.com"
  69.     str5 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaavvvvvvvvvvvvvvvvvvvvssssssssssssssssssccccccccccccccccccccc72rrrrrrrrrrrrrrrrrrrreeeeeeeeeeeeeeeeeeeeeeeejjjjjjjjjjjjjjjjjjjjjjjjjjjjjj5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0llllllllllluuouou"
  70.     str4 = "Date : 2012-6-24 13:00"
  71.     str6 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaav72rrrrrrrrrrrrrrrrrrrreeeeeee"
  72.     str7 = "Subject : begina1a2a3a4a5a6a7yyyyyyyyyyyyyddddddddddddddddddddddddddyyyyyyy8aaaaaaaaaaaaaaaav72rrrrrrrrrrrrrrrrrrrreeeeeee9ddddddpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp4"
  73.     initOutPut()
  74.     InfoOutPut(str6)
  75.     InfoOutPut(str7)
  76.     InfoOutPut(str5)

老规矩,用户名密码我隐去了。

这两个过程我都在host机器上搞通了。又下载到板子上运行通过了。除了上面年说的email缺失之外,host与开发板子上几乎无区别.

下一篇介绍交叉编译C语言程序的过程。python毕竟只能验证过程与原理.
 楼主| zhanzr21 发表于 2016-4-27 23:17 | 显示全部楼层
太好了 學習了
cnb12345 发表于 2016-4-29 12:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

1017

帖子

34

粉丝
快速回复 在线客服 返回列表 返回顶部

91

主题

1017

帖子

34

粉丝
快速回复 在线客服 返回列表 返回顶部