GMail API电子邮件弹跳

All*_*ing 8 gmail-api

在.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.
Run Code Online (Sandbox Code Playgroud)

像往常一样,谷歌没有其他信息.如何解决这个问题?

        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
Run Code Online (Sandbox Code Playgroud)

这是返回消息.你可以看到一切看起来都不错.使用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"
 ]
}
Run Code Online (Sandbox Code Playgroud)

All*_*ing 5

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

这条线

msg.ReplyTo = New MailAddress(FromEmail, SenderName)
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因(我猜当 FromEmail 和 ReplyTo 是相同的电子邮件时)将 RFC2822Reply-To参数留空。即使msg.ReplyTo被注释,该参数仍为空白。毋庸置疑,GMail API 似乎存在将 Reply-To 留空的问题。绝对是一个编程错误。

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

inputTxt = Replace(inputTxt, "Reply-To:", "Reply-To: " & FromEmail)
Run Code Online (Sandbox Code Playgroud)

它现在有效。

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

  • 是的,“回复”留空是一个问题。但它无法实现 url 编码的 base64 的原因是使用了已弃用的“MailMessage.ReplyTo”。如果您使用“MailMessage.ReplyToList.Add()”,则一切正常。 (2认同)