【问题标题】:Sending email from gmail using Python使用 Python 从 gmail 发送电子邮件
【发布时间】:2010-10-04 00:48:31
【问题描述】:

我正在尝试通过构建对我有用的程序/脚本来自学如何编程。我正在尝试重新编写我在网上找到的脚本,以便使用 python 脚本 (Source) 通过 gmail 发送电子邮件。

这个例子有一部分代码用来附加文件,这是我不想要/不需要的。我已经调整了代码,这样我就不必附加任何文件了,但是当我这样做时,我会丢失电子邮件的正文。有关如何修改代码以保持电子邮件正文完整的任何帮助/提示?

感谢您的帮助。

【问题讨论】:

  • 多米尼克,感谢您的回复。我通过评论不同的台词来继续玩游戏,并且能够重新开始让它工作。结果我不得不留在“msg.attach(MIMEText(text))”这行,这仍然让我有点困惑,因为我读到 msg.attach 部分是附加文件,而不是电子邮件的正文。如果有人能解释一下,将不胜感激。
  • 您使用的示例代码创建了一个多部分的 MIME 消息。一切都是附件,包括邮件正文。如果您只想发送普通的旧单部分纯文本或 HTML 消息,则不需要任何 MIME 内容。我会用一些代码发布答案。
  • 代码似乎不再起作用了。我收到 SMTP 身份验证错误。

标签: python gmail


【解决方案1】:

您使用的示例代码创建了一个多部分的 MIME 消息。一切都是附件,包括邮件正文。如果您只想发送普通的旧单部分纯文本或 HTML 消息,则不需要任何 MIME 内容。它只会增加复杂性。在您的示例的 sendmail() 调用中看到 msg.as_string() 的那个位吗?好吧,这只是将您创建的 MIME 对象转换为文本。如果您要处理开始的文本,那么您自己指定文本很容易。

下面的函数类似于我在我编写的脚本中用于邮寄日志文件的代码。它采用纯文本正文并将其转换为预格式化的 HTML(以便在 Outlook 中更好地工作)。如果你想保持纯文本,只需取出添加 HTML 标签的行,并将 Content-Type 标题更改为“text/plain”。

import smtplib

def sendmail(sender, recipient, subject, body, server="localhost"):
    "Sends an e-mail to the specified recipient."

    body = ("<html><head></head><body><pre>%s</pre></body></html>" % 
             body.replace("&", "&amp;").replace("<", "&lt;"))

    headers = ["From: " + sender,
               "Subject: " + subject,
               "To: " + recipient,
               "MIME-Version: 1.0",
               "Content-Type: text/html"]
    headers = "\r\n".join(headers)

    session = smtplib.SMTP(server)
    session.sendmail(sender, recipient, headers + "\r\n\r\n" + body)                
    session.quit()

【讨论】:

  • 谢谢,谢谢!
【解决方案2】:

我知道你知道你做错了什么。

在这种情况下,attach() 方法是指在电子邮件中添加内容。这很令人困惑,因为当我们处理附件和电子邮件时,我们会考虑添加额外的文件,而不是正文。

基于其他一些examples,似乎附加方法用于将文本添加到正文或将文件添加到电子邮件。

所以,为了回答您的问题,attach 方法会执行您认为的操作以及更多功能 - 它还会向正文添加文本。

顺便说一句,欢迎来到 SO。选择 Python 来学习如何编写脚本是明智的选择。

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 2017-04-01
    • 2013-10-17
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多