У меня есть 2 учетные записи Gmail, и я использую одну ("gmail1") для пересылки всей электронной почты другой ("gmail2"). Это прекрасно работает, но недавно я обнаружил (спустя годы!), Что на самом деле Gmail пересылает не всю мою электронную почту, а только ту электронную почту, которую он считает не спамом. Поэтому, проверяя мою папку со спамом в gmail2 на предмет отсутствия писем, я часто обвинял отправителей в том, что электронная почта действительно потерялась на gmail1. Я хочу решить эту проблему программно, регулярно проверяя спам-сообщения в gmail1 и импортируя их в gmail2 (тогда я в порядке с gmail2, классифицирующим как спам или нет, пока почта попадает туда).
Я всего лишь программист-любитель, и до сих пор, благодаря некоторым примерам из документации по API gmail, мне удалось войти в свои учетные записи и получить некоторые сообщения, соответствующие запросу, включая, например, недавние электронные письма со спамом. , Однако я борюсь с концепцией «импорта» и с тем, как ее использовать. Для этого нет примеров Python, и я не могу решить проблемы, с которыми сталкиваюсь.
Где я сейчас нахожусь:
- если я "получаю" сообщение от gmail1 и пытаюсь выполнить вызов import_ на gmail2, используя только что полученное сообщение, я получаю сообщение об ошибке, поскольку threadId не разрешен
- если я делаю то же самое, а затем "del message ['threadId']", то ошибка становится ошибкой 400: необработанная строка сообщения полезной нагрузки RFC822 или загрузка сообщения через / upload / * URL-адрес требуется. Я видел, что есть некоторые ситуации, когда требуется загрузка, но я полностью теряюсь в том, что я должен сделать, чтобы сделать эту работу.
Вот что у меня есть (извините за очень хакерский стиль):
# skipping imports
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly','https://www.googleapis.com/auth/gmail.modify']
def getMessage(service, user_id, msg_id):
"""from gmail API examples"""
try:
message = service.users().messages().get(userId=user_id, id=msg_id).execute()
return message
except errors.HttpError as error:
print ('An error occurred:' , error)
def listMessagesMatchingQuery(service, user_id, query=''):
"""from gmail API examples"""
# skipping some code
return messages
def login(accountId):
"""from gmail API examples, adapted to handle 2 accounts"""
# skipping some code
return build('gmail', 'v1', credentials=creds)
def importMessage(service, user_id, msg):
"""my daring attempt at using import, without any Python sample to use as a basis"""
try:
message = service.users().messages().import_(userId=user_id, body=msg).execute()
return message
except errors.HttpError as error:
print ('An error occurred:' , error)
if __name__ == '__main__':
service_gmail = login('gmail2')
service_dnt = login('gmail1')
messages = listMessagesMatchingQuery(service_dnt,"me","in:spam is:unread after:" + str(int((datetime.now() - timedelta(hours=12)).timestamp())))
# this gets me some recent unread spam messages
m=getMessage(service_dnt,"me",messages[0]['id'])
# now I have a full message - I'm just investigating for now so the first message is enough
del m['threadId']
# if I don't do that, the error I get is that threadId is not allowed here, so I remove it
imported = importMessage(service_gmail,"me",m)
# this now gives me error 400 : 'raw' RFC822 payload message string or uploading message via /upload/* URL required
Я бы хотел найти способ заставить эту работу работать так, чтобы электронное письмо появлялось в gmail2 так, как если бы оно было получено непосредственно gmail2 (хотя я хотел бы сохранить адрес To:, поскольку я использую поймать все на gmail1 и узнать, на какой адрес электронной почты было направлено письмо). Но сейчас я получаю только ошибки об использовании загрузки; Я не уверен, что это то, что я действительно должен делать, и если это так, я понятия не имею, как.
Заранее большое спасибо за любую помощь!