Импорт электронной почты из одного почтового ящика Gmail в другой - PullRequest
1 голос
/ 27 марта 2019

У меня есть 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 и узнать, на какой адрес электронной почты было направлено письмо). Но сейчас я получаю только ошибки об использовании загрузки; Я не уверен, что это то, что я действительно должен делать, и если это так, я понятия не имею, как.

Заранее большое спасибо за любую помощь!

1 Ответ

0 голосов
/ 01 апреля 2019

В итоге мне удалось.Я упустил тот факт, что есть 2 способа «получить» сообщения: простой и «сырой».Имея «сырой» способ доступа к сообщению, я могу легко использовать функцию import_:

message = service_dnt.users().messages().get(userId="me", id=messageId,format='raw').execute()
imported = importMessage(service_gmail,"me",{'raw': message['raw']})

, благодаря чему функция importMessage не меняется по сравнению с исходным кодом, который я опубликовал.

...