12

特定の条件に一致する特定の電子メールを別の電子メールに自動的に転送するスクリプトをまとめようとしています。

imaplibと電子メールを使用したメッセージのダウンロードと解析は機能していますが、電子メール全体を別のアドレスに転送する方法がわかりません。新しいメッセージを最初から作成する必要がありますか、それとも古いメッセージを変更して再送信できますか?

これが私がこれまでに持っているものです(クライアントはimaplib.IMAP4接続であり、idはメッセージIDです):

import smtplib, imaplib

smtp = smtplib.SMTP(host, smtp_port)
smtp.login(user, passw)

client = imaplib.IMAP4(host)
client.login(user, passw)
client.select('INBOX')

status, data = client.fetch(id, '(RFC822)')
email_body = data[0][1]
mail = email.message_from_string(email_body)

# ...Process message...

# This doesn't work
forward = email.message.Message()
forward.set_payload(mail.get_payload())
forward['From'] = 'source.email.address@domain.com'
forward['To'] = 'my.email.address@gmail.com'

smtp.sendmail(user, ['my.email.address@gmail.com'], forward.as_string())

メッセージのMIMEコンテンツに関して、もう少し複雑なことをする必要があると確信しています。確かに、メッセージ全体を転送する簡単な方法はありますか?

# This doesn't work either, it just freezes...?
mail['From'] = 'source.email.address@domain.com'
mail['To'] = 'my.email.address@gmail.com'
smtp.sendmail(user, ['my.email.address@gmail.com'], mail.as_string())
4

2 に答える 2

23

メッセージのヘッダーを置き換える方法が間違っていたと思います。メッセージのコピーを作成する必要がないため、フェッチした生データからメッセージを作成した後、メッセージを直接操作できます。 IMAPサーバーから。

あなたはいくつかの詳細を省略したので、これがすべての詳細を綴った私の完全な解決策です。必要なため、SMTP接続をSTARTTLSモードにしていることに注意してください。また、IMAPフェーズとSMTPフェーズを互いに分離していることに注意してください。メッセージを変更すると、IMAPサーバーでメッセージが変更されると思ったのではないでしょうか。もしそうなら、これはそれが起こらないことをはっきりとあなたに示すはずです。

import smtplib, imaplib, email

imap_host = "mail.example.com"
smtp_host = "mail.example.com"
smtp_port = 587
user = "xyz"
passwd = "xyz"
msgid = 7
from_addr = "from.me@example.com"
to_addr = "to.you@example.com"

# open IMAP connection and fetch message with id msgid
# store message data in email_data
client = imaplib.IMAP4(imap_host)
client.login(user, passwd)
client.select('INBOX')
status, 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)

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

この答えがかなり遅れても、これが役立つことを願っています。

于 2010-12-30T21:04:37.090 に答える
1

あるアプリケーションでは、POP3経由で(poplibを使用して)メッセージをダウンロードし、2番目の方法を使用して転送します...つまり、元のメッセージのTo / Fromを変更して送信すると、機能します。
smtp.sendmail内を突いて、どこで停止するかを確認しましたか?

于 2010-12-20T13:55:49.723 に答える