如何从电子邮件中提取正文

时间:2015-05-19 06:25:27

标签: c# imap

这是我的代码我试图从textdata属性获取电子邮件的正文,但它提供错误对象引用未设置为对象的实例我不知道该怎么做

      IMAPConfig config = new IMAPConfig("imap-mail.outlook.com","name@hotmail.com", "password", true, true, "");

        config.CacheFile = "";

        IMAPClient client = null;

            client = new IMAPClient(config, null, 5);

            IMAPFolder f = client.Folders["Inbox"];
            //  Console.WriteLine(f.GetMessageByID(7049)) ;

            int[] msgCount = null;

            while (msgCount == null || msgCount.Length == 0)
            {
                msgCount = f.CheckForNewMessages();
                Thread.Sleep(1000);
            }

            foreach (int id in msgCount)
            {
                IMAPMessage msg = f.GetMessageByID(id);
                string a = null;
                a = msg.TextData.TextData;
                //MessageBox.Show(msg.TextData.ToString());
                msg.MarkAsRead();
            }

2 个答案:

答案 0 :(得分:2)

看看InterIMAP是一个死的项目,我强烈建议切换到MailKit,这不仅仅是由我积极维护,而且还有更多的功能(我的意思是,InterIMAP' s主页说它将支持复制消息很快并且自2009年以来没有更新过),拥有更多用户,并且错误少得多。它也更容易使用。

例如,您可以按照以下方式使用MailKit进行操作:

using (var client = new ImapClient ()) {
    client.Connect ("imap-mail.outlook.com", 993, true);
    client.Authenticate ("name@hotmail.com", "password");

    client.Inbox.Open (FolderAccess.ReadWrite);

    for (int i = 0; i < client.Inbox.Count; i++) {
        var message = client.Inbox.GetMessage (i);
        var html = message.HtmlBody;
        var text = message.TextBody;

        // mark the message as read
        client.Inbox.AddFlags (id, MessageFlags.Seen, true);
    }

    client.Disconnect (true);
}

我还在http://www.mimekit.net/docs获得了MSDN风格的文档(我一直在努力改进),您可能会觉得有用。如果您有任何疑问,可以在github项目页面(我的答案顶部的&#34; MailKit&#34;链接)上找到我的电子邮件地址。

答案 1 :(得分:0)

看起来您正在使用InterIMAP。如果查看IMAPMessage.TextDatahttps://interimap.codeplex.com/SourceControl/latest#InterIMAP/InterIMAP/Objects/IMAPMessage.cs)的源代码,可以看到如果消息中没有纯文本正文部分,它将返回null。

    /// <summary>
    /// The content of the message as plain text (if available)
    /// </summary>
    [XmlIgnore]
    public IMAPMessageContent TextData
    {
        get 
        { 
            //RefreshData(true, false); 
            foreach (IMAPMessageContent content in _bodyParts)
            {
                if (content.ContentType.ToLower().Contains("plain"))
                    return content;
            }
            return null;
        }
        //set { _textData = value; }
    }