博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 读取邮件
阅读量:5328 次
发布时间:2019-06-14

本文共 3270 字,大约阅读时间需要 10 分钟。

读取邮件向imaplib 传递一个消息ID的列表。为了提取的是邮箱的主题,将字符串(BODY[HEADER.FIELDS(SUBJECT)]) 作为参数传递给imaplib

1 from imaplib import IMAP4 2  3 class SubjectLister(IMAP4): 4     def __init__(self, server, username, password): 5         IMAP4.__init__(self, server) 6         self.login(username, password) 7  8     def summarize(self, mailbox='cxiaoln'): 9         numberOfMessages = int(self._result(self.select(mailbox)))10         print ('%s message(s) in mailbox "%s":'%(numberOfMessages, mailbox))11         subjects = self._result(self.fetch('1:%d'% numberOfMessages, '(BODY[HEADER.FIELDS (SUBJECT)])'))12         for subject in subjects:13             if hasattr(subject, '__iter__'):14                 subject = subject[1]15                 print('', subject[:subject.find('\n')])16 17     def _result(self, result):18         status, result = result19         if status != 'OK':20             raise status(result)21         if len(result) == 1:22             result = result[0]23         return result24 25 if __name__ == '__main__':26     lister = SubjectLister('imap.163.com', 'user', 'password')27     lister.summarize()
View Code

这里的第一件事就是完成服务器的链接,然后选择邮箱中的文件夹。

由于同步的问题,这里减少了风险:self.fetch('1:%d'% numberOfMessages, '(BODY[HEADER.FIELDS (SUBJECT)])')

 

使用唯一ID提取消息

imap = imaplib.IMAP4('imap.163.com')

imap.login('username', 'password')

imap.select('cxiaoln')[1][0] # 选择邮箱中的文件夹 并返回文件夹中有多少邮件

uids = imap.uid('SEARCH', 'ALL') # 读取cxiaoln文件夹中的所有uid

uids = uids[1][0].split(' ') #将返回的('OK', ['1331738237 1331738238 1331738239'])的第二部分将通过空格分隔出3个uid

messageText = imap.uid('FETCH', uids[0], '(RFC822)'[1][0][1]) #读取uids[0]对应的邮件

 

总共四个步骤:1、连接服务器 2、选择邮箱中的文件夹 3、运行SEARCH指令,读取该文件夹的ID

4、通过FETCH指令获取邮箱的实际消息

 

使用IMAP4_SSL替换IAMP4,端口不是23 而是995

 

使用简单的socket 编程

import socketimport sysif len (sys.argv) < 3:    print ('host port')    sys.exit(1)hostname = sys.argv[1]port = int(sys.argv[2])sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.bind((hostname, port))sock.listen(1)print ('Waitiing for a request')request, clientAddress = sock.accept()print ('Received request from', clientAddress)request.send("xiaoln") #bytes('-=supersimpleSocketServer 3000=-\n', 'utf-8')request.send("exit") #bytes('Go away!\n', 'utf-8')request.shutdown(2)print("have handled request, stopping server.")socket.close()
View Code

在这里只是最简单的操作,也是socket中一种最简单的操作

1、sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #设置sock选项

sock.bind((hostname, port)) 绑定地址和端口号

sock.listen(1)  监听一个连接

request, clientAddress = sock.accept() 阻塞等待客户端的连接

request.send("xiaoln") #bytes('-=supersimpleSocketServer 3000=-\n', 'utf-8')

request.send("exit") #bytes('Go away!\n', 'utf-8')
request.shutdown(2)  #断开连接

socket.close() #关闭socket

 

客户端的连接可以使用:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect((server, port))

sock.send(bytes(strData, 'utf-8'))

strRecvData = sock.recv(1024)  // 最多一下子接受1024个字节

sock.close()

 

修改服务器,使用简单的socketserver

 

import socketserver

class RequestHandler(socketserver.StreamRequestHandler):

def handle(self):

    do something

    rfile.read  读数据

    wfile.write 写数据

socketserver.TCPServer(('localhost', 2000), RequestHandler).serve_forever()

转载于:https://www.cnblogs.com/cxiaoln/p/3681920.html

你可能感兴趣的文章
e.Row.Attributes.Add
查看>>
SCOPE_IDENTITY()和 SELECT @@IDENTITY 的用法
查看>>
PLoP(Pattern Languages of Programs,程序设计的模式语言)
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
android"百码"2——基础小知识积累(逐步完善)2015-06-15
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
Filebeat Config 参数详解:
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
Solr4.8.0源码分析(5)之查询流程分析总述
查看>>
[Windows Server]安装系统显示“缺少计算机所需的介质驱动程序”解决方案
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
20165301 2017-2018-2 《Java程序设计》第九周学习总结
查看>>
Java基础之字符串匹配大全
查看>>
SGA和PGA的分配原则及更改大小
查看>>