GMail API 邮件退回
GMail API Emails Bouncing
在 .Net 中使用 GMail API。使用 Net.Mail.MailMessage 创建消息传递。然后使用 MimeKit 创建 MimeMessage(使用它来发送附件 + HTML 消息)。将 MimeMessage.ToString 传递给 Base64 编码器。没有 API 错误。代码运行通过ok。我可以在 GMail 的已发送页面中看到消息。邮件看起来很完美(实际上发送 return 邮件 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
这是 return 消息。如您所见,一切正常。与 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"
]
}
这太疯狂了。这就是问题所在。
这一行
msg.ReplyTo = New MailAddress(FromEmail, SenderName)
出于某种原因(我猜 FromEmail 和 ReplyTo 是同一封电子邮件)将 RFC2822 Reply-To
参数留空。即使注释了 msg.ReplyTo
,该参数仍为空。不用说 GMail API 似乎有 Reply-To 留空的问题。绝对是一个编程错误。
所以我不得不在最后的 RFC2882 消息中进行修改。
inputTxt = Replace(inputTxt, "Reply-To:", "Reply-To: " & FromEmail)
现在有效。
********* 正如下面的评论所指出的,您可以使用 MailMessage.ReplyToList.Add()
来解决这个问题。所以这里的问题是 Gmail API 中需要 ReplyTo
地址(即使有人可能认为 ReplyTo
应该默认为 From
电子邮件)。 **********
以防万一有人偶然发现这个问题并想要一个 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("=", "");
}
在 .Net 中使用 GMail API。使用 Net.Mail.MailMessage 创建消息传递。然后使用 MimeKit 创建 MimeMessage(使用它来发送附件 + HTML 消息)。将 MimeMessage.ToString 传递给 Base64 编码器。没有 API 错误。代码运行通过ok。我可以在 GMail 的已发送页面中看到消息。邮件看起来很完美(实际上发送 return 邮件 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
这是 return 消息。如您所见,一切正常。与 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"
]
}
这太疯狂了。这就是问题所在。
这一行
msg.ReplyTo = New MailAddress(FromEmail, SenderName)
出于某种原因(我猜 FromEmail 和 ReplyTo 是同一封电子邮件)将 RFC2822 Reply-To
参数留空。即使注释了 msg.ReplyTo
,该参数仍为空。不用说 GMail API 似乎有 Reply-To 留空的问题。绝对是一个编程错误。
所以我不得不在最后的 RFC2882 消息中进行修改。
inputTxt = Replace(inputTxt, "Reply-To:", "Reply-To: " & FromEmail)
现在有效。
********* 正如下面的评论所指出的,您可以使用 MailMessage.ReplyToList.Add()
来解决这个问题。所以这里的问题是 Gmail API 中需要 ReplyTo
地址(即使有人可能认为 ReplyTo
应该默认为 From
电子邮件)。 **********
以防万一有人偶然发现这个问题并想要一个 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("=", "");
}