Как переслать электронную почту с помощью Python - PullRequest
2 голосов
/ 17 декабря 2011

Во-первых, позвольте мне сказать, Я уже знаю, что об этом спросили на Пересылка электронного письма с python smtplib .

Причина, по которой я публикую что-то настолько тесно связанное с этим вопросом, заключается в том, что я пытался использовать ответы на этот вопрос, я пытался что-то изменить, я искал в Google и безостановочно мучился с этим около 5 часов, и Я готов потратить гораздо больше времени на это

- Я просто подумал, что один из вас может иметь ответ, хотя :)

Моя проблема заключается в следующем: я пытаюсь переслать письмо из моего почтового ящика в другой почтовый ящик, и, выполняя как можно больше сценариев Python, чтобы выполнить эту простую задачу, я все еще не могу понять это.

Вот код, который я запускаю (это моя модифицированная версия того, что было опубликовано в другой форме):

import smtplib, imaplib, email, string

imap_host = "imap.gmail.com"
imap_port = 993
smtp_host = "smtp.gmail.com"
smtp_port = 587
user = "John.Michael.Dorian.4"
passwd = "mypassword"
msgid = 1
from_addr = "John.Michael.Dorian.4@gmail.com"
to_addr = "myotheremail@gmail.com"


# open IMAP connection and fetch message with id msgid
# store message data in email_data
client = imaplib.IMAP4_SSL(imap_host, imap_port)
client.login(user, passwd)
client.select()
typ, data = client.search(None, 'ALL')
for mail in data[0].split():
    typ, data = client.fetch(msgid, "(RFC822)")
    email_data = data[0][1]
client.close()
client.logout()


# create a Message instance from the email data
message = email.message_from_string(email_data)

# replace headers (could do other processing here)
message.replace_header("From", from_addr)
message.replace_header("To", to_addr)
print message.as_string()

# open authenticated SMTP connection and send message with
# specified envelope from and to addresses
smtp = smtplib.SMTP(smtp_host, smtp_port)
smtp.set_debuglevel(1)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login(user, passwd)
smtp.sendmail(from_addr, to_addr, message.as_string()) 
smtp.quit()

В результате отладки SMTP говорится, что все прошло нормально, и я знаю, что оно отправляется, потому что я пытался заменить

smtp.sendmail (from_addr, to_addr, message.as_string ())

С

smtp.sendmail (from_addr, to_addr, 'test')

И все работало нормально. Он печатает message.as_string () нормально, и я в растерянности, как заставить его переслать письмо!

Это не обязательно должно быть с SMTP, IMAP или любым другим из этого кода (хотя было бы неплохо, если бы это было так), но я бы очень хотел выяснить, как это сделать.

Я знаю, что это возможно, потому что мне удалось сделать это вчера, и компьютер, на котором я работал (конечно, под управлением Windows), вышел из строя и файл исчез.

Для тех из вас, кто интересуется, почему я не просто настроил google на автоматическую пересылку, все потому, что мне нужен скрипт, который в конечном итоге переместит большое количество почты, один раз.

Спасибо всем!

1 Ответ

0 голосов
/ 17 декабря 2011

Скорее всего, заголовки Received: исходного письма заставляют gmail отбрасывать сообщение.Попробуйте удалить все из них перед отправкой.

Если это не помогает, распечатайте заголовки и закодируйте их, чтобы удалить все те, которые обычно не присутствуют в недавно составленном сообщении.

Впрочем, зачем идти вперед?Было бы проще просто извлечь из одной учетной записи IMAP и напрямую передать ее в другую учетную запись IMAP.

Фактически вы можете использовать Mozilla Thunderbird для добавления обеих учетных записей и просто перетаскивать сообщения из одной в другую.

...