python中的脚本以下载电子邮件附件 [英] Script in python to download email attachments

查看:351
本文介绍了python中的脚本以下载电子邮件附件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下脚本:

import imaplib
import email
import os

svdir = 'c:/downloads'

mail = imaplib.IMAP4('https://outlook.office365.com/mapi/emsmdb/?'
                     'MailboxId=6ebd46ee-55df-452e-a0af-44e7b248d992@jmawireless.com')
mail.login("RNa", "RN!")
mail.select("ADP Files")

typ, msgs = mail.search(None, '(SUBJECT "ADP Files")')
msgs = msgs[0].split()

for emailid in msgs:
    resp, data = mail.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    m = email.message_from_string(email_body)

    if m.get_content_maintype() != 'multipart':
        continue

    for part in m.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        if filename is not None:
            sv_path = os.path.join(svdir, filename)
            if not os.path.isfile(sv_path):
                print(sv_path)
                fp = open(sv_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()

正在产生的错误是:

C:\Users\rnandipati\Desktop\Batch Files\EMAIL ADP>email.py

Traceback (most recent call last):
    File "C:\Python34\lib\encodings\idna.py", line 165, in encode
    raise UnicodeError("label empty or too long") UnicodeError: label empty or too long

The above exception was the direct cause of the following exception:
Traceback (most recent call last):
    File "C:\Users\rnandipati\Desktop\Batch Files\EMAIL ADP\email.py", line 2, in <module>
        import email
    File "C:\Users\rnandipati\Desktop\Batch Files\EMAIL ADP\email.py", line 8, in <module>
        mail=imaplib.IMAP4( 'https://outlook.office365.com/mapi/emsmdb/?MailboxId=6ebd46ee-55df-452e-a0af-44e7b248d992@jmawireless.com')
    File "C:\Python34\lib\imaplib.py", line 181, in __init__
        self.open(host, port)
    File "C:\Python34\lib\imaplib.py", line 257, in open
        self.sock = self._create_socket()
    File "C:\Python34\lib\imaplib.py", line 247, in _create_socket
        return socket.create_connection((self.host, self.port))
    File "C:\Python34\lib\socket.py", line 494, in create_connection
        for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    File "C:\Python34\lib\socket.py", line 533, in getaddrinfo
        for res in _socket.getaddrinfo(host, port, family, type, proto, flags): UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or to o long)

我不知道为什么会产生此错误.对于这种脚本,我还很陌生.

I do not know why is this error produced. I am fairly new to this kind of scripting.

推荐答案

根据文档(以及源代码),构造函数 port :端口号,默认为标准IMAP4端口).

According to the documentation (and the source code too), the constructor imaplib.IMAP4() takes two parameters: host: the host name (usually a server name or IP address), defaulting to "localhost", and port: the port number, defaulting to the standard IMAP4 port).

在这里,您使用的是URL,这是错误的.

Here, you are using an URL, which is wrong.

尝试打开这样的连接:

with imaplib.IMAP4("outlook.office365.com") as imap4:
    ...

请咨询该页面以获取Office 360​​的连接设置:

Consult this page to have the connection settings for Office 360: POP and IMAP settings for Outlook Office 365 for business

您可能需要用于Outlook Office 365的SSL连接.这是一个更有用的用法示例:

You may need SSL connection for Outlook Office 365. Here is a more useful usage example:

import imaplib

username = 'user@example.com'
password = 'password'

with imaplib.IMAP4_SSL('outlook.office365.com') as imap4:
    imap4.login(username, password)

    # retrieve a list of the mailboxes and select one
    result, mailboxes = imap4.list()
    imap4.select("inbox")

不带with语句的替代方式

alternative without with statement

try:
    imap4.login(username, password)

    # retrieve a list of the mailboxes and select one
    result, mailboxes = imap4.list()
    imap4.select("inbox")

finally:
    imap4.close()

这篇关于python中的脚本以下载电子邮件附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆