- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
背景:我们有一个用 asp-classic 编写的内部 Intranet 系统和 asp.net - iis服务器没有 php安装(在 php 中看到一些漂亮的解决方案,例如 this 但我们不能真正使用这些。) - 我们需要向我们的用户显示他们的 imap 邮箱中有多少未读电子邮件。他们的 imap 邮箱在内部托管在运行 postfix 和 dovecot imap 的 linux 机器上。
我的问题:如何通过 .net(vb 或 c#)中的 Dovecot Imap 连接到 Postfix 邮件系统并确定未读邮件的数量?
我已经尝试过的:我们使用了 Limilabs mail dll以及以下内容:
Imports System.Net.Security
Imports System
Imports Limilabs.Mail
Imports Limilabs.Client.IMAP
Imports Limilabs.Client
Function RetrieveUnread(_server, _user, _password)
Using imap As New Limilabs.Client.IMAP.Imap
'#### Handler needed because of self signed certificates
RetrieveUnread = vbNull
AddHandler imap.ServerCertificateValidate, AddressOf ValidateCertificate
imap.ConnectSSL(_server)
Try
imap.Login(_user, _password)
Catch ex As Exception
RetrieveUnread = "Failed to login"
End Try
If CStr(RetrieveUnread) <> "Failed to login" Then
imap.SelectInbox()
Dim uids As List(Of Long) = imap.Search(Flag.Unseen) 'Find all unseen messages.
'Console.WriteLine("Number of unseen messages is: " & CStr(uids.Count))
RetrieveUnread = CStr(uids.Count)
End If
imap.Close()
End Using
End Function
Private Sub ValidateCertificate(ByVal sender As Object, ByVal e As ServerCertificateValidateEventArgs)
Const ignoredErrors As SslPolicyErrors = SslPolicyErrors.RemoteCertificateChainErrors Or SslPolicyErrors.RemoteCertificateNameMismatch ' name mismatch
Dim nameOnCertificate As String = e.Certificate.Subject
If (e.SslPolicyErrors And Not ignoredErrors) = SslPolicyErrors.None Then
e.IsValid = True
Return
End If
e.IsValid = False
End Sub
然而,虽然这种方法可行,但这种方法依赖于第三方,如果许可未到位/未更新,DLL 将失败并且对于我们需要做的事情来说过于臃肿。我们只是好奇这是否可以在 native .net 代码中完成。
最佳答案
您不需要第 3 方 dll;一个简单的TcpClient
会做的。
您只需将正确的 IMAP 命令发送到您的服务器,然后使用正则表达式解析结果即可。
LINQPad 就绪示例:
Sub Main()
Dim client = New System.Net.Sockets.TcpClient("hostname", 143)
Using s = client.GetStream(),
reader = New StreamReader(s),
writer = New StreamWriter(s)
Dim send As Action(Of String) = Sub(command)
writer.WriteLine(command)
writer.Flush()
End Sub
Dim recieve As Func(Of String, String) = Function(tag)
Dim response As String
Dim str As String = ""
response = reader.ReadLine()
While response IsNot Nothing
str += response
If response.StartsWith(tag, StringComparison.Ordinal) Then
Exit While
End If
response = reader.ReadLine()
End While
Return str
End Function
send("a login username password"): recieve("a")
send("b select inbox"): recieve("b")
send("b2 SEARCH UNSEEN")
Dim b2response = recieve("b2")
Dim items = Regex.Match(b2response, "SEARCH (.*) OK").Groups(1).Value.Split(" "c)
Console.WriteLine("Unread items: " + items.Count().ToString())
send("c logout"): recieve("c")
End Using
End Sub
void Main()
{
var client = new System.Net.Sockets.TcpClient("hostname", 143);
using (var s = client.GetStream())
using (var reader = new StreamReader(s))
using (var writer = new StreamWriter(s))
{
Action<string> send = (command) =>
{
writer.WriteLine(command);
writer.Flush();
};
Func<String, String> recieve = (tag) =>
{
string response;
string str="";
while ((response = reader.ReadLine()) != null )
{
str+=response;
if (response.StartsWith(tag, StringComparison.Ordinal))
break;
}
return str;
};
send("a login username password"); recieve("a");
send("b select inbox"); recieve("b");
send("b2 SEARCH UNSEEN");
var b2response = recieve("b2");
var items = Regex.Match(b2response, @"SEARCH (.*) OK").Groups[1].Value.Split(' ');
Console.WriteLine("Unread items: " + items.Count().ToString());
send("c logout"); recieve("c");
}
}
如果您想使用 SSL,您必须将流 s
包装在 SslStream
中并调用AuthenticateAsClient
首先(可能使用端口 993)。
关于c# - 在没有臃肿的第 3 方库的情况下,在 .net 中获取 imap 未读电子邮件计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12724684/
我有一堆代码执行 IMAP 命令“search, idle, done, search, idle, done, search, ...”。 是否有可能某些消息在搜索和空闲命令之间到达,因此只能在空闲
(使用IMAP命令,而不借助任何其他邮件程序包) 最佳答案 我不确定您对imap的了解程度如何,但是基本上在登录后,“选择”源邮箱,“复制”邮件,然后“删除”邮件(如果是,则“删除”旧邮箱)现在是空的
我正在编写一个 IMAP 爬虫,它是开源应用程序的一部分,对于增量爬网,我想使用消息 UID 来确定我是否已经看到了特定消息。 现在我找到了 a post从 2007 年开始说 IMAP UID 并不
我注意到 libcurl 支持 IMAP,但在文档和示例中没有找到任何内容 http://curl.haxx.se/libcurl/c/imap.html很穷。有谁知道如何在这个库中使用这个协议(pr
IMAP UID 是否保证为数字?我读过 RFC3501 中的部分,它说: Unique identifiers are assigned in a strictly ascending fashio
IMAP UID 是否保证为数字?我读过 RFC3501 中的部分,它说: Unique identifiers are assigned in a strictly ascending fashio
我正在使用开源 IMAP C# 库 IMapX (http://hellowebapps.com/products/imapx/)。当我试图从收件箱中获取电子邮件时,需要花费很多时间。有没有办法根据接
我正在尝试使用 Limilabs imap 库连接到电子邮件; tcpc = new System.Net.Sockets.TcpClient("imap.gmail.com", 993); 工作
我正在尝试使用 imap 方法通过 php 打开电子邮件,但它给我一个错误无法打开流 {imap.gmail.com:993/imap/ssl}INBOX,这是我的代码 $hostname = '{i
有没有办法确定给定电子邮件地址的 POP 或 IMAP 服务器?我正在为非技术用户构建一个应用程序,我真的不想打扰他们询问他们的 IMAP/POP 服务器。 mail2web.com这样做,但我不确定
如何确定通过 APPEND 添加的消息的 UID到邮箱?通过 STATUS我可以事先得到下一个值的预测,我可以 SEARCH之后,但依赖这些会引入竞争条件,因为可能在这些命令之间添加了其他消息。 最佳
这个搜索查询对我来说似乎有效: UID SEARCH OR ( OR ( OR (FROM "def@gmail.com") (FROM "abc@gmail.com")) (FROM "ghi@gm
我正在使用以下代码以编程方式验证电子邮件。 Properties properties = new Properties(); Session emailSession = Session.getDe
我正在使用 OpenSSL 连接到邮件服务器。 POP3 工作正常,但 IMAP 有问题。基于 CAPABILITY 命令服务器支持 PLAIN、NTLM 和 GSS-API 认证方法。 我想使用 P
我正在使用以下代码建立 IMAP 连接。我想阅读电子邮件。我读了这个文件 link无法从这里继续。 我的代码: #lang racket (define imap-server "*****") (d
在尝试使用 php 的 imap 函数时,我无法连接到 Gmail 的 imap 服务器。我正在使用: $mail = imap_open('{imap.gmail.com:993/imap/ssl/
我试图更好地理解 Gmail API . stated benefits 之一Gmail API 的最大特点是它可以“提供比 IMAP 显着的性能改进”。 Gmail API 和协议(protocol
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在制作一个支持 POP3 和 IMAP 的邮件客户端。我正在使用 vmime api 用 C++ 对客户端进行编程。我的问题是:同步邮件的最佳方式是什么? 我认为标识符是个好方法,但我不知道同步邮
我正在制作一个支持 POP3 和 IMAP 的邮件客户端。我正在使用 vmime api 用 C++ 对客户端进行编程。我的问题是:同步邮件的最佳方式是什么? 我认为标识符是个好方法,但我不知道同步邮
我是一名优秀的程序员,十分优秀!