I\'m trying to access to an IMAP account using MailKit (created by jstedfast)
I manage to download the message (as a MimeMessage), and at some point I need to \"forw
Different people mean different things when they say "forward", so I guess I'll provide answers to the different meanings that I can think of.
1. Forward (Resend) the message without any changes.
By "no changes", I literally mean no changes at all to the raw message data. The way to do this is to do:
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", "username@example.com");
var recipients = new [] { new MailboxAddress ("John Smith", "john@smith.com") };
// 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);
}
Usually people don't mean this type of "forwarding", though. If they want to resend, usually they'll use the next method of resending.
2. Forward (Resend) the message the way that an automated filter might send it.
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", "username@example.com"));
message.ResentReplyTo.Add (new MailboxAddress ("MyName", "username@example.com"));
message.ResentTo.Add (new MailboxAddress ("John Smith", "john@smith.com"));
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. Forward the message by attaching it (in whole) to a new message, the way some email clients might do it.
var messageToForward = FetchMessageFromImapServer ();
// construct a new message
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("MyName", "username@example.com"));
message.ReplyTo.Add (new MailboxAddress ("MyName", "username@example.com"));
message.To.Add (new MailboxAddress ("John Smith", "john@smith.com"));
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. Forward the message "inline" the way many other email clients do it.
var messageToForward = FetchMessageFromImapServer ();
// construct a new message
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("MyName", "username@example.com"));
message.ReplyTo.Add (new MailboxAddress ("MyName", "username@example.com"));
message.To.Add (new MailboxAddress ("John Smith", "john@smith.com"));
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);
}