查看: 5154|回复: 2

【懒兔子玩树莓】Python SMTP邮件及Web服务器编程

[复制链接]
  • TA的每日心情
    无聊
    2015-8-17 09:38
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-23 15:13:34 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 懒兔子 于 2015-5-30 15:07 编辑

    1. 使用SMTP发送邮件
    SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议,通过该协议可以用简短的代码完成邮件的接收和发送。Python提供了smtplib库来进行SMTP操作,下面就是一个SMTP发送邮件的例子。
    我们首先要准备好一些邮件必要的信息,如接收方的地址。另外由于邮件发送本身还是由邮件服务器完成的,因此需要邮件服务器的地址和账号、密码。

    这里采用Gmail邮箱来发送邮件,用户名为sender@gmail.com,密码是123456。Gmail的SMTP服务器地址为smtp.gmail.com,端口号为587,使用TLS安全协议(其他常用的邮箱可以在运行商网站上查询,使用不同的安全协议,端口号可能有所不同)。

    而邮件的内容则由纯文本构成,包含标题、正文、收发件人的地址等。

    发送邮件的基本流程为:连接SMTP服务器 -> 开启安全协议并登录 -> 发送邮件 -> 结束。
    1. import smtplib

    2. #设置收件人、发件人
    3. smtpDstAddr = "receiver@163.com"
    4. smtpSrcAddr = "sender@gmail.com"

    5. #设置SMTP服务器信息
    6. smtpServer = "smtp.gmail.com"
    7. smtpPwd = "123456"
    8. smtpPort = 587

    9. #构建邮件内容
    10. mailSubject = "Raspberry Pi SMTP"
    11. mailText = "This is a test mail from a RABBIT!"

    12. mailMsg =   "To: " + smtpDstAddr + "\n" + \
    13.             "From: " + smtpSrcAddr + "\n" + \
    14.             "Subject: " + mailSubject + "\n" + \
    15.             "\n" + mailText + "\n"

    16. #启动邮件发送流程,详见上文
    17. print "Connecting to SMTP server %s (port: %d)..." %(smtpServer, smtpPort)
    18. mySMTP = smtplib.SMTP(smtpServer, smtpPort)
    19. print "Starting transport layer security..."
    20. mySMTP.starttls() # Transport layer security
    21. print "Processing login..."
    22. mySMTP.login(smtpSrcAddr, smtpPwd)
    23. print "Sending the mail..."
    24. mySMTP.sendmail(smtpSrcAddr, smtpDstAddr, mailMsg)
    25. print "Closing STMP..."
    26. mySMTP.close
    27. print "All done!"
    复制代码
    软件运行效果:


    树莓派发送邮件



    接收到的邮件


    2. Web Server编程
    Web Server是基于HTTP协议的网页服务器,它接收用户的HTTP请求并传回用户需要的数据。通过建立Web服务器可以丰富树莓派的操作接口,在任何地点、任何设备上访问并操作树莓派。
    虽然网络上有各种功能强大的开源Web服务器,但是我们有时候希望能够把HTTP服务加入到自己的程序里来,并通过CGI实现更灵活的交互。

    2.1 创建一个简单的Web Server
    Python自带了CGI HTTP Server指令,可以通过一条命令快速启动HTTP服务器。
    1. $ python -m CGIHTTPServer 8000
    复制代码
    其中8000为服务器的端口号,当服务器运行后,可以在树莓派上通过http://127.0.0.1:8000
    地址访问服务器,或者在别的设备上输入树莓派的IP地址和端口号。
    但是这时我们还不能访问网站,因为网站缺少一个主页。默认的主页文件为index.htm或者.html。新建index.htm文件并输入如下内容:
    1. <HTML>
    2. <HEAD><TITLE>Simple Test Page</TITLE></HEAD>
    3. <BODY>Hello Raspberry Pi!</BODY>
    4. </HTML>
    复制代码
    这就是一个由HTML语言写成的简单主页,<TITLE>…</TITLE>部分的文字会显示在浏览器标题栏,<BODY>… </BODY>部分则显示了网页的页面内容。

    在index.htm文件所在目录下运行启动server的命令,即可通过浏览器访问网站了。Web服务器实际是根据用户的请求,将HTML文件中的内容以纯文本的形式(人家叫超文本_)传送给浏览器,浏览器再把这段文本解析成网页展现给用户。


    通过Python启动CGI HTTP Server



    访问树莓派Web Server


    另外,除了使用CGIHTTPServer指令,我们还可以通过Python代码来创建服务器,下面的代码实现了相同的功能。
    1. #!/usr/bin/env python
    2. import BaseHTTPServer
    3. import CGIHTTPServer

    4. server = BaseHTTPServer.HTTPServer
    5. handler = CGIHTTPServer.CGIHTTPRequestHandler

    6. server_address = ("", 8000)
    7. handler.cgi_directories = [""]

    8. httpd = server(server_address, handler)
    9. httpd.serve_forever()
    复制代码
    2.2 通过CGI远程执行代码
    在index.htm文件的相同目录下新建一个cgi-bin目录。上一节代码中的handler.cgi_directories就指定了CGI目录,如果不进行指定,默认执行目录就是cgi-bin。

    同时,在cgi-bin目录下新建一个名为led_ctrl.py的Python文件,其代码如下:
    1. #!/usr/bin/env python
    2. import sys
    3. import os
    4. import wiringpi

    5. os.system("gpio export 11 out")

    6. io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_SYS)
    7. io.pinMode(11,io.OUTPUT)

    8. Command = int(sys.argv[1])
    9. if Command == 1:
    10. Result = "LED is ON!"
    11. io.digitalWrite(11,io.LOW)
    12. else:
    13. Result = "LED is OFF!"
    14. io.digitalWrite(11,io.HIGH)

    15. print"Content-Type: text/html"
    16. print"""
    17. <HEAD><TITLE>LED Control</TITLE></HEAD>
    18. <BODY>%s</BODY>
    19. """%Result
    复制代码
    没错,这就是一个简单的LED控制程序。与其他使用wiringPi的Python程序一样,因为使用了WPI_MODE_SYS模式初始化,因此需要对GPIO进行export操作。os.system("gpio export 11 out")相当于在Linux Shell里敲了gpio export 11 out这么一行命令。sys.argv[1]参数代表执行程序时后面跟的第一个参数(sys.argv[0]表示执行程序的命令本身),参数控制了LED的亮灭。不同的是,程序的最后会使用print将LED的状态转换成一个简单的网页显示出来。

    修改Python文件的可执行属性,然后在index.htm所在目录运行指令启动服务器。
    1. $ chmod 755 ./cgi-bin/led_ctrl.py
    2. $ python -m CGIHTTPServer 8000
    复制代码
    在浏览器中输入led_ctrl程序的位置和参数,即可实现对LED的远程控制。
    1. http://192.168.0.28:8000/cgi-bin/led_ctrl.py?1
    复制代码
    远程调用Python程序


    2.3 网页控制GPIO
    实现了Web服务器和远程调用Python程序后,我们就可以把二者结合起来,通过网页上的按钮控制GPIO。
    修改index.htm文件,向其中添加如下内容:
    1. <HTML>
    2. <HEAD>
    3. <SCRIPT language="javaScript">
    4. function LED_On()
    5. {
    6. webpage = "./cgi-bin/led_ctrl.py?1"
    7. window.open(webpage, "Window1","height=40,width=250,top=120,left=100");
    8. }
    9. function LED_Off()
    10. {
    11. webpage = "./cgi-bin/led_ctrl.py?0"
    12. window.open(webpage,"Window1","height=40,width=250,top=120,left=100");
    13. }
    14. </SCRIPT>
    15. <TITLE>LED Test Page</TITLE>
    16. </HEAD>
    17. <BODY>
    18. <P><FONT SIZE = "+2">Press button to control the LEDs!</FONT></P>
    19. <P><INPUT NAME="name" TYPE="submit" VALUE="ON">   <INPUT NAME="name" TYPE="submit" VALUE="OFF"></P>
    20. </BODY>
    21. </HTML>
    复制代码
    页面中添加了两个按钮ON和OFF,并通过JavaScript定义了按钮按下时执行的操作——以新网页窗口的形式打开“./cgi-bin/led_ctrl.py”文件,并赋予不同的参数。

    编辑完成后,保存并运行Server。通过按下ON/OFF按钮,就可以实现LED的状态控制了。其效果如图所示:


    网页控制LED


    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-5-29 17:30
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-3-26 11:58:25 | 显示全部楼层
    cool,巨爱python。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-14 13:50:14 | 显示全部楼层
    楼主能不能讲点WEB客户端编程的。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 15:04 , Processed in 0.118225 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.