【问题标题】:How to send message to multiple recipients?如何将消息发送给多个收件人?
【发布时间】:2014-10-15 18:21:30
【问题描述】:

我在使用 Gmail API 向多个地址发送邮件时遇到了一些问题。我只向一个地址成功发送了一条消息,但是当我在 'To' 字段中包含多个以逗号分隔的地址时出现以下错误:

发生错误:https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json 返回“对标头无效”>

我正在使用此 Gmail API 指南中的 CreateMessageSendMessage 方法: https://developers.google.com/gmail/api/guides/sending

该指南指出,Gmail API 要求邮件符合 RFC-2822。在 RFC-2822 指南中使用其中一些寻址示例时,我再次运气不佳: https://www.rfc-editor.org/rfc/rfc2822#appendix-A

我的印象是 'mary@x.test, jdoe@example.org, one@y.test' 应该是传递给CreateMessage 的'to' 参数的有效字符串,但是错误我从SendMessage 收到的消息让我不相信。

如果您可以重现此问题,或者您对我可能在哪里犯错有任何建议,请告诉我。谢谢!

编辑:这是产生错误的实际代码...

def CreateMessage(sender, to, subject, message_text):
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.urlsafe_b64encode(message.as_string())}

def SendMessage(service, user_id, message):
    try:
        message = (service.users().messages().send(userId=user_id, body=message)
           .execute())
        print 'Message Id: %s' % message['id']
        return message
    except errors.HttpError, error:
        print 'An error occurred: %s' % error

def ComposeEmail():
    # build gmail_service object using oauth credentials...
    to_addr = 'Mary Smith <mary@x.test>, jdoe@example.org, Who? <60one@y.test>'
    from_addr = 'me@address.com'
    message = CreateMessage(from_addr,to_addr,'subject text','message body')
    message = SendMessage(gmail_service,'me',message)

【问题讨论】:

  • 您是否尝试过将地址作为列表传递?您能否提供一个适用于一位收件人的代码示例?
  • 是的,我尝试将地址作为列表传递,但得到了相同的结果。我编辑了我的帖子并包含了我的代码。如果您希望我提供更多上下文,请告诉我。
  • 我今天摆弄了一段时间,因为我还在构建一个需要发送电子邮件的应用程序。我无法在涵盖它的文件中找到任何内容。这让我想知道是否应该这样做,或者我是否应该遍历收件人并一次发送一封电子邮件。如果你弄清楚了,我也会对答案感兴趣。祝你好运。 :)
  • API 刚刚损坏。它处于测试阶段。我花了一整天的时间试图找出我的 to 字段出了什么问题,通读了 rfc2822 文档,没有任何问题。最后切换回 SMTP,一切都很好,世界再次变得美好。可惜了。

标签: python mime gmail-api rfc2822


【解决方案1】:

在单个标头中与多个收件人(逗号分隔)一起发送时出现“标头无效”是 2014 年 8 月 25 日修复的回归问题。

【讨论】:

  • 谢谢你,埃里克。我刚刚再次测试了我的代码并成功发送到多个地址。
【解决方案2】:

正如 James 在其评论中所说,当 Python 对使用 SMTP 具有出色的文档支持时,您不应该浪费时间尝试使用 Gmail API:email 模块可以编写包含附件的消息,smtplib 发送它们。恕我直言,您可以将 Gmail API 用于开箱即用,但在出现问题时应使用 Python 标准库中强大的模块。

您似乎想发送纯文本消息:这是一个改编自 email 模块文档和来自 Mkyong.com 的 How to send email in Python via SMTPLIB 的解决方案:

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

msg = MIMEText('message body')
msg['Subject'] = 'subject text'
msg['From'] = 'me@address.com'
msg['To'] = 'Mary Smith <mary@x.test>, jdoe@example.org, "Who?" <60one@y.test>'

# Send the message via Gmail SMTP server.
gmail_user = 'youruser@gmail.com'
gmail_pwd = 'yourpassword'smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver = smtplib.SMTP('smtp.gmail.com')smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
smtpserver.send_message(msg)
smtpserver.quit()

【讨论】:

  • 感谢您提供的有用信息!我的应用程序没有获取用户的密码,但如果没有修复 Gmail API,这个答案将是一个有用的解决方法。我对您的回复投了赞成票,以便其他人知道如果/当 Gmail API 的开箱即用功能无法满足他们的需求时如何处理。
  • python 电子邮件模块很棒,我肯定会推荐使用它。 smtplib 可能对某些用户也有效(如果您可以在您的环境中建立 SMTP 连接),但对其他用户无效。对于服务器上的脚本可能很好,对于浏览器扩展可能不是......
  • @EricDeFrez 我真的无法理解您的评论:我使用电子邮件模块来完成它可以做的事情,撰写电子邮件。我使用 smtplib 来完成它可以做而电子邮件模块不能做的事情:发送消息。
  • email 模块很棒,非常适合编写电子邮件(创建 RFC822 格式的字符串)和解析它们。如果您可以与 smtp 服务器建立原始 TCP 连接,则 smtplib 非常好,但许多环境不允许这样做,例如:浏览器、云平台和家庭/托管服务提供商会因为垃圾邮件问题而阻止出站端口 25。
  • 这就是为什么在我的示例中我使用端口 587 的原因,该端口是为客户端经过身份验证的 SMTP 保留的,并通过 starttls 提供安全性。此端口通常不会被提供商阻止,并且是在公共网络上使用 SMTP 客户端(Thunderbird 等)时配置它们的正确方法。作为发送邮件的替代方案,您会提出什么建议?
【解决方案3】:

另见User.drafts reference - error"Invalid to header"

显然这个错误是最近在 Gmail API 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多