Reenviar correo electrónico usando mailkit (c#)

Un registro de mis problemas

estoy tratando de acceder a la cuenta IMAP usando mailkit (creado por jstedfast)
Me las arreglé para descargar el mensaje (como un mensaje de texto) y en algún momento tuve que "reenviarlo"a otra cuenta.
La mejor manera de guardar toda la información del correo electrónico original (dirección, título, contenido del cuerpo, etc.).
Gracias!

Solución correspondiente

diferentes personas tienen diferentes significados cuando dicen "adelante", así que creo que voy a dar respuestas a los diferentes significados que se me ocurren.
1. Reenviar (reenviar) mensajes sin cambios.
Lo que quiero decir con "sin cambios"literalmente significa que no hay cambios en los datos del mensaje original. Las formas de hacerlo son:
var message = FetchMessageFromImapServer ();

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.example.com", 465, true);
    client.Authenticate ("username", "password");

    var sender = new MailboxAddress ("My Name", "[email protected]");
    var recipients = new [] { new MailboxAddress ("John Smith", "[email protected]") };

    // This version of the Send() method uses the supplied sender and
    // recipients rather than getting them from the message's headers.
    client.Send (message, sender, recipients);

    client.Disconnect (true);
}
Nota: algunos proveedores de correo web como gmail, hotmail/Office 365 pueden no permitirle usar este método porque pueden pensar que es un engaño de correo electrónico. Estos hosts de correo pueden reemplazar la cabecera From con el nombre/Dirección de correo electrónico de su cuenta, por lo que tenga en cuenta este problema potencial.
Sin embargo, la gente no suele referirse a este tipo de "reenvío". Si quieren retransmitir, por lo general utilizan el siguiente método de retransmisión.
2. Reenviar (reenviar) mensajes de la manera que un filtro automático podría enviar.
var message = FetchMessageFromImapServer ();

// clear the Resent-* headers in case this message has already been Resent...
message.ResentSender = null;
message.ResentFrom.Clear ();
message.ResentReplyTo.Clear ();
message.ResentTo.Clear ();
message.ResentCc.Clear ();
message.ResentBcc.Clear ();

// now add our own Resent-* headers...
message.ResentFrom.Add (new MailboxAddress ("MyName", "[email protected]"));
message.ResentReplyTo.Add (new MailboxAddress ("MyName", "[email protected]"));
message.ResentTo.Add (new MailboxAddress ("John Smith", "[email protected]"));
message.ResentMessageId = MimeUtils.GenerateMessageId ();
message.ResentDate = DateTimeOffset.Now;

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.example.com", 465, true);
    client.Authenticate ("username", "password");

    // The Send() method will use the Resent-From/To/Cc/Bcc headers if
    // they are present.
    client.Send (message);

    client.Disconnect (true);
}
3. Reenviar mensajes adjuntando mensajes (en su conjunto) a nuevos mensajes, como algunos clientes de correo electrónico pueden hacer.
var messageToForward = FetchMessageFromImapServer ();

// construct a new message
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("MyName", "[email protected]"));
message.ReplyTo.Add (new MailboxAddress ("MyName", "[email protected]"));
message.To.Add (new MailboxAddress ("John Smith", "[email protected]"));
message.Subject = "FWD: " + messageToForward.Subject;

// now to create our body...
var builder = new BodyBuilder ();
builder.TextBody = "Hey John,\r\n\r\nHere's that message I was telling you about...\r\n";
builder.Attachments.Add (new MessagePart { Message = messageToForward });

message.Body = builder.ToMessageBody ();

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.example.com", 465, true);
    client.Authenticate ("username", "password");

    client.Send (message);

    client.Disconnect (true);
}
4. Reenviar mensajes "en línea"como muchos otros clientes de correo electrónico.
var messageToForward = FetchMessageFromImapServer ();

// construct a new message
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("MyName", "[email protected]"));
message.ReplyTo.Add (new MailboxAddress ("MyName", "[email protected]"));
message.To.Add (new MailboxAddress ("John Smith", "[email protected]"));
message.Subject = "FWD: " + messageToForward.Subject;

// now to create our body...
var builder = new BodyBuilder ();

using (var writer = new StringWriter ()) {
    var sender = messageToForward.From.Mailboxes.FirstOrDefault () ?? messageToForward.Sender;
    var senderName = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "someone";
    var text = messageToForward.TextBody ?? string.Empty;

    writer.WriteLine ("On {0}, {1} wrote:", messageToForward.Date, senderName);

    using (var reader = new StringReader (text)) {
        string line;

        while ((line = reader.ReadLine ()) != null) {
            writer.Write ("> ");
            writer.WriteLine (line);
        }
    }

    builder.TextBody = writer.ToString ();
}

message.Body = builder.ToMessageBody ();

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.example.com", 465, true);
    client.Authenticate ("username", "password");

    client.Send (message);

    client.Disconnect (true);
}