2017-11-10 2 views
1

Antwort auf eine E-Mail-Nachricht mit Gmail-API in c# asp.net, so dass es Spuren aller Nachrichten machen. Got Lösungen für python, php, javascript online, aber nicht für c#. Ich kann Nachrichtendetails erhalten, weiß aber nicht, wie ich antworten soll.Antwort auf E-Mail in C#

Mein Code für Nachricht bekommen:

public void getmessage() 
{ 
    UserCredential credential; 
    using (var stream = 
     new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
    { 
     string credPath = System.Environment.GetFolderPath(
      System.Environment.SpecialFolder.Personal); 
     credPath = Path.Combine(credPath, ".credentials/gmail-dotnet-quickstart2.json"); 

     credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
      GoogleClientSecrets.Load(stream).Secrets, 
      Scope, 
      "user", 
      CancellationToken.None, 
      new FileDataStore(credPath, true)).Result; 
     Console.WriteLine("Credential file saved to: " + credPath); 
    } 
    var service = new GmailService(new BaseClientService.Initializer() 
    { 
     HttpClientInitializer = credential, 
     ApplicationName = ApplicationName, 
    }); 
    var re = service.Users.Messages.List("me"); 
    re.LabelIds = "INBOX"; 
    re.Q = "from:emailaddress AND subject:subject"; 

    var res = re.Execute(); 

    if (res != null && res.Messages != null) 
    { 
     DataTable dt = new DataTable("msgs"); 
     dt.Columns.Add("Date"); 
     dt.Columns.Add("From"); 
     dt.Columns.Add("Subject"); 
     dt.Columns.Add("Body"); 
     foreach (var email in res.Messages) 
     { 
      var emailInfoReq = service.Users.Messages.Get("me", email.Id); 
      var emailInfoResponse = emailInfoReq.Execute(); 
      if (emailInfoResponse != null) 
      { 
       String from = ""; 
       String date = ""; 
       String subject = ""; 
       String body = ""; 
       //loop through the headers and get the fields we need... 
       foreach (var mParts in emailInfoResponse.Payload.Headers) 
       { 
        if (mParts.Name == "Date") 
        { 
         date = mParts.Value; 
        } 
        else if (mParts.Name == "From") 
        { 
         from = mParts.Value; 
        } 
        else if (mParts.Name == "Subject") 
        { 
         subject = mParts.Value; 
        } 
        //else if (mParts.Name == "Message-ID") 
        //{ 
        // var abc = mParts.Value; 
        //} 
        if (date != "" && from != "") 
        { 
         if (emailInfoResponse.Payload.Parts == null && emailInfoResponse.Payload.Body != null) 
          body = DecodeBase64String(emailInfoResponse.Payload.Body.Data); 
         else 
          body = GetNestedBodyParts(emailInfoResponse.Payload.Parts, ""); 

        } 
       } 
       DataRow row = dt.NewRow(); 
       row[0] = date; 
       row[1] = from; 
       row[2] = subject; 
       row[3] = body; 
       dt.Rows.Add(row); 
      } 
     } 
     GridView1.DataSource = dt; 
     GridView1.DataBind(); 
    } 
} 

Message-ID auch bekommen aber keine Referenzen und In-Bauen-To für die erste E-Mail. Kann einfache E-Mail-Nachricht senden mit MimeKit aber keine Ahnung über die Antwort.

Jede Hilfe wäre willkommen. Vielen Dank im Voraus!!

+0

Sie können die Beispiele versuchen, in [SO Beitrag 1] (https://stackoverflow.com/questions/45371120/send-a-mail-as-a-reply-using-smtpclient) und [ SO post 2] (https://stackoverflow.com/questions/449887/sending-e-mail-using-c-sharp). Beide verwendeten den "SmtpClient", auf den Sie von [dieser Dokumentation per MSDN] verweisen können (http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage (VS.80) .aspx) . –

+0

Danke, versuche es auf diese Weise, wenn es auch mit gmai API funktioniert – Preet

Antwort

0

Schließlich in der Lage, es mit Hilfe der Antwort zu tun this. Just Post Antwort wenn jemand will.

Zunächst einmal bekommen bestimmte Nachricht im RAW-Format gmail-API, die Sie wollen die Antwort verwenden und es zu Mimemessage zu wandeln es passieren Methode zu antworten Antwortnachricht zu erstellen und schließlich senden:

var emailInfoReq = service.Users.Messages.Get("me", email.Id); 
emailInfoReq.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw; 
var emailInfoResponse = emailInfoReq.Execute(); 
if (emailInfoResponse != null) 
{ 
    var message = emailInfoResponse.Raw; 
    byte[] Msg = Base64UrlDecode(message); 
    MemoryStream mm = new MemoryStream(Msg); 
    MimeKit.MimeMessage Message1 = MimeKit.MimeMessage.Load(mm); 
    MimeKit.MimeMessage Message = Reply(Message1, false); 
    Message message1 = new Message(); 
    message1.Raw = Base64UrlEncode(Message.ToString()); 
    var result = service.Users.Messages.Send(message1, "me").Execute(); 
} 

Die Antworten Methode:

public static MimeKit.MimeMessage Reply(MimeKit.MimeMessage message, bool replyToAll) 
{ 
var reply = new MimeKit.MimeMessage(); 
if (message.ReplyTo.Count > 0) 
    { 
    reply.To.AddRange(message.ReplyTo); 
    } 
else if (message.From.Count > 0) 
    { 
    reply.To.AddRange(message.From); 
    } 
    else if (message.Sender != null) 
    { 
    reply.To.Add(message.Sender); 
    } 
    if (replyToAll) 
    { 
    reply.To.AddRange(message.To); 
    reply.Cc.AddRange(message.Cc); 
    } 
    if (!message.Subject.StartsWith("Re:", StringComparison.OrdinalIgnoreCase)) 
    reply.Subject = "Re:" + message.Subject; 
    else 
    reply.Subject = message.Subject; 
    if (!string.IsNullOrEmpty(message.MessageId)) 
    { 
    reply.InReplyTo = message.MessageId; 
    foreach (var id in message.References) 
     reply.References.Add(id); 
     reply.References.Add(message.MessageId); 
    } 
    using (var quoted = new StringWriter()) 
    { 
    var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault(); 
    quoted.WriteLine("On {0}, {1} wrote:", message.Date.ToString("f"), !string.IsNullOrEmpty(sender.Name) ? sender.Name : sender.Address); 
    using (var reader = new StringReader(message.TextBody)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
     quoted.Write("> "); 
     quoted.WriteLine(line); 
     } 
    } 
    reply.Body = new MimeKit.TextPart("plain") 
    { 
     Text = quoted.ToString() 
    }; 
    } 
    return reply; 
}