如何阅读正文并使用Python2.7从Gmail下载附件?

时间:2018-02-25 19:28:42

标签: python gmail attachment content-type mixed

我试图在我的电子邮件中阅读我的收件箱文件夹的正文,如果有附件,请下载它。我已经联系到了所收到邮件的正文,但前提是它上面没有任何附件。

现在我已经阅读了所收到邮件的所有正文消息,但我无法在邮件中下载附件。

接下来,您将看到我的代码,如果它可以帮助某人,您就可以自由使用它。

import imaplib
import email
import myEmails
from myEmails import dicCorreos,dicContras

class Attachement(object):
    def __init__(self):
        self.data = None;
        self.content_type = None;
        self.size = None;
        self.name = None;

def parse_attachment(message_part):
    content_disposition = message_part.get("Content-Disposition", None)
    if content_disposition:
        dispositions = content_disposition.strip().split(";")
        if content_disposition and dispositions[0].lower() == "attachment":
            attachment = Attachement()
            attachment.data = message_part.get_payload(decode=True)
            attachment.content_type = message_part.get_content_type()
            attachment.size = len(attachment.data)
            attachment.name = message_part.get_filename()
            return attachment
    return None

def get_text(self, email_message_instance):
    maintype = email_message_instance.get_content_maintype()
    if maintype == 'multipart':
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
            if part.get_content_maintype() == 'multipart':
                for part2 in part.get_payload():
                    return part2.get_payload()
    elif maintype == 'text':
        return email_message_instance.get_payload()

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(dicCorreos['correo3'],dicContras['contra3'])
mail.list()
mail.select("inbox")

result,data = mail.search(None,"ALL")
# result=OK,data=['1 2 3 4 5 6 7 8 9 10 11 ...']
if result=='OK':
    latest_id = data[0].split()[-6:]

list_data=[]
for i in range(len(latest_id)):
list_data.append(email.message_from_string(mail.fetch(latest_id[int(i)],"(RFC822)")[1][0][1]))

print len(list_data)
print range(len(list_data))
for i in range(len(list_data)):
    correoDeOrigen=email.utils.parseaddr(list_data[i]['From'])[1]
    #if correoDeOrigen!=dicCorreos['correo1']:
    #print "No era lo esperado\n",correoDeOrigen,dicCorreos['correo1']         
    #pass
    #and email_message_list[i]['Subject']=='Voy a probar'
    print correoDeOrigen
    print list_data[i].items()[-1]
    mensaje = get_text('',list_data[i])
    print 'Titulo: ',list_data[i]['Subject']
    if mensaje==None:
        print 'mensaje none en posicion i = ',i
        print '\n Guardo el archivo adjunto \n'
        att=parse_attachment(list_data[i])
        print 'Llega aqui?'
        if att != None:
            print 'entra en el if del archivo'
            print "I'm  into the if"
            file = open(att.name, 'w')
            file.write(att.data)
            file.close()
            print '\n comprobar si se ha guardado \n'
            print 'Have I saved the file?'
        else:
            print 'No, no puedo guardar nada, tengo problemas'
            print "No, I can't save nothing, I have a problem here"
    else:
        print 'Mensaje:\n',mensaje
    print '\n-------------------------FIN DE ITERACIÓN Nº', i,'----------------------------------------'

我对其中一些消息的类型有些问题。没有附件的邮件类型是'内容类型'' multipart / alternative;我已成功完成电子邮件的正文。但是,如果带附件的邮件类型是'内容类型',' multipart / mixed;我无法下载附件。现在我的错误消息不起作用,我会找一个新表单来修复它

拜托,有人可以帮我解决这个挑战吗?

我知道电子邮件类型完全有机,但我无法理解。如果有人能帮助我理解它......

由于

这里是执行结果

('Content-Type', 'multipart/alternative; boundary="001a..."')
Titulo:  hola
Mensaje:
hola

-------------------------FIN DE ITERACIÓN Nº 0 ----------------------
('Content-Type', 'multipart/alternative;     
boundary="f4f5..."')
Titulo:  hola
Mensaje:
que tal


-------------------------FIN DE ITERACIÓN Nº 1 ----------------------
('Content-Type', 'multipart/alternative; boundary="001a..."')
Titulo:  que tal
Mensaje:
que tal



-------------------------FIN DE ITERACIÓN Nº 2 -----------------------
('Content-Type', 'multipart/alternative; boundary="f403..."')
Titulo:  que tal
Mensaje:
hola


-------------------------FIN DE ITERACIÓN Nº 3 -----------------------
('Content-Type', 'multipart/mixed; 
boundary="001a..."')
Titulo:  Voy a probar
mensaje none en posicion i =  4

Guardo el archivo adjunto 

Llega aqui?
No, no puedo guardar nada, tengo problemas
No, I can't save nothing, I have a problem here

----------------FIN DE ITERACIÓN Nº 4 ---------------------------
('Content-Type', 'multipart/alternative;     
boundary="001a..."')
Titulo:  Voy a probar
Mensaje:
A no enviar
un archivo adjunto
vete a saber si
es por eso que
cambia el content-type
de multipart/alternative
a multipart/mixed


-------------------------FIN DE ITERACIÓN Nº 5 ---------------------

0 个答案:

没有答案