当前位置: 首页 > 面试题库 >

使用python smtplib转发电子邮件

魏澄邈
2023-03-14
问题内容

我正在尝试编写一个脚本,该脚本会自动将符合特定条件的某些电子邮件转发到另一封电子邮件。

我已经可以使用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服务器。

您确实省略了一些细节,所以这是我完整的解决方案,其中阐明了所有细节。请注意,我将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()

希望即使这个答案来得很晚也能有所帮助。



 类似资料:
  • 在本章中,我们将了解如何使用JavaMail API转发电子邮件。 以下程序中遵循的基本步骤是: 在属性中获取具有POP和SMPT服务器详细信息的Session对象。 我们需要POP详细信息来检索消息和SMPT详细信息以发送消息。 创建POP3商店对象并连接到商店。 创建文件夹对象并在邮箱中打开相应的文件夹。 检索邮件。 如果要转发,请浏览消息并输入“Y”或“y”。 获取邮件的所有信息(收件人,发

  • 问题内容: 如何使用curl命令行程序从gmail帐户发送电子邮件? 我尝试了以下方法: 使用file.txt作为电子邮件的内容,但是,当我运行此命令时,出现以下错误: 是否可以从仍由curl托管的个人服务器托管帐户发送电子邮件?这样会使身份验证过程更容易吗? 问题答案: curl –url 'smtps://smtp.gmail.com:465’ –ssl-reqd \ –mail-from '

  • 问题内容: 我正在尝试使用Java发送电子邮件: 我收到错误消息: 此代码可以发送电子邮件吗? 问题答案: 户名+密码不再是推荐的解决方案。这是因为 我尝试了此操作,Gmail向该代码中用作用户名的电子邮件发送了一封电子邮件,其中说我们最近阻止了你的Google帐户的登录尝试,并将我定向到此支持页面:support.google.com/accounts/answer/6010255因此它看起来很

  • 问题内容: 这有点令人困惑,所以请在这里忍受… 我想建立一个系统,使用户可以通过我的网站发送模板化的电子邮件,但实际上并没有使用我的服务器发送它- 它只是打开自己的本地邮件客户端,并准备发送电子邮件。该应用程序将使用预定义的变量填充电子邮件的正文,以节省用户必须自己键入的电子邮件。然后,如果该消息不完全适合其目的,则他们可以根据需要编辑该消息。 我有很多理由希望它通过用户的本地邮件客户端,因此让服

  • 它显示以下错误: JasperException:处理JSP页面/assignment3/send_email.JSP第132 129行时发生异常:Message Message=new MimeMessage(session1);130:131://Set FROM:header标头字段。132:message.setFrom(新InternetAddress(from));133:134://

  • null null 类型:host:值: 类型:host:值: 类型:host:值: 试图访问会带来一个页面。 如何正确地配置Heroku和Namecheap以使其工作?