2015-04-02 17 views
5

Sto cercando di accedere ad un account IMAP utilizzando MailKit (creato da jstedfast)mail Inoltra utilizzando MailKit (C#)

riesco a scaricare il messaggio (come MIMEMessage), e ad un certo punto ho bisogno di "inoltralo" a un altro account.

Come sarebbe il modo migliore per farlo, al fine di conservare tutte le informazioni dell'email originale (indirizzi, intestazioni, contenuto del corpo, ecc.).

Grazie!

risposta

10

Diverse persone significano cose diverse quando dicono "avanti", quindi credo che fornirò le risposte ai diversi significati a cui posso pensare.

1. Inoltra (rinvia) il messaggio senza alcuna modifica.

Con "nessuna modifica", non intendo letteralmente nessuna modifica ai dati del messaggio non elaborato. Il modo per farlo è:

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

Di solito le persone non intendono questo tipo di "inoltro", però. Se vogliono inviare nuovamente, di solito useranno il prossimo metodo di invio.

2. Inoltra (rinvia) il messaggio nel modo standard.

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. Inoltra il messaggio collegandolo (in tutto) per un nuovo messaggio, il modo in cui alcuni client di posta potrebbero farlo.

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

risposta Amazin. Molte grazie! –

+2

nessun problema, felice di aiutare! – jstedfast

+0

@jstedfast Il metodo 3 come la maggior parte dei client, 'cita il messaggio originale' in una nuova risposta? Questo dovrebbe essere aggiunto al nuovo fantastico [http://www.mimekit.net] (http://www.mimekit.net) (Sembra buono! Ancora stranamente familiare) –