Bonjour,


J'ai un problème lors du lancement de mon script python permettant de se connecter à une adresse mail et récupérer les dernières pièces jointes des mails non-lu.

J'ai effectuer ma base de test sur des adresses hotmail et outlook et tout fonctionne.

Seulement, après avoir tester avec une adresse office 365 d'entreprise, j'obtiens l'erreur imaplib.error : login failed.

PS: J'utilise python 2.7


Voici mon code :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/python2.7
import email
import imaplib
import os
 
 
class FetchEmail():
 
    connection = None
    error = None
 
    def __init__(self, mail_server, username, password, path):
        self.connection = imaplib.IMAP4_SSL(mail_server)
        self.connection.login(username, password)
        self.connection.select(readonly=False) # so we can mark mails as read
        msg = self.fetch_unread_messages()
        for element in msg:
            pathFile = self.save_attachment(element, path)
            print pathFile
        self.close_connection()
 
    def close_connection(self):
        """
        Close the connection to the IMAP server
        """
        self.connection.close()
 
    def save_attachment(self, msg, download_folder):
        """
        Given a message, save its attachments to the specified
        download folder (default is /tmp)
 
        return: file path to attachment
        """
        att_path = "No attachment found."
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue
 
            filename = part.get_filename()
            att_path = os.path.join(download_folder, filename)
 
            if not os.path.isfile(att_path):
                fp = open(att_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
        return att_path
 
    def fetch_unread_messages(self):
        """
        Retrieve unread messages
        """
        emails = []
        (result, messages) = self.connection.search(None, 'UnSeen')
        if result == "OK":
            for message in messages[0].split(' '):
                try:
                    ret, data = self.connection.fetch(message,'(RFC822)')
                except:
                    print ("No new emails to read.")
                    self.close_connection()
                    exit()
 
                msg = email.message_from_string(data[0][1])
                if isinstance(msg, str) == False:
                    emails.append(msg)
                #response, data = self.connection.store(message, '+FLAGS','\\Seen')
            print emails
            return emails
 
        self.error = "Failed to retreive emails."
        return emails
 
    def parse_email_address(self, email_address):
        """
        Helper function to parse out the email address from the message
 
        return: tuple (name, address). Eg. ('John Doe', 'jdoe@example.com')
        """
        return email.utils.parseaddr(email_address)
 
a = FetchEmail('SMTP.office365.com', 'Jean.louis@airbus.fr', 'Tdhxk49', 'C:\\Users\\jean.l\\Documents\\Scan') #On entre nos infos de mails ici
Avez-vous une idée ?


Cordialement,