Возврат времени и даты отправленного электронного письма - IMAP - PullRequest
0 голосов
/ 05 мая 2020

Новое в python, и я пытался создать программу, которая возвращает время получения указанного c электронного письма, и нигде не может найти функцию, которая бы это сделала. (До сих пор я проверял reddit, Stack Overflow и Automate the Boring). Мне удалось вернуть тело письма с помощью приведенного ниже, но не смог найти ничего о том, могу ли я извлечь только время из писем. . Любая помощь в том, возможно ли это и как это можно сделать, будет принята с благодарностью. Спасибо

password = input('Enter your password')
import imapclient
server = imapclient.IMAPClient('imap-mail.outlook.com', ssl=True)
server.login('myemail@msn.com',password)
import pprint
pprint.pprint(server.list_folders())
server.select_folder('Inbox')
rawMessage = server.fetch(40111, ['BODY[]'])
import pyzmail
message = pyzmail.PyzMessage.factory(rawMessage[40111][b'BODY[]'])
messagebodyTEXT = message.text_part.get_payload().decode(message.text_part.charset)
print(messagebodyTEXT)

Ответы [ 3 ]

0 голосов
/ 19 мая 2020

Библиотека, которую вы используете, использует протокол IMAP. В IMAP нет такого понятия, как «время, когда сообщение было получено». Есть отметка времени, когда это сообщение было "сохранено в почтовом ящике (INTERNALDATE)" , но это что-то еще в общем случае c.

Вы также можете попробовать проанализировать заголовки Received, которые могут (а могут и не содержать) информацию, которую вы ищете.

0 голосов
/ 14 августа 2020

основываясь на предыдущих комментариях и ответах относительно INTERNALDATE, вот фрагмент кода, который я использовал для извлечения поставленной даты и преобразования ее в объект datetime с помощью библиотеки imaplib:

>>> import imaplib
>>> connection = imaplib.IMAP4_SSL('yourimapserver')
>>> response = connection.login('youremailaddress', 'password')
>>> connection.select('INBOX')
>>> status, data = connection.fetch(b'1', '(INTERNALDATE)') # b"1" is your uid

Оттуда разные параметры в зависимости от:

  • формата даты и времени, предоставляемого вашим сервером imap,
  • от того, нужен ли вам объект с учетом часового пояса.

часовой пояс наивный

>>> import datetime
>>> import time

>>> data[0]
b'1 (INTERNALDATE "12-Aug-2020 16:38:19 +0200")'
>>> timestruct = imaplib.Internaldate2tuple(data[0])
>>> timestruct
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=12,tm_hour=16, tm_min=38, tm_sec=19, tm_wday=2, tm_yday=225, tm_isdst=1)
>>> datetime_delivered = datetime.fromtimestamp(mktime(timestruct))
>>> datetime_delivered
datetime.datetime(2020, 8, 12, 16, 38, 19)

с учетом часового пояса (Python 3,2 +)

>>> import email
>>> str_datetime = data[0].decode().split('"')[1]
>>> str_datetime
"12-Aug-2020 16:38:19 +0200"
>>> timezone_aware = email.utils.parsedate_to_datetime(str_datetime)
>>> timezone_aware
datetime.datetime(2020,8, 12, 16, 38, 19, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))
0 голосов
/ 05 мая 2020

Я вижу, что вы используете стороннюю библиотеку pyzmail, но знаете ли вы, что в стандартной библиотеке Python есть обширный модуль email?

В частности, я думаю, что парсер - это то, что вам понадобится для извлечения временных меток:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...