2017-02-22 41 views
-1

Я использую следующий код для отправки электронной почты в GMAIL с помощью Google API:Ошибка отправки Gmail с помощью Google API

using Google.Apis.Auth.OAuth2; 
using Google.Apis.Gmail.v1; 
using Google.Apis.Gmail.v1.Data; 
using Google.Apis.Services; 
using Google.Apis.Util.Store; 
using System.Net.Mail; 
using MimeKit; 
using System.Configuration; 


    class Program 
    { 
     static string credPath; 
     static string credPath1; 
     static string[] Scopes = 
     {   
      GmailService.Scope.GmailModify,      
      "https://www.googleapis.com/auth/gmail.compose", 
      "https://www.googleapis.com/auth/gmail.send", 
      "https://www.googleapis.com/auth/userinfo.email"    
     };  

     static void Main(string[] args) 
     { 
      try 
      { 
       Console.WriteLine("Please Enter Your Mail Id"); 
       string usr = Console.ReadLine(); 
       UserCredential credential; 
       using (var stream = 
       new FileStream("client_secret.json", FileMode.Open, FileAccess.ReadWrite)) 
       { 
        credPath =System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
        credPath = Path.Combine(credPath, "credentials/gmail-dotnet-quickstart.json");    
        credential = GoogleWebAuthorizationBroker.AuthorizeAsync 
         (
         GoogleClientSecrets.Load(stream).Secrets, 
         Scopes, 
         "me", 
         CancellationToken.None, 
         new FileDataStore((credPath), false) 
         ).Result; 

       } 
       var gmail = new GmailService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential      
       }); 


       var message = new MimeMessage(); 
      message.From.Add(new MailboxAddress("Saikam Nagababu", usr)); 
      message.To.Add(new MailboxAddress("Saikam Nagababu", "[email protected]")); 
      message.Subject = "How you doin?"; 
      message.Body = new TextPart("plain") 
      { 
       Text = @"Hey Alice" 
      }; 


      var rawMessage = ""; 
      using (var stream = new MemoryStream()) 
      { 

       message.WriteTo(stream); 
       rawMessage = Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length) 
        .Replace('+', '-') 
        .Replace('/', '_') 
        .Replace("=", ""); 
      } 
      var gmailMessage = new Google.Apis.Gmail.v1.Data.Message { Raw = rawMessage }; 

      Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = gmail.Users.Messages.Send(gmailMessage, usr); 
      request.Execute(); 
      } 
      catch(Exception e) 
      { 

       throw e; 

      } 
     } 

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

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

Я получаю следующее сообщение об ошибке:

Google.GoogleApiException occurred 
HResult=-2146233088 
Message=An Error occurred, but the error response could not be deserialized 
Source=Google.Apis 
ServiceName=gmail 
StackTrace: 
at Google.Apis.Services.BaseClientService.<DeserializeError>d__34.MoveNext() 
InnerException: Newtonsoft.Json.JsonReaderException 
HResult=-2146233088 
Message=Unexpected character encountered while parsing value: <. Path '', line 0, position 0. 
Source=Newtonsoft.Json 
StackTrace: 
at Newtonsoft.Json.JsonTextReader.ParseValue() 
at Newtonsoft.Json.JsonTextReader.ReadInternal() 
at Newtonsoft.Json.JsonTextReader.Read() 
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReaderreader, JsonContract contract, Boolean hasConverter) 
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReaderreader, Type objectType, Boolean checkAdditionalContent) 
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType) 
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) 
at Newtonsoft.Json.JsonConvert.DeserializeObject(Stringvalue, Type type, JsonSerializerSettings settings) 
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value,JsonSerializerSettings settings) 
at Google.Apis.Json.NewtonsoftJsonSerializer.Deserialize[T](String input) 
at Google.Apis.Services.BaseClientService.<DeserializeError>d__34.MoveNext() 
InnerException:
+2

Ошибка говорит, что ответ не может быть десериализован, вам нужно выяснить, что отправляется назад, возможно, используя что-то вроде Fiddler. – DavidG

+0

@DavidG, пожалуйста, предложите мне то, что мне нужно для десериализации. (Например: объект службы gmail), как десериализовать с помощью Fiddler – Nagababu

+0

Я не знаю, что ответ, который вы получаете, говорит, что вам решать, чтобы понять. Я предлагал использовать Fiddler в качестве прокси для просмотра HTTP-запросов между вами и Google. – DavidG

ответ

1

Я думаю, что вы получили ошибка, поскольку сообщение gmail, которое вы создаете в коде, имеет неверный формат.

В вашем коде вы пытаетесь преобразовать System.Net.Mail.MailMessage в исходный текст. Но когда вы вызываете ToString на объект MailMessage, он просто возвращает строку, которая представляет экземпляр объекта, а не его содержимое.

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

Для преобразования System.Net.Mail.MailMessage в необработанный текст, вы можете ссылаться на эту ссылку Convert MailMessage to Raw.

Я не пытался конвертировать System.Net.Mail.MailMessage в Gmail. Но я испытал преобразование MimeKit.MimeMessage - Gmail.

Во-первыхи, вы создаете MimeMessage

var message = new MimeMessage(); 
message.From.Add (new MailboxAddress ("Joey", "[email protected]")); 
message.To.Add (new MailboxAddress ("Alice", "[email protected]")); 
message.Subject = "How you doin?"; 
message.Body = new TextPart ("plain") { 
    Text = @"Hey Alice" 
}; 

Затем преобразовать его в Gmail используя следующие коды

var rawMessage = ""; 
using (var stream = new MemoryStream()) { 

    message.WriteTo (stream); 
    rawMessage = Convert.ToBase64String (stream.GetBuffer(), 0, (int) stream.Length) 
     .Replace ('+', '-') 
     .Replace ('/', '_') 
     .Replace ("=", ""); 
} 
var gmailMessage = new Google.Apis.Gmail.v1.Data.Message 
       { Raw = rawMessage }; 

Надеются, что это может помочь.

+0

он не работает. У меня такая же ошибка..пожалуйста, предложите мне – Nagababu

+0

Какой метод вы используете, MimeMessage или еще System.Net. Mail.MailMessage? –

+0

какой метод вы предлагаете мне MimeMessage(). – Nagababu