使用 Python 进行 socket 编程(7)

httplib (HTTP 客户机)

HTTP 客户机接口在开发 Web 机器人或其他流 socket 时非常有用。Web 协议本质上是通过流 socket 进行请求/响应的。Python通过一个简单的 Web 接口来简化构建 Web 机器人的过程。

清单25 展示了 httplib 模块的用法。使用HTTPConnection 创建了一个 HTTP 的实例,这里需要提供想要连接的 Web 站点。使用这个新对象(httpconn),可以使用request 方法来请求文件。在 request 方法中,可以指定 HTTP GET 方法(从服务器上请求一个文件,而HEAD 只简单地获取有关这个文件的信息)。getresponse 方法会对HTTP 响应头进行解析,从而了解是否碰到了错误。如果成功地接收到了这个文件,那么这个新响应对象的 read 方法就返回并打印一条文本信息。

清单 25. 使用 httplib 构建一个简单的 HTTP 客户机

import httplib

httpconn = httplib.HTTPConnection("www-130.ibm.com")

httpconn.request("GET", "/developerworks/index.html")

resp = httpconn.getresponse()

if resp.reason == "OK":

  resp_data = resp.read()

  print resp_data

httpconn.close()

 

smptlib(SMTP 客户机)

SMTP 让您可以发送 e-mail 消息到一台邮件服务器上,这对于在网络系统中传递有关设备操作的状态非常有用。发送 e-mail 的 Python 模块非常简单,包括创建一个 SMTP 对象,使用 sendmail 方法发送一条 e-mail 消息,然后使用 quit 方法关闭这个连接。

清单26 中的例子展示了发送一个简单 e-mail 消息的方法。msg 字符串中包含了邮件的主体(它应该包含主题行)。

清单 26. 使用 smtplib 发送一条简短的 e-mail 消息

import smtplib

fromAdrs = 'mtj@mtjones.com'

toAdrs = 'you@mail.com'

msg = 'From: me@mail.com\r\nTo: you@mail.com\r\nSubject:Hello\r\nHi!\r\n'

mailClient = smtplib.SMTP('192.168.1.1')

mailClient.sendmail( fromAdrs, toAdrs, msg )

mailClient.quit                             

 

poplib(POP3 客户机)

POP3 是另外一个非常有用的应用层协议,在 Python 中也有一个这种模块。POP3 协议让您可以连接到一个邮件服务器上,并下载新的邮件,这对于远程命令来说非常有用—— 可以在 e-mail 消息的正文中嵌入命令。在执行嵌入的命令之后,可以使用 smptlib 向源返回一条 e-mail 消息。

清单27 展示了一个简单的应用程序,它连接到一台邮件服务器上,并为这个用户打印所有未读的 e-mail 的主题行。

poplib 相当简单,但是它为在服务器上搜集和管理 e-mail 提供了几种方法。在这个例子中,我们使用 POP3 方法创建了一个新的 POP3 对象,这个方法要指定邮件服务器。user 和 pass_ 方法将向服务器验证应用程序;stat 方法返回等待用户阅读的邮件的数目,以及所有消息的总字节数。

接下来,我们遍历每条可用消息,并使用 retr 方法来提取下一条 e-mail 消息。这个方法会返回这样一个列表:

(response,['line, ...], octets)

其中 response 是对某条消息的 POP3 响应,line list 表示 e-mail 消息的行号,最后一个元素 octets 是这条 e-mail 消息的字节数。内部循环简单地遍历 e-mail 消息正文列表的第二个元素([1])。对于每一行,我们测试是否存在 'Subject:' ;如果存在,就打印这一行的内容。

在检查完所有的 e-mail 消息之后,就可以调用 quit 方法结束 POP3 会话。

如果不使用 retr 方法,还应该可以使用 top 方法提取 e-mail 消息的头信息。这个步骤可能速度更快,可以将需要传输到客户机的数据量降低至最少。

清单 27. 从 POP3 邮件服务器上接收e-mail 消息,并打印主题行的信息

import poplib

import re

popClient = poplib.POP3('192.168.1.1')

popClient.user('user')

popClient.pass_('password')

numMsgs, mboxSize = popClient.stat()

print "Number of messages ", numMsgs

print "Mailbox size", mboxSize

print

for id in range (numMsgs):

  for mail in popClient.retr(id+1)[1]:

    if re.search( 'Subject:', mail ):

      print mail

  print

popClient.quit()

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgggx.html