Python SMTP邮件及Web服务器编程

作者: EEboardMM
上传时间为: 2015-08-06 09:40 PM
2015-08-06
阅读:

本文经过作者同意并委托转载

地址:原文地址

1. 使用SMTP发送邮件

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

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

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

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

import smtplib

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


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

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

mailMsg =   "To: " + smtpDstAddr + "\n" + \
            "From: " + smtpSrcAddr + "\n" + \
            "Subject: " + mailSubject + "\n" + \
            "\n" + mailText + "\n"

#启动邮件发送流程,详见上文
print "Connecting to SMTP server %s (port: %d)..." %(smtpServer, smtpPort) 
mySMTP = smtplib.SMTP(smtpServer, smtpPort)
print "Starting transport layer security..."
mySMTP.starttls() # Transport layer security
print "Processing login..."
mySMTP.login(smtpSrcAddr, smtpPwd)
print "Sending the mail..."
mySMTP.sendmail(smtpSrcAddr, smtpDstAddr, mailMsg)
print "Closing STMP..."
mySMTP.close
print "All done!"

软件运行效果:

树莓派发送邮件

接收到的邮件


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

2.1 创建一个简单的Web Server
Python自带了CGI HTTP Server指令,可以通过一条命令快速启动HTTP服务器。

<HTML>
<HEAD><TITLE>Simple Test Page</TITLE></HEAD>
<BODY>Hello Raspberry Pi!</BODY>
</HTML>

其中8000为服务器的端口号,当服务器运行后,可以在树莓派上通过http://127.0.0.1:8000
地址访问服务器,或者在别的设备上输入树莓派的IP地址和端口号。
但是这时我们还不能访问网站,因为网站缺少一个主页。默认的主页文件为index.htm或者.html。新建index.htm文件并输入如下内容:

<HTML>
<HEAD><TITLE>Simple Test Page</TITLE></HEAD>
<BODY>Hello Raspberry Pi!</BODY>
</HTML>

就是一个由HTML语言写成的简单主页,<TITLE>…</TITLE>部分的文字会显示在浏览器标题栏,<BODY>… </BODY>部分则显示了网页的页面内容。

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

通过Python启动CGI HTTP Server

访问树莓派Web Server


另外,除了使用CGIHTTPServer指令,我们还可以通过Python代码来创建服务器,下面的代码实现了相同的功能。

#!/usr/bin/env python
import BaseHTTPServer
import CGIHTTPServer

server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler

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

httpd = server(server_address, handler)
httpd.serve_forever()

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

同时,在cgi-bin目录下新建一个名为led_ctrl.py的Python文件,其代码如下:

#!/usr/bin/env python
import sys
import os
import wiringpi

os.system("gpio export 11 out")

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

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

print"Content-Type: text/html"
print"""
<HEAD><TITLE>LED Control</TITLE></HEAD>
<BODY>%s</BODY>
"""%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所在目录运行指令启动服务器。

$ chmod 755 ./cgi-bin/led_ctrl.py
$ python -m CGIHTTPServer 8000

在浏览器中输入led_ctrl程序的位置和参数,即可实现对LED的远程控制。

<a href="http://192.168.0.28:8000/cgi-bin/led_ctrl.py?1">http://192.168.0.28:8000/cgi-bin/led_ctrl.py?1</a>

远程调用Python程序

2.3 网页控制GPIO
实现了Web服务器和远程调用Python程序后,我们就可以把二者结合起来,通过网页上的按钮控制GPIO。
修改index.htm文件,向其中添加如下内容:

<HTML>
<HEAD>
<SCRIPT language="javaScript">
function LED_On()
{
webpage = "./cgi-bin/led_ctrl.py?1"
window.open(webpage, "Window1","height=40,width=250,top=120,left=100");
}
function LED_Off()
{
webpage = "./cgi-bin/led_ctrl.py?0"
window.open(webpage,"Window1","height=40,width=250,top=120,left=100");
}
</SCRIPT>
<TITLE>LED Test Page</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE = "+2">Press button to control the LEDs!</FONT></P>
<P><INPUT NAME="name" TYPE="submit" VALUE="ON">   <INPUT NAME="name" TYPE="submit" VALUE="OFF"></P>
</BODY>
</HTML>

页面中添加了两个按钮ON和OFF,并通过JavaScript定义了按钮按下时执行的操作——以新网页窗口的形式打开“./cgi-bin/led_ctrl.py”文件,并赋予不同的参数。

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

网页控制LED

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示