ответ на электронную почту в С#

Как ответить на сообщение электронной почты с помощью API gmail в c# asp.net, чтобы он сохранял следы всех сообщений. Есть решения для python, php, javascript онлайн, но нет для c#. Я могу получить детали сообщения, но не знаю, как ответить.

Мой код для получения сообщения:

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();
    }
}

Получение идентификатора сообщения, но без References и In-Rely-To для первого письма. Может отправить простое сообщение электронной почты с помощью MimeKit, но понятия не имеет об ответе.

Любая помощь будет оценена по достоинству. Заранее спасибо!!


person Preet    schedule 10.11.2017    source источник
comment
Вы можете попробовать примеры в SO post 1 и сообщение SO 2. Оба использовали SmtpClient, на который вы можете ссылаться из данная документация от MSDN.   -  person MαπμQμαπkγVπ.0    schedule 12.11.2017
comment
Спасибо, попробую этот способ, если он работает и с gmai API.   -  person Preet    schedule 13.11.2017


Ответы (1)


Наконец-то смог сделать это с помощью ответа на это. Просто публикую ответ если кто хочет.

Прежде всего, получите конкретное сообщение в формате RAW, используя API gmail, на которое вы хотите ответить, и преобразуйте его в MimeMessage, чтобы передать его методу Reply для создания ответного сообщения и, наконец, отправить его:

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();
}

Метод ответа:

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;
}
person Preet    schedule 14.11.2017