![](/img/trans.png)
[英]Is there a way to save the email as a file while using MailKit c#?
[英]Forward email using MailKit (C#)
我正在嘗試使用 MailKit(由jstedfast創建)訪問 IMAP 帳戶
我設法下載了消息(作為 MimeMessage),並且在某些時候我需要將它“轉發”到另一個帳戶。
如何最好地做到這一點,以保留原始電子郵件的所有信息(地址、標題、正文內容等)。
謝謝!
不同的人說“轉發”時的意思不同,所以我想我會針對我能想到的不同含義提供答案。
1. 轉發(重新發送)消息而不做任何更改。
“沒有變化”,我的字面意思是原始消息數據根本沒有變化。 這樣做的方法是:
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);
}
注意:某些網絡郵件提供商(例如 GMail、Hotmail/Office365 等)可能不允許您使用這種方法,因為他們可能認為這是電子郵件欺騙。 這些郵件主機可能會用您帳戶的名稱/電子郵件地址替換From
標頭,因此請注意這個潛在問題。
不過,通常人們並不是指這種類型的“轉發”。 如果他們想重發,通常他們會使用下一種重發方法。
2. 以自動過濾器可能發送的方式轉發(重新發送)消息。
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. 通過將郵件(整體)附加到新郵件來轉發郵件,某些電子郵件客戶端可能會這樣做。
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. 以許多其他電子郵件客戶端的方式“內聯”轉發郵件。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.