设为首页 收藏本站
查看: 1214|回复: 0

[经验分享] python 读取邮件

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-4-23 11:27:24 | 显示全部楼层 |阅读模式
读取邮件向imaplib 传递一个消息ID的列表。为了提取的是邮箱的主题,将字符串(BODY[HEADER.FIELDS(SUBJECT)]) 作为参数传递给imaplib
from imaplib import IMAP4

class SubjectLister(IMAP4):
    def __init__(self, server, username, password):
        IMAP4.__init__(self, server)
        self.login(username, password)

    def summarize(self, mailbox='cxiaoln'):
        numberOfMessages = int(self._result(self.select(mailbox)))
        print ('%s message(s) in mailbox "%s":'%(numberOfMessages, mailbox))
        subjects = self._result(self.fetch('1:%d'% numberOfMessages, '(BODY[HEADER.FIELDS (SUBJECT)])'))
        for subject in subjects:
            if hasattr(subject, '__iter__'):
                subject = subject[1]
                print('', subject[:subject.find('\n')])

    def _result(self, result):
        status, result = result
        if status != 'OK':
            raise status(result)
        if len(result) == 1:
            result = result[0]
        return result

if __name__ == '__main__':
    lister = SubjectLister('imap.163.com', 'user', 'password')
    lister.summarize()

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

由于同步的问题,这里减少了风险: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 socket
import sys
if 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()

在这里只是最简单的操作,也是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()


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-18244-1-1.html 上篇帖子: Python中的repr和str 下篇帖子: python 利用 setup.py 手动安装第三方类库 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表