【问题标题】:Reply to a Mail in Mailkit在 Mailkit 中回复邮件
【发布时间】:2016-05-08 06:16:08
【问题描述】:

我正在为我的项目使用 Mailkit 库 (Imap)。

我可以通过 SmtpClient 轻松地发送一条新消息。

目前我正在研究如何回复特定邮件。是否可以向该回复邮件添加更多收件人?

@jstedfast 谢谢你的精彩:)

【问题讨论】:

  • 不用谢,只接受答案:)

标签: c# mailkit mimekit


【解决方案1】:

回复消息相当简单。在大多数情况下,您只需像创建任何其他消息一样创建回复消息。只有一些细微的差别:

  1. 在回复消息中,如果您要回复的消息中不存在前缀,则需要在 Subject 标头前加上 "Re: " 前缀(换句话说,如果您正在回复消息使用Subject"Re: party tomorrow night!",您不会在其前面加上另一个"Re: ")。
  2. 您需要将回复邮件的In-Reply-To 标头设置为原始邮件中Message-Id 标头的值。
  3. 您需要将原始邮件的 References 标头复制到回复邮件的 References 标头中,然后附加原始邮件的 Message-Id 标头。
  4. 您可能希望在回复中“引用”原始消息的文本。

如果要在代码中表达这个逻辑,它可能看起来像这样:

public static MimeMessage Reply (MimeMessage message, bool replyToAll)
{
    var reply = new MimeMessage ();

    // reply to the sender of the message
    if (message.ReplyTo.Count > 0) {
        reply.To.AddRange (message.ReplyTo);
    } else if (message.From.Count > 0) {
        reply.To.AddRange (message.From);
    } else if (message.Sender != null) {
        reply.To.Add (message.Sender);
    }

    if (replyToAll) {
        // include all of the other original recipients - TODO: remove ourselves from these lists
        reply.To.AddRange (message.To);
        reply.Cc.AddRange (message.Cc);
    }

    // set the reply subject
    if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase))
        reply.Subject = "Re:" + message.Subject;
    else
        reply.Subject = message.Subject;

    // construct the In-Reply-To and References headers
    if (!string.IsNullOrEmpty (message.MessageId)) {
        reply.InReplyTo = message.MessageId;
        foreach (var id in message.References)
            reply.References.Add (id);
        reply.References.Add (message.MessageId);
    }

    // quote the original message text
    using (var quoted = new StringWriter ()) {
        var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault ();

        quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), !string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address);
        using (var reader = new StringReader (message.TextBody)) {
            string line;

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

        reply.Body = new TextPart ("plain") {
            Text = quoted.ToString ()
        };
    }

    return reply;
}

注意:此代码假定 message.TextBody 不为空。虽然不太可能,但有可能发生这种情况(这意味着该消息不包含 text/plain 正文)。

【讨论】:

  • 另外,在我的情况下,我必须设置一个 reply.Sender 属性以避免在执行 smtpClient.send(reply) 时出现异常
  • 我可以知道在返回reply后如何发送上述MimeMessage吗?
  • 阅读MailKit自述文件。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2015-11-06
  • 2019-10-14
  • 2018-04-13
  • 2021-08-25
相关资源
最近更新 更多