在C#中使用Pop3阅读电子邮件

时间:2008-09-04 18:21:07

标签: c# unicode pop3

我正在寻找一种在C#2.0中使用Pop3阅读电子邮件的方法。目前,我正在使用CodeProject中的代码。但是,这种解决方案并不理想。最大的问题是它不支持用unicode编写的电子邮件。

8 个答案:

答案 0 :(得分:73)

我已成功使用OpenPop.NET通过POP3访问电子邮件。

答案 1 :(得分:16)

通过POP3协议下载电子邮件是该任务的简单部分。协议非常简单,如果您不想通过网络发送明文密码(并且不能使用SSL加密通信通道),唯一困难的部分可能是高级身份验证方法。有关详细信息,请参阅RFC 1939: Post Office Protocol - Version 3 RFC 1734: POP3 AUTHentication command

当您必须解析收到的电子邮件时,很难实现,这意味着在大多数情况下解析MIME格式。您可以在几小时或几天内编写快速和脏的MIME解析器,它将处理所有传入消息的95%以上。改进解析器以便它可以解析几乎任何电子邮件意味着:

  • 获取从最受欢迎的邮件客户端发送的电子邮件样本并改进解析器,以修复由它们生成的错误和RFC错误解释。
  • 确保违反RFC的邮件标题和内容不会使您的解析器崩溃,并且您将能够从错误的电子邮件中读取每个可读或可猜测的值
  • 正确处理国际化问题(例如从左到右编写的语言,针对特定语言的正确编码等)
  • UNICODE
  • "Mime torture email sample"
  • 中显示的附件和分层消息项目树
  • S / MIME(已签名和加密的电子邮件)。

调试健壮的MIME解析器需要数月的工作量。我知道,因为我正在看着我的朋友为下面提到的组件编写一个这样的解析器,并且正在为它编写一些单元测试; - )

回到原来的问题。

关注code taken from our POP3 Tutorial page和链接会对您有所帮助:

// 
// create client, connect and log in 
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");

// get message list 
Pop3MessageCollection list = client.GetMessageList();

if (list.Count == 0)
{
    Console.WriteLine("There are no messages in the mailbox.");
}
else 
{
    // download the first message 
    MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
    ...
}

client.Disconnect();

答案 2 :(得分:8)

我的开源应用程序BugTracker.NET包含一个可以解析MIME的POP3客户端。 POP3代码和MIME代码都来自其他作者,但您可以在我的应用程序中看到它们是如何组合在一起的。

对于MIME解析,我使用http://anmar.eu.org/projects/sharpmimetools/

查看文件POP3Main.cs,POP3Client.cs和insert_bug.aspx

答案 3 :(得分:5)

您还可以尝试Mail.dll mail component,它具有SSL支持,unicode和多国电子邮件支持:

using(Pop3 pop3 = new Pop3())
{
    pop3.Connect("mail.host.com");           // Connect to server and login
    pop3.Login("user", "password");

    foreach(string uid in pop3.GetAll())
    {
        IMail email = new MailBuilder()
            .CreateFromEml(pop3.GetMessageByUID(uid));
          Console.WriteLine( email.Subject );
    }
    pop3.Close(false);      
}

您可以在https://www.limilabs.com/mail

下载

请注意,这是我创建的商业产品。

答案 4 :(得分:3)

我不推荐OpenPOP。我花了几个小时调试一个问题 - OpenPOP的POPClient.GetMessage()神秘地返回null。我调试了这个并发现它是一个字符串索引错误 - 请参阅我在此处提交的补丁:http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778。很难找到原因,因为有空的catch {}块可以吞下异常。

此外,该项目大多处于休眠状态......最后一次发布于2004年。

目前我们仍在使用OpenPOP,但我会看看人们推荐的其他一些项目。

答案 5 :(得分:3)

HigLabo.Mail易于使用。以下是一个示例用法:

using (Pop3Client cl = new Pop3Client()) 
{ 
    cl.UserName = "MyUserName"; 
    cl.Password = "MyPassword"; 
    cl.ServerName = "MyServer"; 
    cl.AuthenticateMode = Pop3AuthenticateMode.Pop; 
    cl.Ssl = false; 
    cl.Authenticate(); 
    ///Get first mail of my mailbox 
    Pop3Message mg = cl.GetMessage(1); 
    String MyText = mg.BodyText; 
    ///If the message have one attachment 
    Pop3Content ct = mg.Contents[0];         
    ///you can save it to local disk 
    ct.DecodeData("your file path"); 
} 

你可以从https://github.com/higty/higlabo或Nuget [HigLabo]

获得它

答案 6 :(得分:2)

称我为旧时尚,但为什么要使用第三方库来制作简单的协议。我已经在基于Web的ASP.NET应用程序中使用System.Net.Sockets.TCPClient和System.Net.Security.SslStream实现了POP3阅读器,以进行加密和身份验证。就协议而言,一旦打开与POP3服务器的通信,就只需要处理少量命令。这是一个非常容易使用的协议。

答案 7 :(得分:2)

我刚刚尝试过SMTPop,但它确实有效。

  1. 我下载了this
  2. 添加了smtpop.dll对我的C#.NET项目的引用
  3. 写下以下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;    
    using SmtPop;
    
    namespace SMT_POP3 {
    
        class Program {
            static void Main(string[] args) {
                SmtPop.POP3Client pop = new SmtPop.POP3Client();
                pop.Open("<hostURL>", 110, "<username>", "<password>");
    
                // Get message list from POP server
                SmtPop.POPMessageId[] messages = pop.GetMailList();
                if (messages != null) {
    
                    // Walk attachment list
                    foreach(SmtPop.POPMessageId id in messages) {
                        SmtPop.POPReader reader= pop.GetMailReader(id);
                        SmtPop.MimeMessage msg = new SmtPop.MimeMessage();
    
                        // Read message
                        msg.Read(reader);
                        if (msg.AddressFrom != null) {
                            String from= msg.AddressFrom[0].Name;
                            Console.WriteLine("from: " + from);
                        }
                        if (msg.Subject != null) {
                            String subject = msg.Subject;
                            Console.WriteLine("subject: "+ subject);
                        }
                        if (msg.Body != null) {
                            String body = msg.Body;
                            Console.WriteLine("body: " + body);
                        }
                        if (msg.Attachments != null && false) {
                            // Do something with first attachment
                            SmtPop.MimeAttachment attach = msg.Attachments[0];
    
                            if (attach.Filename == "data") {
                               // Read data from attachment
                               Byte[] b = Convert.FromBase64String(attach.Body);
                               System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);
    
                               //BinaryFormatter f = new BinaryFormatter();
                               // DataClass data= (DataClass)f.Deserialize(mem); 
                               mem.Close();
                            }                     
    
                            // Delete message
                            // pop.Dele(id.Id);
                        }
                   }
               }    
               pop.Quit();
            }
        }
    }