使用python smtplib转发邮件

13 投票
1 回答
26010 浏览
提问于 2025-04-15 22:03

我正在尝试写一个脚本,自动把符合特定条件的邮件转发到另一个邮箱。

我已经用imaplib和email成功下载和解析邮件了,但我不知道怎么把整封邮件转发到另一个地址。我是需要从头开始构建一封新邮件,还是可以在旧邮件的基础上进行修改然后重新发送呢?

这是我目前的代码(client是一个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())

1 个回答

26

我觉得你之前搞错的地方是关于如何替换消息中的标题,以及你其实不需要复制消息。你可以直接在从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()

希望这能帮到你,即使这个回答来得有点晚。

撰写回答