OpenPop.net 获取实际的消息文本

Posted

技术标签:

【中文标题】OpenPop.net 获取实际的消息文本【英文标题】:OpenPop.net get actual message text 【发布时间】:2012-05-23 00:49:24 【问题描述】:

我正在使用 OpenPop.net 尝试从给定收件箱中的所有电子邮件中解析我们的链接。我发现这种方法可以获取所有消息:

    public static List<OpenPop.Mime.Message> FetchAllMessages(string hostname, int port, bool useSsl, string username, string password)
    
        // The client disconnects from the server when being disposed
        using (Pop3Client client = new Pop3Client())
        
            // Connect to the server
            client.Connect(hostname, port, useSsl);

            // Authenticate ourselves towards the server
            client.Authenticate(username, password);

            // Get the number of messages in the inbox
            int messageCount = client.GetMessageCount();

            // We want to download all messages
            List<OpenPop.Mime.Message> allMessages = new List<OpenPop.Mime.Message>(messageCount);

            // Messages are numbered in the interval: [1, messageCount]
            // Ergo: message numbers are 1-based.
            // Most servers give the latest message the highest number
            for (int i = messageCount; i > 0; i--)
            
                allMessages.Add(client.GetMessage(i));                    
            

            client.Disconnect();

            // Now return the fetched messages
            return allMessages;
        
    

现在我正在尝试遍历每条消息,但我似乎无法弄清楚该怎么做,到目前为止我的按钮有这个:

    private void button7_Click(object sender, EventArgs e)
    

        List<OpenPop.Mime.Message> allaEmail = FetchAllMessages("pop3.live.com", 995, true, "xxxxx@hotmail.com", "xxxxx");

        var message = string.Join(",", allaEmail);
        MessageBox.Show(message);
    

如何遍历 allaEmail 中的每个条目,以便在 MessageBox 中显示它?

【问题讨论】:

【参考方案1】:

我可以看到您使用 OpenPop 主页上的 fetchAllEmail example。一个类似的例子showing how to get body text也在主页上。

您可能还想了解电子邮件的实际结构。 email introduction 就是为了这个目的而存在的。

话虽如此,我会做一些类似于下面的代码的事情。

private void button7_Click(object sender, EventArgs e)

    List<OpenPop.Mime.Message> allaEmail = FetchAllMessages(...);

    StringBuilder builder = new StringBuilder();
    foreach(OpenPop.Mime.Message message in allaEmail)
    
         OpenPop.Mime.MessagePart plainText = message.FindFirstPlainTextVersion();
         if(plainText != null)
         
             // We found some plaintext!
             builder.Append(plainText.GetBodyAsText());
          else
         
             // Might include a part holding html instead
             OpenPop.Mime.MessagePart html = message.FindFirstHtmlVersion();
             if(html != null)
             
                 // We found some html!
                 builder.Append(html.GetBodyAsText());
             
         
    
    MessageBox.Show(builder.ToString());

希望这对您有所帮助。请注意,OpenPop 也有 online documentation。

【讨论】:

哇,谢谢你!这正是我所追求的! :) 复选框来了 html.GetBodyAsText() 给出了一个异常,表示对象引用未设置为实例。但我使用 FindFirstPlainTextVersion() 然后 plainText.GetBodyAsText() 得到值,知道为什么吗?【参考方案2】:

我就是这样做的:

string Body = msgList[0].MessagePart.MessageParts[0].GetBodyAsText();
            foreach( string d in Body.Split('\n'))
                Console.WriteLine(d);                    
            

希望对您有所帮助。

【讨论】:

由于这更短,我尝试了您的选择,但没有奏效。给我数组转换投诉。 @foens 解决方案有效。【参考方案3】:

此问题的其他答案不完整且不正确,主要是因为他们从未使用至关重要的FindAllTextVersions 方法。

这里是获取实际正文内容的完整方法:

private static string GetMessageBodyAsText(Message message)

    try
    
        List<MessagePart> list = message.FindAllTextVersions();

        // First let's try getting the plain text part:
        foreach (MessagePart part in list)
        
            if (part != null)
            
                return part.GetBodyAsText();
            
        

        // Now let's try getting the HTML part
        MessagePart html = message.FindFirstHtmlVersion();
        if (html != null)
        
            return html.GetBodyAsText();
        
        return null;
    
    catch (Exception exc)
    
        // Handle your exception here
        return null;
    

【讨论】:

这是否意味着整个HTML邮件是一个部分,而纯文本是多个部分?

以上是关于OpenPop.net 获取实际的消息文本的主要内容,如果未能解决你的问题,请参考以下文章

解析多部分消息,仅正文

如何从实际写入的文本中的不和谐转换消息 ID?

ZABBIX对接飞书实现带图片的报警通知

如何使用 POP3 和 SmtpClient 转发多部分 MIME 电子邮件?

ZABBIX对接飞书实现报警通知

使用layer.open 父页面获取子页面输入文本框中的值