Il s'agit d'une plus petite partie d'un plus grand projet. Je n'ai besoin que de recevoir des e-mails non lus et d'analyser leurs en-têtes. Comment puis-je modifier le script suivant pour ne recevoir que les e-mails non lus?
conn = imaplib.IMAP4_SSL(imap_server)
conn.login(imap_user, imap_password)
status, messages = conn.select('INBOX')
if status != "OK":
print "Incorrect mail box"
exit()
print messages
Quelque chose comme ça fera l'affaire.
conn = imaplib.IMAP4_SSL(imap_server)
try:
(retcode, capabilities) = conn.login(imap_user, imap_password)
except:
print sys.exc_info()[1]
sys.exit(1)
conn.select(readonly=1) # Select inbox or default namespace
(retcode, messages) = conn.search(None, '(UNSEEN)')
if retcode == 'OK':
for num in messages[0].split(' '):
print 'Processing :', message
typ, data = conn.fetch(num,'(RFC822)')
msg = email.message_from_string(data[0][1])
typ, data = conn.store(num,'-FLAGS','\\Seen')
if ret == 'OK':
print data,'\n',30*'-'
print msg
conn.close()
Il y a aussi une question en double ici - Trouver de nouveaux messages ajoutés à une boîte aux lettres imap depuis ma dernière vérification avec python imaplib2?
Deux fonctions utiles pour récupérer le corps et les pièces jointes du nouveau message que vous avez détecté (référence: Comment récupérer un corps de courriel en utilisant imaplib en python? ) -
def getMsgs(servername="myimapserverfqdn"):
usernm = getpass.getuser()
passwd = getpass.getpass()
subject = 'Your SSL Certificate'
conn = imaplib.IMAP4_SSL(servername)
conn.login(usernm,passwd)
conn.select('Inbox')
typ, data = conn.search(None,'(UNSEEN SUBJECT "%s")' % subject)
for num in data[0].split():
typ, data = conn.fetch(num,'(RFC822)')
msg = email.message_from_string(data[0][1])
typ, data = conn.store(num,'-FLAGS','\\Seen')
yield msg
def getAttachment(msg,check):
for part in msg.walk():
if part.get_content_type() == 'application/octet-stream':
if check(part.get_filename()):
return part.get_payload(decode=1)
La réponse ci-dessus ne fonctionne plus ou n'a peut-être jamais fonctionné, mais je l'ai modifiée pour qu'elle ne renvoie que des messages invisibles, elle donnait: l'erreur ne peut pas analyser la commande de récupération ou quelque chose comme ça voici un code de travail:
mail = imaplib.IMAP4_SSL('imap.gmail.com')
(retcode, capabilities) = mail.login('email','pass')
mail.list()
mail.select('inbox')
n=0
(retcode, messages) = mail.search(None, '(UNSEEN)')
if retcode == 'OK':
for num in messages[0].split() :
print 'Processing '
n=n+1
typ, data = mail.fetch(num,'(RFC822)')
for response_part in data:
if isinstance(response_part, Tuple):
original = email.message_from_string(response_part[1])
print original['From']
print original['Subject']
typ, data = mail.store(num,'+FLAGS','\\Seen')
print n
Je pense que l'erreur provenait de la messages[0].split(' ')
mais le code ci-dessus devrait fonctionner correctement.
Notez également le +FLAGS
Au lieu de -FLAGS
Qui marque le message comme lu.
original = email.message_from_string(response_part[1])
Doit être modifié pour:
original = email.message_from_bytes(response_part[1])
J'ai réussi à faire fonctionner cela avec Gmail:
import datetime
import email
import imaplib
import mailbox
EMAIL_ACCOUNT = "[email protected]"
PASSWORD = "your password"
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(EMAIL_ACCOUNT, PASSWORD)
mail.list()
mail.select('inbox')
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN)
i = len(data[0].split())
for x in range(i):
latest_email_uid = data[0].split()[x]
result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
# result, email_data = conn.store(num,'-FLAGS','\\Seen')
# this might work to set flag to seen, if it doesn't already
raw_email = email_data[0][1]
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)
# Header Details
date_Tuple = email.utils.parsedate_tz(email_message['Date'])
if date_Tuple:
local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_Tuple))
local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
email_from = str(email.header.make_header(email.header.decode_header(email_message['From'])))
email_to = str(email.header.make_header(email.header.decode_header(email_message['To'])))
subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))
# Body details
for part in email_message.walk():
if part.get_content_type() == "text/plain":
body = part.get_payload(decode=True)
file_name = "email_" + str(x) + ".txt"
output_file = open(file_name, 'w')
output_file.write("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\nBody: \n\n%s" %(email_from, email_to,local_message_date, subject, body.decode('utf-8')))
output_file.close()
else:
continue