是否有人使用通过IMAP SSL连接到googlemail服务器的.Net框架来检查新电子邮件?
答案 0 :(得分:20)
答案 1 :(得分:17)
作为上述项目的作者,我可以说它确实支持SSL。
我目前正在开发一个新版本的库,它将完全异步,以提高它与IMAP服务器交互的速度。
该代码虽然不完整,但可以从链接到上面的代码plex站点下载原始同步库(也支持SSL)。
答案 2 :(得分:13)
Cross发布了其他类似的问题。看看当它们如此相似时会发生什么?
我一直在寻找IMAP解决方案一段时间了,在尝试了不少之后,我会选择AE.Net.Mail。
没有文档,我认为这是一个缺点,但我能够通过查看源代码(yay for open source!)和使用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();
我不隶属于这个库或任何东西,但我发现它非常快速和稳定。
答案 3 :(得分:13)
我建议查看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);
}
}
}
}
}
答案 4 :(得分:12)
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);
}
}
答案 5 :(得分:7)
IMAP没有.NET框架支持。你需要使用一些第三方组件。
尝试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。
答案 6 :(得分:5)
MailSystem.NET包含您对IMAP4的所有需求。这是免费的开源。
(我参与了这个项目)
答案 7 :(得分:1)
答案 8 :(得分:0)
LumiSoft.ee - 效果很好,相当容易。使用.NET 4.0进行编译。
以下是他们的lib和示例所需的链接。 主要下载:
http://www.lumisoft.ee/lsWWW/Download/Downloads/
代码示例:
位于:... lsWWW /下载/下载/示例/
.NET:
位于:... lsWWW /下载/下载/ Net /
我正在使用他们在codeplex上的lib(IMAPClientLumiSoft.codeplex.com)放置一个SIMPLE样本。您必须直接从他们的站点获取他们的库。我不包括他们,因为我不维护他们的代码,也没有任何代码权利。转到上面的链接并直接下载。我在我的VS2010中设置了LumiSoft项目属性,以便在.NET 4.0中构建所有这些属性而没有错误。 他们的样本相当复杂,甚至可能只是一个例子。虽然我希望这些都是针对高级开发人员的。
他们的项目只是进行了一些小调整。调整:他们的IMAP Client Winform示例在项目属性中设置为“Release”,可防止VS在调试点上中断。必须使用解决方案“Configuration Manager”将项目设置为“Active(Debug)”才能使断点生效。他们的例子使用匿名方法处理事件处理程序,这是一种非常紧密的编码...作为一种教学工具并不是真正的好。我的项目使用“命名”事件方法处理程序,因此您可以在处理程序内设置断点。然而,他们是处理内联代码的绝佳方式。他们可能使用了自.NET 3.0以来可用的较新的Lambda方法,但没有使用,我没有尝试转换它们。
从他们的样本中我将IMAP客户端简化为最低限度。
答案 9 :(得分:0)
另一种选择: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;
}
}
}
}
}