我正在尝试访问POP3电子邮件服务器。我将轮询消息并为每个消息下载附件。我可以成功登录并获取消息,但无法弄清楚如何实际获取附件,稍后需要解析。我想我可以保存到tmp dir,直到我处理它。
这是到目前为止我得到的:
pop = poplib.POP3_SSL(server)
pop.user(usr)
pop.pass_(pwd)
f = open(file_dir, 'w')
num_msgs = len(pop.list()[1])
for msg_list in range(num_msgs):
for msg in pop.retr(msg_list+1)[1]:
mail = email.message_from_string(msg)
for part in mail.walk():
f.write(part.get_payload(decode=True))
f.close()
Run Code Online (Sandbox Code Playgroud)
这是我从网上找到的示例中拼凑而成的代码,但没有实际获得附件的可靠示例。我正在写入的文件为空。我在这里想念什么?
请参阅下面的完整示例。
导入 poplib 和解析器
import poplib
from email import parser
一个返回到 pop 服务器的连接的函数:
def mail_connection(server='pop.mymailserver.com'):
pop_conn = poplib.POP3(server)
pop_conn.user('someuser@server')
pop_conn.pass_('password')
return pop_conn
Run Code Online (Sandbox Code Playgroud)
获取邮件的函数:
def fetch_mail(delete_after=False):
pop_conn = mail_connection()
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
messages = ["\n".join(mssg[1]) for mssg in messages]
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
if delete_after == True:
delete_messages = [pop_conn.dele(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
pop_conn.quit()
return messages
Run Code Online (Sandbox Code Playgroud)
然后是将附件另存为文件的功能。注意,该allowed mimetypes;你可以有一个列表,例如:
allowed_mimetypes = ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]
Run Code Online (Sandbox Code Playgroud)
等等。
def get_attachments():
messages = fetch_mail()
attachments = []
for msg in messages:
for part in msg.walk():
if part.get_content_type() in allowed_mimetypes:
name = part.get_filename()
data = part.get_payload(decode=True)
f = file(name,'wb')
f.write(data)
f.close()
attachments.append(name)
return attachments
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但以防万一:您传递给 email.message_from_string 的值实际上是电子邮件内容的列表,其中每个元素都是一行。您需要将其连接起来才能获取该电子邮件的字符串表示形式:
mail = email.message_from_string("".join(msg))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5397 次 |
| 最近记录: |