【问题标题】:GMail API Emails BouncingGMail API 电子邮件弹跳
【发布时间】:2015-03-23 05:03:05
【问题描述】:

在 .Net 中使用 GMail API。使用 Net.Mail.MailMessage 创建消息。然后使用 MimeKit 创建 MimeMessage(使用它发送附件 + HTML 消息)。将 MimeMessage.ToString 传递给 Base64 编码器。没有 API 错误。代码运行正常。我可以在 GMail 的已发送页面中看到该消息。邮件看起来很完美(发送实际上返回消息 ID)。但随后在 Gmail 中的这封邮件中附加了以下消息。

Bounce <nobody@gmail.com>

An error occurred. Your message was not sent.

与往常一样,没有来自 Google 的其他信息。如何解决这个问题?

        Dim msg = New Net.Mail.MailMessage
        msg.Subject = subject
        msg.To.Add(New MailAddress(ToEmail))
        msg.From = New MailAddress(FromEmail, SenderName)
        msg.ReplyTo = New MailAddress(FromEmail, SenderName)
        msg.Body = bodyText
        msg.IsBodyHtml = True

        If Not String.IsNullOrWhiteSpace(fileAttachment) Then
            If System.IO.File.Exists(fileAttachment) Then
                Dim Attachment As New Net.Mail.Attachment(fileAttachment, "application/pdf")
                msg.Attachments.Add(Attachment)
            End If
        End If
       Dim message As MimeMessage = MimeMessage.CreateFromMailMessage(msg)
       Dim newMsg = New Google.Apis.Gmail.v1.Data.Message()
       newMsg.Raw = Base64UrlEncode(message.ToString)
       GmailService.Users.Messages.Send(newMsg, "me").Execute()



Private Function Base64UrlEncode(ByVal input As String) As String
            Dim inputBytes = System.Text.Encoding.UTF8.GetBytes(input)
            'Special "url-safe" base64 encode.
            Return Convert.ToBase64String(inputBytes).Replace("+", "-").Replace("/", "_").Replace("=", "")
        End Function

这是返回消息。如您所见,一切看起来都很好。使用 Google API 是最令人沮丧的事情。

200 OK

- Hide headers -

cache-control:  no-cache, no-store, max-age=0, must-revalidate
content-encoding:  gzip
content-length:  85
content-type:  application/json; charset=UTF-8
date:  Sat, 24 Jan 2015 05:57:21 GMT
etag:  "96Z6JVARoyR8skov3RseF4DCFpA/mFWFskkdSFxyjIhRJHJuhDCBvfY"
expires:  Fri, 01 Jan 1990 00:00:00 GMT
pragma:  no-cache
server:  GSE
vary:  Origin, X-Origin

{
 "id": "14b1a841e4fff910",
 "threadId": "14b1a841e4fff910",
 "labelIds": [
  "SENT"
 ]
}

【问题讨论】:

  • 首先尝试让它在API Explorer 中运行,另见stackoverflow.com/a/24461102/1545993
  • API Explorer 中的结果相同。消息通过但未送达。是的,我读了那页。我正是这样做的。我的问题是,如果格式有问题,GMail API 应该抛出异常。此外,当我检查 Gmail 发送文件夹时,邮件看起来很完美。这意味着数据结构和格式很好。有没有办法与这些出色的 Google 开发人员取得联系?
  • 使用示例消息,对其进行base64编码并检查,如果得到相同的结果,请先使用API​​ Explorer运行它...

标签: gmail-api


【解决方案1】:

这太疯狂了。这就是问题所在。

这一行

msg.ReplyTo = New MailAddress(FromEmail, SenderName)

出于任何原因(我猜 FromEmail 和 ReplyTo 是相同的电子邮件)将 RFC2822 Reply-To 参数留空。即使注释了msg.ReplyTo,该参数也保持空白。毋庸置疑,GMail API 似乎存在将回复留空的问题。绝对是一个编程错误。

所以我不得不在最终的 RFC2882 消息中做这个 hack。

inputTxt = Replace(inputTxt, "Reply-To:", "Reply-To: " & FromEmail)

现在可以了。

********* 正如下面评论中所指出的,您可以改用MailMessage.ReplyToList.Add() 来解决此问题。所以这里的问题是在 Gmail API 中需要ReplyTo 地址(即使有人可能认为ReplyTo 应该默认为From 电子邮件)。 **********

【讨论】:

  • 是的,Reply-To 留空是个问题。但是它不能使用 url 编码的 base64 的原因是使用了已弃用的MailMessage.ReplyTo。如果你改用MailMessage.ReplyToList.Add(),一切正常。
【解决方案2】:

以防万一有人偶然发现这个并想要一个 C# 答案,这是我能够使用以前的答案作为指导的工作,MimeKit

public void SendEmail(MyInternalSystemEmailMessage email)
{
    var mailMessage = new System.Net.Mail.MailMessage();
    mailMessage.From = new System.Net.Mail.MailAddress(email.FromAddress);
    mailMessage.To.Add(email.ToRecipients);
    mailMessage.ReplyToList.Add(email.FromAddress);
    mailMessage.Subject = email.Subject;
    mailMessage.Body = email.Body;
    mailMessage.IsBodyHtml = email.IsHtml;

    foreach (System.Net.Mail.Attachment attachment in email.Attachments)
    {
        mailMessage.Attachments.Add(attachment);
    }

    var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);

    var gmailMessage = new Google.Apis.Gmail.v1.Data.Message {
        Raw = Encode(mimeMessage.ToString())
    };

    Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, ServiceEmail);

    request.Execute();
}

public static string Encode(string text)
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);

    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('/', '_')
        .Replace("=", "");
}

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2014-10-30
    • 2018-01-26
    • 2021-10-14
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2017-03-07
    相关资源
    最近更新 更多