无法通过 gmail api 向多个发件人发送电子邮件

Posted

技术标签:

【中文标题】无法通过 gmail api 向多个发件人发送电子邮件【英文标题】:Unable to send email via gmail api to multiple senders 【发布时间】:2014-10-14 11:04:16 【问题描述】:

我们在 ios 上使用新的 gmail api 来发送电子邮件,一切都适用于单个收件人的邮件。当我们在“to”字段中指定多个时,我们会收到以下错误:

Error Domain=com.google.GTLJSONRPCErrorDomain Code=400 "The operation couldn’t be completed. (Invalid to header)

我已验证我们发送的内容实际上是有效的 rfc822 消息。

【问题讨论】:

只使用 python 客户端得到同样的错误 您能否包含实际产生错误的代码? iOS 版本可能也会有帮助。尝试准备好this,然后编辑您的问题 iOS版本和示例代码与本题无关,请勿喷。正如我所提到的,我们已经验证了通过 gmail api 发送的 rfc822 消息是有效的,但是当指定多个收件人时会导致错误。就这么简单。 我在使用 C# api 创建草稿时遇到了同样的问题。一个收件人工作正常,多个收件人给出“无效标题”错误消息。 在这里回答:***.com/questions/25437820/… 【参考方案1】:

您应该在 to 字段中使用列表。

例如:

[ "liz6beigle@hotmail.com",
  "another.one@email.com" ]

Gmail 对您可以同时发送的退回邮件和收件人有限制。

您不能将多封电子邮件存储在一个字符串下。 在每一行放置一个电子邮件地址将提供更好的可读性并防止解析错误。

这是来自 google 的 Java 代码示例。我希望它会帮助其他人理解:

 /**
   * Create a MimeMessage using the parameters provided.
   *
   * @param to Email address of the receiver.
   * @param from Email address of the sender, the mailbox account.
   * @param subject Subject of the email.
   * @param bodyText Body text of the email.
   * @return MimeMessage to be used to send email.
   * @throws MessagingException
   */
  public static MimeMessage createEmail(String to, String from, String subject,
      String bodyText) throws MessagingException 
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    MimeMessage email = new MimeMessage(session);
    InternetAddress tAddress = new InternetAddress(to);
    InternetAddress fAddress = new InternetAddress(from);

    email.setFrom(new InternetAddress(from));
    email.addRecipient(javax.mail.Message.RecipientType.TO,
                       new InternetAddress(to));
    email.setSubject(subject);
    email.setText(bodyText);
    return email;
  

Gmail API : Sending Messages

检查第一个代码示例。

【讨论】:

感谢您的帮助,但您不能在 to 行中指定多个地址的说法不正确。如果您查看 RFC 822,您会发现这实际上是指定多个收件人的推荐方法。【参考方案2】:

这是一个回归,但我们在 2014 年 8 月 25 日星期一完成了修复的部署。

【讨论】:

【参考方案3】:

我认为你可以做到以下几点

像这样获取“收件人”字段 "test1@example.com, test2@example.com"

然后用','分割它

String mail1 = "test1@example.com";
String mail2 = "test2@example.com";

然后这样做

email.addRecipient(javax.mail.Message.RecipientType.TO,
                   new InternetAddress(mail1));
email.addRecipient(javax.mail.Message.RecipientType.TO,
                   new InternetAddress(mail2));

我检查了这个 成功了

【讨论】:

问题是关于iOS,所以Java 的回答没有多大帮助。 这对我有帮助,因为我正在使用 java,所以谢谢!尽管我知道它是针对 IOS 用户的【参考方案4】:

您可以使用逗号分隔的电子邮件并循环浏览这些电子邮件

    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    MimeMessage email = new MimeMessage(session);
    Multipart multiPart = new MimeMultipart("alternative");
    email.setFrom(new InternetAddress(from));


    String to = "xyz@gmail.com,sjaksks@gmail.cm,hysrtt@gmail.com";
    String[] split = to.split(",");
    for(int i=0;i<split.length;i++) 
        email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(split[i]));
    


    email.setSubject(subject);

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText(text, "utf-8");

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(html, "text/html; charset=utf-8");

    multiPart.addBodyPart(textPart);
    multiPart.addBodyPart(htmlPart);
    email.setContent(multiPart);
    return email;

【讨论】:

【参考方案5】:

我与 gmail 团队进行了交流,他们确实确认这实际上是他们的 api 的错误。不确定什么时候会修复,因为他们没有提供更多细节,但他们正在关注。

【讨论】:

以上是关于无法通过 gmail api 向多个发件人发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 nodemailer 发送电子邮件 |发件人“电子邮件 id@gmail.com>”无效

Gmail API .NET:如何向一位发件人请求邮件

作为发件人,使用 API 或标头,是不是可以检测电子邮件是不是使用 Gmail 的“计划发送”发送?

收件人地址需要代码”:400 在 Laravel PHP 中使用 Gmail API 发送电子邮件

使用 PHP 向使用 Gmail API 发送的电子邮件添加密件抄送

PHP Gmail API:可以发送电子邮件但如何添加收件人电子邮件