Ответ на письмо в Mailkit

Я использую библиотеку Mailkit (Imap) для своего проекта.

Я могу с комфортом отправить новое сообщение с помощью SmtpClient.

сейчас копаюсь, как ответить на конкретное письмо. и можно ли добавить больше получателей к этому ответному письму?

@jstedfast спасибо за чудесный :)


person karthikkumar subramaniam    schedule 30.01.2016    source источник
comment
Не благодарите, просто примите ответ :)   -  person Gene    schedule 30.01.2016


Ответы (1)


Ответить на сообщение довольно просто. По большей части вы просто создаете ответное сообщение так же, как и любое другое сообщение. Есть только несколько небольших отличий:

  1. В ответном сообщении вы захотите поставить перед заголовком Subject префикс "Re: ", если префикс еще не существует в сообщении, на которое вы отвечаете (другими словами, если вы отвечаете на сообщение с Subject из "Re: party tomorrow night!", вы не перед ним будет другой "Re: ").
  2. Вам нужно установить заголовок In-Reply-To ответного сообщения равным значению заголовка Message-Id в исходном сообщении.
  3. Вам нужно скопировать заголовок References исходного сообщения в заголовок References ответного сообщения, а затем добавить заголовок Message-Id исходного сообщения.
  4. Вы, вероятно, захотите «процитировать» текст исходного сообщения в ответе.

Если бы эту логику выразить в коде, это могло бы выглядеть примерно так:

public static MimeMessage Reply (MimeMessage message, bool replyToAll)
{
    var reply = new MimeMessage ();

    // reply to the sender of the message
    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) {
        // include all of the other original recipients - TODO: remove ourselves from these lists
        reply.To.AddRange (message.To);
        reply.Cc.AddRange (message.Cc);
    }

    // set the reply subject
    if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase))
        reply.Subject = "Re:" + message.Subject;
    else
        reply.Subject = message.Subject;

    // construct the In-Reply-To and References headers
    if (!string.IsNullOrEmpty (message.MessageId)) {
        reply.InReplyTo = message.MessageId;
        foreach (var id in message.References)
            reply.References.Add (id);
        reply.References.Add (message.MessageId);
    }

    // quote the original message text
    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 TextPart ("plain") {
            Text = quoted.ToString ()
        };
    }

    return reply;
}

Примечание. В этом коде предполагается, что message.TextBody не равно нулю. Это возможно, хотя и весьма маловероятно (это означает, что сообщение не содержит text/plain тела).

person jstedfast    schedule 30.01.2016
comment
Кроме того, в моем случае мне пришлось установить свойство reply.Sender, чтобы избежать исключения при выполнении smtpClient.send (reply) - person simply good; 16.10.2018
comment
Могу ли я узнать, как отправить вышеуказанный MimeMessage после возврата reply? - person gymcode; 24.10.2019
comment
Прочтите MailKit README. - person jstedfast; 24.10.2019