2015-01-24 2 views
7

.Net에서 GMail API를 사용 중입니다. Net.Mail.MailMessage를 사용하여 메시징 작성. 그런 다음 MimeKit을 사용하여 MimeMessage를 만듭니다 (첨부 파일 + HTML 메시지 보내기를 사용하여). Base64 인코더에 MimeMessage.ToString을 전달합니다. API 오류가 없습니다. 코드가 정상적으로 실행됩니다. Gmail의 보낸 페이지에서 메시지를 볼 수 있습니다. Mail은 완벽하게 보입니다 (실제로 send는 메시지 id를 반환합니다). Gmail에는이 메일에 다음과 같은 추가 메시지가 있습니다.Gmail API 이메일 수신 거부

Bounce <[email protected]> 

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" 
] 
} 
+0

시도가가 [API 탐색기]에서 실행 얻을 수 (https://developers.google.com/gmail/api/v1/reference/users/messages/send#try-it) 첫째, 참조 http://stackoverflow.com/a/24461102/1545993 – Taifun

+0

API 탐색기에서와 동일한 결과가 나타납니다. 메시지는 전달되지만 배달되지 않습니다. 네, 그 페이지를 읽었습니다. 나는 그것을 정확하게하고있다. 내 문제는 형식에 뭔가 잘못이있는 경우, GMail API는 예외를 throw해야합니다. 또한 Gmail 전송 폴더를 체크인 할 때 메일이 완벽하게 보입니다. 즉, 데이터 구조와 형식이 잘되었음을 의미합니다. 이 뛰어난 Google 개발자와 연락 할 수있는 방법이 있습니까? –

+0

예제 메시지를 사용하여 base64로 인코딩 한 다음 동일한 결과를 얻으면 API 탐색기를 사용하여 먼저 실행하십시오. – Taifun

답변

4

이것은 미친 짓입니다. 이것이 문제였습니다.

이 줄 어떤 이유로

msg.ReplyTo = New MailAddress(FromEmail, SenderName) 

(FromEmail 및 ReplyTo의이 같은 이메일 때 같아요)는 RFC2822 Reply-To 매개 변수를 비워 둡니다. msg.ReplyTo이 주석 처리 되더라도 매개 변수는 공백으로 남습니다. 말할 것도없이 GMail API는 공백으로 남겨진 Reply-To에 문제가있는 것 같습니다. 가장 확실한 프로그래밍 버그.

그래서 마지막 RFC2882 메시지에서이 해킹을 수행해야했습니다.

이제 작동합니다.

********* 아래의 설명에서 지적한대로 MailMessage.ReplyToList.Add()을 사용하면이 문제를 해결할 수 있습니다. 따라서 문제는 ReplyTo이 Gmail API에 필요하다는 것입니다 (비록 ReplyTo이 기본값으로 From 이메일이되어야한다고 생각할지라도). **********

+1

예, 'Reply-To'가 공백으로 남습니다. 그러나 그것이 base64로 인코딩 된 것을 URL로 만들지 않는 이유는 더 이상 사용되지 않는'MailMessage.ReplyTo'의 사용법입니다. 'MailMessage.ReplyToList.Add()'를 대신 사용하면 모든 것이 잘 동작합니다. – jansokoly

+0

@jansokoly 네, 네 말이 맞아. –

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("=", ""); 
} 
관련 문제