質問

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

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())
役に立ちましたか?

解決

あなたが間違っていたのは、メッセージのヘッダーをどのように置き換えるか、そしてメッセージのコピーを作成する必要がないという事実は、あなたが取得した生データからそれを作成した後、それを直接動作させることができると思いますIMAPサーバーから。

詳細を省略したので、すべての詳細が綴られた私の完全なソリューションがあります。 STARTTLSモードを必要としているため、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()

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top