Получение n последних писем с использованием IMAP и Python - PullRequest
8 голосов
/ 12 апреля 2011

Я хочу вернуть n (скорее всего, 10) самых последних писем из почтового ящика учетных записей электронной почты, используя IMAP.

Пока я булыжник:

import imaplib
from email.parser import HeaderParser

M = imaplib.IMAP4_SSL('my.server')
user = 'username'
password = 'password'
M.login(user, password)
M.search(None, 'ALL')
for i in range (1,10):
    data = M.fetch(i, '(BODY[HEADER])')
    header_data = data[1][0][1]
    parser = HeaderParser()
    msg = parser.parsestr(header_data)
    print msg['subject']

Это нормально возвращает заголовки писем, но, похоже, это полуслучайная коллекция получаемых писем, а не 10 самых последних.

Если это поможет, я подключаюсь к серверу Exchange 2010. Другие подходы также приветствуются, IMAP только кажется наиболее подходящим, учитывая, что я хотел только читать электронные письма, а не отправлять их.

Ответы [ 3 ]

11 голосов
/ 13 апреля 2011

Команда сортировки доступна, но она не гарантированно поддерживается сервером IMAP. Например, Gmail не поддерживает команду SORT.

Чтобы попробовать команду сортировки, вы должны заменить:
M.search(None, 'ALL')
с
M.sort(search_critera, 'UTF-8', 'ALL')

Тогда search_criteria будет такой строкой:

search_criteria = 'DATE' #Ascending, most recent email last
search_criteria = 'REVERSE DATE' #Descending, most recent email first

search_criteria = '[REVERSE] sort-key' #format for sorting

Согласно RFC5256 они действительны sort-key s:
"ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" / "SUBJECT" / "TO"

Примечания:
1. требуется кодировка, попробуйте US-ASCII или UTF-8, все остальные не обязаны поддерживаться сервером IMAP
2. Поиск критерия также требуется. Команда ALL является допустимой, но их много. Подробнее на http://www.networksorcery.com/enp/rfc/rfc3501.txt

Мир IMAP дикий и безумный. Удачи

1 голос
/ 25 июня 2018

Это код для получения emailFrom, emailSubject, emailDate, emailContent и т. Д.

import imaplib, email, os
user = "your@email.com"
password = "pass"
imap_url = "imap.gmail.com"
connection = imaplib.IMAP4_SSL(imap_url)
connection.login(user, password)
result, data = connection.uid('search', None, "ALL")
if result == 'OK'
    for num in data[0].split():
    result, data = connection.uid('fetch', num, '(RFC822)')
    if result == 'OK':
         email_message = email.message_from_bytes(data[0][1])
         print('From:' + email_message['From'])
         print('To:' + email_message['To'])
         print('Date:' + email_message['Date'])
         print('Subject:' + str(email_message['Subject']))
         print('Content:' + str(email_message.get_payload()[0]))
connection.close()
connection.logout()        
0 голосов
/ 05 сентября 2017

это работа для меня ~

import imaplib
from email.parser import HeaderParser
M = imaplib.IMAP4_SSL('my.server')
user = 'username'
password = 'password'
M.login(user, password)
(retcode, messages) =M.search(None, 'ALL')
 news_mail = get_mostnew_email(messages)
for i in news_mail :
    data = M.fetch(i, '(BODY[HEADER])')
    header_data = data[1][0][1]
    parser = HeaderParser()
    msg = parser.parsestr(header_data)
    print msg['subject']

, и вот новая функция электронной почты:

def get_mostnew_email(messages):
    """
    Getting in most recent emails using IMAP and Python
    :param messages:
    :return:
    """
    ids = messages[0]  # data is a list.
    id_list = ids.split()  # ids is a space separated string
    #latest_ten_email_id = id_list  # get all
    latest_ten_email_id = id_list[-10:]  # get the latest 10
    keys = map(int, latest_ten_email_id)
    news_keys = sorted(keys, reverse=True)
    str_keys = [str(e) for e in news_keys]
    return  str_keys
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...