|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import email
- import poplib
- def decode(header: str):
- value, charset = email.header.decode_header(header)[0]
- if charset:
- return str(value, encoding=charset)
- else:
- return value
- def download_attachment(msg):
- subject = decode(msg.get('Subject')) # 获取消息标题
- for part in msg.walk(): # 遍历整个msg的内容
- if part.get_content_disposition() == 'attachment':
- attachment_name = decode(part.get_filename()) # 获取附件名称
- attachment_content = part.get_payload(decode=True) # 下载附件
- attachment_file = open('./' + attachment_name, 'wb') # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
- attachment_file.write(attachment_content) # 将附件保存到本地
- attachment_file.close()
- print('Done………………', subject)
- def main():
- """连接到POP3服务器"""
- server = poplib.POP3(host='pop.qiye.aliyun.com') # 创建一个POP3对象,参数host是指定服务器
- """身份验证"""
- server.user('*') # 参数是你的邮箱地址
- server.pass_('*') # 参数是你的邮箱密码,如果出现poplib.error_proto: b'-ERR login fail',就用开启POP3服务时拿到的授权码
- """获取邮箱中消息(邮件)数量"""
- msg_count, _ = server.stat()
- print(msg_count,_)
- """遍历消息并保存附件"""
- for i in range(msg_count):
- """获取消息内容:POP3.retr(which)检索index为which的整个消息,并将其设为已读"""
- _, lines, _ = server.retr(
- i+1) # 3个结果分别是响应结果(1个包含是否请求成功和该消息大小的字符串),消息内容(一个字符串列表,每个元素是消息内容的一行),消息大小(即有多少个octets,octet特指8bit的字节)
- """将bytes格式的消息内容拼接"""
- msg_bytes_content = b'\r\n'.join(lines)
- """将字符串格式的消息内容转换为email模块支持的格式(<class 'email.message.Message'>)"""
- msg = email.message_from_bytes(msg_bytes_content)
- """下载消息中的附件"""
- download_attachment(msg)
- if __name__ == "__main__":
- main()
复制代码
代码能跑通,附件能下载。但是我想被读取下载过附件的邮件,在下次访问的时候不在读取,应该怎么做? 读取邮件的正文,需要怎么做?
本帖最后由 suchocolate 于 2021-6-28 12:54 编辑
加一个文件记录有无下载过
- import email
- import poplib
- import pickle # <===== 加pickle模块
- def decode(header: str):
- value, charset = email.header.decode_header(header)[0]
- if charset:
- return str(value, encoding=charset)
- else:
- return value
- def download_attachment(msg, db): # <===== 传入db
- subject = decode(msg.get('Subject')) # 获取消息标题
- for part in msg.walk(): # 遍历整个msg的内容
- if part.get_content_disposition() == 'attachment':
- if subject not in db: # <===== db中没有就下载,有就不下载
- attachment_name = decode(part.get_filename()) # 获取附件名称
- attachment_content = part.get_payload(decode=True) # 下载附件
- attachment_file = open('./' + attachment_name, 'wb') # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
- attachment_file.write(attachment_content) # 将附件保存到本地
- attachment_file.close()
- db.append(subject) # <===== 下载完后加入到db
- print('Done………………', subject)
- return db # <===== 记得返回db
- def main():
- """连接到POP3服务器"""
- server = poplib.POP3(host='pop.qiye.aliyun.com') # 创建一个POP3对象,参数host是指定服务器
- """身份验证"""
- server.user('*') # 参数是你的邮箱地址
- server.pass_('*') # 参数是你的邮箱密码,如果出现poplib.error_proto: b'-ERR login fail',就用开启POP3服务时拿到的授权码
- """获取邮箱中消息(邮件)数量"""
- msg_count, _ = server.stat()
- print(msg_count, _)
- db = pickle.load(open("db.pkl", "rb")) # <===== 打开db文件,没有的话可以提前手工建一个空白列表的pickle文件:pickle.dump([], open("db.pkl", "wb"))
-
- """遍历消息并保存附件"""
- for i in range(msg_count):
- """获取消息内容:POP3.retr(which)检索index为which的整个消息,并将其设为已读"""
- _, lines, _ = server.retr(
- i + 1) # 3个结果分别是响应结果(1个包含是否请求成功和该消息大小的字符串),消息内容(一个字符串列表,每个元素是消息内容的一行),消息大小(即有多少个octets,octet特指8bit的字节)
- """将bytes格式的消息内容拼接"""
- msg_bytes_content = b'\r\n'.join(lines)
- """将字符串格式的消息内容转换为email模块支持的格式(<class 'email.message.Message'>)"""
- msg = email.message_from_bytes(msg_bytes_content)
- """下载消息中的附件"""
- db = download_attachment(msg, db) # <===== 传入db
- pickle.dump(db, open("db.pkl", "wb")) # <===== 最后保存db
- if __name__ == "__main__":
- main()
复制代码
|
|