使用 c# .net 库检查来自 gmail 服务器的 IMAP 消息 [关闭]

Posted

技术标签:

【中文标题】使用 c# .net 库检查来自 gmail 服务器的 IMAP 消息 [关闭]【英文标题】:using c# .net libraries to check for IMAP messages from gmail servers [closed] 【发布时间】:2010-10-07 10:33:20 【问题描述】:

是否有任何示例代码使用 .Net 框架通过 IMAP SSL 连接到 googlemail 服务器来检查新电子邮件?

【问题讨论】:

您可能只需要询问 IMAP 客户端示例,而不是针对 googlemail 的特定内容,AFAIK 只是另一个 IMAP 服务器。 【参考方案1】:

我建议查看 MailKit,因为它可能是目前最强大的邮件库,而且它是开源 (MIT)。

MailKit 的一大优点是所有网络 API 都是可取消的(我在任何其他 IMAP 库中都没有看到可用的)。

它也是我所知道的唯一支持消息线程的库。

using System;
using System.Net;
using System.Threading;

using MailKit.Net.Imap;
using MailKit.Search;
using MailKit;
using MimeKit;

namespace TestClient 
    class Program
    
        public static void Main (string[] args)
        
            using (var client = new ImapClient ()) 
                using (var cancel = new CancellationTokenSource ()) 
                    client.Connect ("imap.gmail.com", 993, true, cancel.Token);

                    // If you want to disable an authentication mechanism,
                    // you can do so by removing the mechanism like this:
                    client.AuthenticationMechanisms.Remove ("XOAUTH");

                    client.Authenticate ("joey", "password", cancel.Token);

                    // The Inbox folder is always available...
                    var inbox = client.Inbox;
                    inbox.Open (FolderAccess.ReadOnly, cancel.Token);

                    Console.WriteLine ("Total messages: 0", inbox.Count);
                    Console.WriteLine ("Recent messages: 0", inbox.Recent);

                    // download each message based on the message index
                    for (int i = 0; i < inbox.Count; i++) 
                        var message = inbox.GetMessage (i, cancel.Token);
                        Console.WriteLine ("Subject: 0", message.Subject);
                    

                    // let's try searching for some messages...
                    var query = SearchQuery.DeliveredAfter (DateTime.Parse ("2013-01-12"))
                        .And (SearchQuery.SubjectContains ("MailKit"))
                        .And (SearchQuery.Seen);

                    foreach (var uid in inbox.Search (query, cancel.Token)) 
                        var message = inbox.GetMessage (uid, cancel.Token);
                        Console.WriteLine ("[match] 0: 1", uid, message.Subject);
                    

                    client.Disconnect (true, cancel.Token);
                
            
        
    

【讨论】:

太棒了!关于你的例子,只有几件事。它似乎工作正常,但如果您继续使用 foreach 并且您可能希望在您的反向顺序示例可选,因为 Gmail 似乎对 SORT 扩展不感兴趣 (github.com/jstedfast/MailKit/blob/master/MailKit/Net/Imap/…) 我可以验证这是一个很好的库并且使用简单! 是否可以为已处理的电子邮件分配颜色类别? IMAP 不支持颜色类别,但您可以使用自定义标签(IMAP 服务器可能支持)。 这不是线程安全的意思:) 你要问的是:“IMAP 是否支持多个连接”?答案是:是的。【参考方案2】:

您可能对此处列出的 URL 感兴趣

http://www.codeplex.com/InterIMAP

这是对

的扩展

http://www.codeproject.com/KB/IP/imaplibrary.aspx?fid=91819&df=90&mpp=25&noise=5&sort=Position&view=Quick&fr=26&select=2562067#xx2562067xx

【讨论】:

此项目不处理 ssl 连接,但作者有一条评论要求您向他发送电子邮件以请求 gmail ssl 代码,谢谢 InterIMAP 并不出色。当你连接到一个大邮箱时,它真的吓坏了。 (因为它坚持在允许你做任何事情之前读取每一个标题)。 该项目没有发布。 (?) 查看 InterIMAP 的代码库内部。里面有一些可怕的坏东西。我不会在此代码之上构建我的关键任务系统。 @Shaul,想详细说明一下吗?我很想知道我可以做些什么来改进它。谢谢。【参考方案3】:

作为上述项目的作者,我可以说是的,它确实支持 SSL。

我目前正在开发一个完全异步的新版本库,以提高它与 IMAP 服务器交互的速度。

该代码虽然不完整,但可以与原始同步库(也支持 SSL)一起从上面链接的代码 plex 站点下载。

【讨论】:

你已经完成了这个吗..? 这可以说是对 lakshmanaraj 上述答案的评论,可能缺乏完整答案的方面。考虑提及您所指的 哪个 库以及 在哪里 我们可以在不需要我查看其他答案的情况下获得它。您永远不会知道,其他答案可能会被删除,然后所有好东西都会丢失。祝你好运【参考方案4】:

从另一个类似问题发帖。看看当它们变得如此相似时会发生什么?

我一直在寻找 IMAP 解决方案,在尝试了很多之后,我选择了AE.Net.Mail。

没有文档,我认为这是一个缺点,但我能够通过查看源代码(开源!)并使用 Intellisense 来解决这个问题。以下代码专门连接到 Gmail 的 IMAP 服务器:

// Connect to the IMAP server. The 'true' parameter specifies to use SSL
// which is important (for Gmail at least)
ImapClient ic = new ImapClient("imap.gmail.com", "name@gmail.com", "pass",
                ImapClient.AuthMethods.Login, 993, true);
// Select a mailbox. Case-insensitive
ic.SelectMailbox("INBOX");
Console.WriteLine(ic.GetMessageCount());
// Get the first *11* messages. 0 is the first message;
// and it also includes the 10th message, which is really the eleventh ;)
// MailMessage represents, well, a message in your mailbox
MailMessage[] mm = ic.GetMessages(0, 10);
foreach (MailMessage m in mm)

    Console.WriteLine(m.Subject);

// Probably wiser to use a using statement
ic.Dispose();

我不隶属于这个库或任何东西,但我发现它非常快速且稳定。

【讨论】:

对不起,我想添加一些文档已经有一段时间了。 :[ 我觉得不需要发布二进制文件,因为它在 Nuget 上。我将很快添加一些额外的 IMAP 功能(IDLE),所以我一定会发布它的文档和二进制文件。 @Andy - 很酷,听到这个总是很高兴! 感谢 Dman 的好榜样和 Andy 的好图书馆。继续努力,我希望尽快看到该文档:) @Matti - 不客气 :) 文档总是好的! 多么棒的图书馆。我在几秒钟内就启动并运行了。完美运行。【参考方案5】:

Lumisoft.net 具有您可以使用的 IMAP 客户端和服务器代码。

我用它从 Gmail 下载电子邮件。对象模型不是最好的,但它是可行的,而且看起来相当灵活和稳定。

这是我使用它的秒杀的部分结果。它获取前 10 个带有信封的标头,然后获取完整的消息:

using (var client = new IMAP_Client())

    client.Connect(_hostname, _port, _useSsl);
    client.Authenticate(_username, _password);
    client.SelectFolder("INBOX");
     var sequence = new IMAP_SequenceSet();
    sequence.Parse("0:10");
    var fetchItems = client.FetchMessages(sequence, IMAP_FetchItem_Flags.Envelope | IMAP_FetchItlags.UID,
                                        false, true);
    foreach (var fetchItem in fetchItems)
    
        Console.Out.WriteLine("message.UID = 0", fetchItem.UID);
        Console.Out.WriteLine("message.Envelope.From = 0", fetchItem.Envelope.From);
        Console.Out.WriteLine("message.Envelope.To = 0", fetchItem.Envelope.To);
        Console.Out.WriteLine("message.Envelope.Subject = 0", fetchItem.Envelope.Subject);
        Console.Out.WriteLine("message.Envelope.MessageID = 0", fetchItem.Envelope.MessageID);
    
    Console.Out.WriteLine("Fetching bodies");
    foreach (var fetchItem in client.FetchMessages(sequence, IMAP_FetchItem_Flags.All, false, true)
                 
        var email = LumiSoft.Net.Mail.Mail_Message.ParseFromByte(fetchItem.MessageData);             
        Console.Out.WriteLine("email.BodyText = 0", email.BodyText);

    

【讨论】:

看来他已经改变了他的语法。而不是调用 Authenticate 现在调用 client.Login(_username, _password);并且 FetchMessages 已被替换为工作方式非常不同的 Fetch。 Lumisoft 代码虽然很棒,但可以使用更多示例来了解如何使用它。 谢谢! LumiSoft 的实施创造了奇迹! 这个库真的很棒! ImapX 在调用 process 方法时解码 Shift_JIS 有问题,但 Lumisoft.net 做得很好。是的,对象模型有点难理解,但是我可以仔细看看源代码,所以没关系。 我以前用过,但是不能连接GMAIL,因为它不支持SSL,也没有办法开启SSL。 此代码不起作用。 client.FetchMessages( 不存在。谢谢。从参考中删除。【参考方案6】:

没有对 IMAP 的 .NET 框架支持。您需要使用一些第 3 方组件。

试试Mail.dll email component,它非常实惠且易于使用,它还支持SSL

using(Imap imap = new Imap())

    imap.ConnectSSL("imap.company.com");
    imap.Login("user", "password");

    imap.SelectInbox();
    List<long> uids = imap.Search(Flag.Unseen);
    foreach (long uid in uids)
    
        string eml = imap.GetMessageByUID(uid);
        IMail message = new MailBuilder()
            .CreateFromEml(eml);

        Console.WriteLine(message.Subject);
        Console.WriteLine(message.Text);
    
    imap.Close(true);

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

您可以在这里下载:https://www.limilabs.com/mail。

【讨论】:

我多年来一直在使用这个组件并且喜欢它(与@Pavel 没有任何关联)。我试过的最好的 .NET 电子邮件库,物有所值。与 Nuget 兼容。【参考方案7】:

MailSystem.NET 包含您对 IMAP4 的所有需求。它是免费和开源的。

(我参与了这个项目)

【讨论】:

这是一个简单而实用的库,我推荐它。 这个项目已经死了,已经有一段时间了。这些示例在 VS 2008 或 2010 中都不是开箱即用的。我对它们进行了上转换,然后不得不处理 16 个参考问题。该文档已过时,并且 CodePlex 页面在过去一年或更长时间内未解决任何问题/cmets。一些较新的问题询问代码更新失败。其他评论者说要下载源代码并自己解决问题。我不推荐使用这个。 项目已经死了。 IDLE 无法正常工作mailsystem.codeplex.com/workitem/23586 不支持非 ASCII 邮箱名称 项目死了?有更新吗?【参考方案8】:

ssl 版本的来源在这里:http://atmospherian.wordpress.com/downloads/

【讨论】:

【参考方案9】:

另一种选择:HigLabo

https://higlabo.codeplex.com/documentation

好讨论:https://higlabo.codeplex.com/discussions/479250

//====Imap sample================================//
//You can set default value by Default property
ImapClient.Default.UserName = "your server name";
ImapClient cl = new ImapClient("your server name");
cl.UserName = "your name";
cl.Password = "pass";
cl.Ssl = false;
if (cl.Authenticate() == true)

    Int32 MailIndex = 1;
    //Get all folder
    List<ImapFolder> l = cl.GetAllFolders();
    ImapFolder rFolder = cl.SelectFolder("INBOX");
    MailMessage mg = cl.GetMessage(MailIndex);


//Delete selected mail from mailbox
ImapClient pop = new ImapClient("server name", 110, "user name", "pass");
pop.AuthenticateMode = Pop3AuthenticateMode.Pop;
Int64[] DeleteIndexList = new.....//It depend on your needs
cl.DeleteEMail(DeleteIndexList);

//Get unread message list from GMail
using (ImapClient cl = new ImapClient("imap.gmail.com")) 

    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    
        //Select folder
        ImapFolder folder = cl.SelectFolder("[Gmail]/All Mail");
        //Search Unread
        SearchResult list = cl.ExecuteSearch("UNSEEN UNDELETED");
        //Get all unread mail
        for (int i = 0; i < list.MailIndexList.Count; i++)
        
            mg = cl.GetMessage(list.MailIndexList[i]);
        
    
    //Change mail read state as read
    cl.ExecuteStore(1, StoreItem.FlagsReplace, "UNSEEN")



//Create draft mail to mailbox
using (ImapClient cl = new ImapClient("imap.gmail.com")) 

    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    
        var smg = new SmtpMessage("from mail address", "to mail addres list"
            , "cc mail address list", "This is a test mail.", "Hi.It is my draft mail");
        cl.ExecuteAppend("GMail/Drafts", smg.GetDataText(), "\\Draft", DateTimeOffset.Now); 
    


//Idle
using (var cl = new ImapClient("imap.gmail.com", 993, "user name", "pass"))

    cl.Ssl = true;
    cl.ReceiveTimeout = 10 * 60 * 1000;//10 minute
    if (cl.Authenticate() == true)
    
        var l = cl.GetAllFolders();
        ImapFolder r = cl.SelectFolder("INBOX");
        //You must dispose ImapIdleCommand object
        using (var cm = cl.CreateImapIdleCommand()) Caution! Ensure dispose command object
        
            //This handler is invoked when you receive a mesage from server
            cm.MessageReceived += (Object o, ImapIdleCommandMessageReceivedEventArgs e) =>
            
                foreach (var mg in e.MessageList)
                
                    String text = String.Format("Type is 0 Number is 1", mg.MessageType, mg.Number);
                    Console.WriteLine(text);
                
            ;
            cl.ExecuteIdle(cm);
            while (true)
            
                var line = Console.ReadLine();
                if (line == "done")
                
                    cl.ExecuteDone(cm);
                    break;
                
            
        
    

【讨论】:

【参考方案10】:

LumiSoft.ee - 效果很好,相当简单。使用 .NET 4.0 编译。

这里是他们的库和示例所需的链接。 主要下载:

http://www.lumisoft.ee/lsWWW/Download/Downloads/

代码示例:

位于:...lsWWW/Download/Downloads/Examples/

.NET:

位于:...lsWWW/Download/Downloads/Net/

我正在使用他们的 lib 在 codeplex (IMAPClientLumiSoft.codeplex.com) 上放置一个简单的示例。您必须直接从他们的站点获取他们的库。我不包括他们,因为我不维护他们的代码,也没有任何权利。转到上面的链接并直接下载。我在我的 VS2010 中设置了 LumiSoft 项目属性,以便在 .NET 4.0 中构建所有项目属性,并且没有任何错误。 他们的样本相当复杂,如果只是一个例子,甚至可能编码过于紧凑。虽然我希望这些都是针对一般高级开发人员的。

他们的项目进行了细微的调整。调整:他们的 IMAP Client Winform 示例在项目属性中设置为“Release”,以防止 VS 在调试点上中断。您必须使用解决方案“配置管理器”将项目设置为“活动(调试)”才能使断点工作。他们的示例对事件处理程序使用匿名方法,这是非常紧凑的编码......作为教学工具并不是很好。我的项目使用“命名”事件方法处理程序,因此您可以在处理程序内设置断点。然而,他们是处理内联代码的绝佳方式。他们可能使用了自 .NET 3.0 以来可用的较新的 Lambda 方法,但没有使用,我也没有尝试转换它们。

从他们的示例中,我将 IMAP 客户端简化到最低限度。

【讨论】:

他们的网络库相对复杂,我有点迷失了许多帮助类。我正在寻找一个相当简单的示例来使用 Lumisoft IMAP 客户端访问 gmail。可以分享一下吗?

以上是关于使用 c# .net 库检查来自 gmail 服务器的 IMAP 消息 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Gmail 使用 C# 发送电子邮件

在 C# 中使用 AE.Net.Mail 访问 GMail

如何在 C# 中使用带有服务帐户的 gmail api 或 google Oauth 来发送邮件?

Gmail API 创建和发送电子邮件 .NET C#

来自 C# 的 IP Cam 实时提要

C#和ASP.NET通过Gmail账户发送邮件的代码