如何向多个收件人发送消息?

12 投票
3 回答
4238 浏览
提问于 2025-04-18 18:08

我在使用Gmail API发送消息到多个地址时遇到了一些问题。我已经成功地发送了一封邮件到一个地址,但当我在'To'字段中加入多个用逗号分隔的地址时,就出现了以下错误:

发生错误:<HttpError 400,当请求
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)

3 个回答

0

另请查看 User.drafts 参考 - 错误 "无效的收件人头"

显然,这个问题是最近在 Gmail API 中出现的一个 bug。

1

正如詹姆斯在评论中提到的,你不应该浪费时间去使用Gmail的API,因为Python有很好的文档支持SMTP。你可以用email模块来编写包含附件的邮件,而smtplib模块则负责发送这些邮件。在我看来,如果你想要简单直接的功能,可以使用Gmail的API,但当遇到问题时,还是应该使用Python标准库中那些更可靠的模块。

看起来你想发送一条只有文本的消息:这里有一个根据email模块文档改编的解决方案,以及来自Mkyong.com的如何通过SMTPLIB在Python中发送邮件的链接:

# 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()
2

在2014年8月25日之前,当你在一个邮件头里用逗号分隔多个收件人时,如果出现“无效的收件人头”这个错误,那是个问题。这个问题后来被修复了。

撰写回答