2015-04-02 32 views
5

Ich versuche, ein IMAP-Konto für den Zugriff auf MailKit mit (erstellt von jstedfast)Weiterleiten E-Mail mit MailKit (C#)

Ich verwalte die Meldung zum Download (als Mimemessage), und irgendwann muss ich "Weiterleiten" an ein anderes Konto.

Wie wäre der beste Weg, es zu tun, um alle Informationen der ursprünglichen E-Mail (Adressen, Header, Body Content, etc.) zu erhalten.

Danke!

Antwort

10

Verschiedene Leute meinen verschiedene Dinge, wenn sie "vorwärts" sagen, also schätze ich, dass ich Antworten auf die verschiedenen Bedeutungen liefern werde, die mir einfallen.

1. Weiterleiten (erneut senden) der Nachricht ohne Änderungen.

Mit "keine Änderungen", ich meine buchstäblich keine Änderungen an den rohen Nachrichtendaten. Der Weg, dies zu tun ist zu tun:

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

Normalerweise Menschen nicht diese Art von "Weiterleitung", obwohl. Wenn sie erneut senden möchten, verwenden sie normalerweise die nächste Methode zum erneuten Senden.

2. Weiterleiten (erneut senden) die Nachricht den Standard Weg.

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. Weiterleiten der Nachricht durch Anbringen (ganz) an eine neue Nachricht, die Art und Weise einige Mail-Clients es tun könnte.

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]")); 

// 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); 
} 
+2

Amazin Antwort. Danke vielmals! –

+2

kein problem, froh zu helfen! – jstedfast

+0

@jstedfast Ist Methode 3, wie die meisten Kunden, "zitieren die ursprüngliche Nachricht" in einer neuen Antwort? Dies sollte zu den schicken neuen [http://www.mimekit.net] (http://www.mimekit.net) hinzugefügt werden (Sieht gut aus! Aber seltsam vertraut) –