我需要创建一个连接到IMAP服务器并侦听新邮件的服务(或控制台)应用程序.我目前正在尝试使用MailKit,但我无法从文档中找出如何实现这一目标.
我最接近的是这篇文章.从我所看到的,这篇文章是将连接设置为IDLE模式,偶尔发送NoOP以尝试保持连接活动.我不完全清楚的是如何收到新的邮件通知.
MailKit文档似乎表明有一个Alert事件可用.我试过挂钩,但这似乎没有解决任何问题.
这是我尝试过的:
var cts = new CancellationTokenSource();
testIDLEMailNotification(cts.Token);
...
private static void testIDLEMailNotification(CancellationToken token)
{
using (var client = ClientCreateAndConnect(token))
{
while(!token.IsCancellationRequested)
{
using (var done = new CancellationTokenSource())
{
using (var timer = new System.Timers.Timer(9 * 60 * 1000))
{
timer.Elapsed += (sender, e) => done.Cancel();
timer.AutoReset = false;
timer.Enabled = true;
try
{
client.Idle(done.Token, token);
client.NoOp(token);
}
catch (OperationCanceledException)
{
break;
}
}
}
}
}
}
private static ImapClient ClientCreateAndConnect(CancellationToken token)
{
var …Run Code Online (Sandbox Code Playgroud) 我正在尝试从收件箱中检索子文件夹和消息,但我只能检索父子文件夹,也尝试使用 PersonalNamespaces[0]
var inbox = client.Inbox;
inbox.Open (FolderAccess.ReadWrite);
Debug.WriteLine ("Total messages: {0}", inbox.Count);
//client.Inbox.Status(StatusItems.Unread);
//Debug.WriteLine("Recent messages: {0}", inbox.Unread);
//Debug.WriteLine("Recent messages: {0}", inbox.FirstUnread);
var personal = client.GetFolder(client.PersonalNamespaces[0]);
foreach (var folder in inbox.GetSubfolders(false))
{
Console.WriteLine("[folder] {0}", folder.Name);
folder.Open(FolderAccess.ReadOnly);
Run Code Online (Sandbox Code Playgroud) 在尝试使用 MailKit 和 MimeKit 发送电子邮件时,有没有办法收集 SMTP 输出?。
ps:我正在尝试将我的电子邮件代码从 Easymail 迁移到 Mimekit 和 Mailkit,如果这是一个相当基本的查询,我深表歉意。
我有一个关于asp.net核心电子邮件发送的问题.
所以我有这个代码:
private void SendEmailLocalSMTP(string email, string subject, string message)
{
MimeMessage mailMsg = new MimeMessage();
//TESTING ENVIRONMENT ONLY!!!
mailMsg.To.Add(new MailboxAddress("myMail@gmail.com", "cjimenezber@gmail.com"));
// From
mailMsg.From.Add(new MailboxAddress("noreply@app.com", "Facturacion"));
// Subject and multipart/alternative Body
mailMsg.Subject = subject;
string html = message;
System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("myMail@gmail.com", "myPassword");
// Init SmtpClient and send
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
client.AuthenticationMechanisms.Remove("XOAUTH2");
client.Authenticate(credentials);
client.Send(mailMsg);
client.Disconnect(true);
}
}
Run Code Online (Sandbox Code Playgroud)
从我在其他帖子中发现的有些相关,这应该足以使用MailKit发送它,但它不能正常工作.我收到以下异常,我不知道如何从这里开始.
这是例外:
我已经看到了这个问题,但我没有太多意义:如何使用MailKit发送电子邮件?
任何帮助都非常感谢,谢谢.
我在玩 MailKit/MimeKit,有些东西困扰着我。我想使用流发送带有附件的电子邮件。MimeKit 提供的BodyBuilder类可以很容易地创建正文消息和附加文件:
public void SendEmail(string body, Stream attachment, string fileName)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Carl", "carl@site.com"));
message.To.Add(new MailboxAddress("Rick", "rick@site.com"));
message.Subject = "Things got messy...?";
var builder = new BodyBuilder();
builder.TextBody = body;
builder.Attachments.Add(fileName, attachment);
message.Body = builder.ToMessageBody();
using (var client = new SmtpClient())
{
// code to send e-mail here...
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的代码中的其他地方生成了流并且我没有关闭它,所以我可以将它传递给 MimeKit。不清楚的是:MimeKit 是否处理流?基本上(据我所知)消费者通常负责处理流。我也知道在 MemoryStream 上调用 dispose (我基本上正在使用)不会释放任何资源..但会阻止读取/写入它。但是,如果将来实现更改为另一种类型的 Stream,事情会变得更加复杂。
我还深入研究了 MikeKit 源代码,发现传入的 StreamAttachmentCollection.Add被“添加”到了MemoryBlockStream继承自 Stream(并实现 Dispose)的 Stream 中,所以我假设它已被处理,但在这一点上,我只是猜测。
有任何想法吗?
我正在编写一个 .net core 1.1 控制台应用程序。目标是将其托管为在 docker 容器内运行的计划作业。
控制台应用程序将使用 smtp 服务器并发送电子邮件。就那么简单。
但是,我在 docker 容器内运行应用程序时没有成功。我的假设是,如果我们将 smtp 端口暴露在 docker 容器之外,那么 smtp 服务器就可以正常工作了。
docker run -it -p 25:25 --rm courierreports:demo
尝试连接到 smtp 服务器时,代码抛出异常。我需要任何其他工具才能使我的应用程序正常运行吗?
我的机器运行的是 Windows 7,我正在使用 Oracle Virtual Box for docker。smtp 服务器 ( org.smtp.com) 由我公司提供 我使用的端口25
我得到的错误:
fail: StartupLogs[0]
An error occurred.
fail: StartupLogs[0]
Unable to read data from the transport connection: Connection timed out.
fail: StartupLogs[0]
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at MailKit.Net.Smtp.SmtpStream.ReadAhead(CancellationToken cancellationToken)
at MailKit.Net.Smtp.SmtpStream.ReadResponse(CancellationToken cancellationToken)
at MailKit.Net.Smtp.SmtpClient.Connect(String …Run Code Online (Sandbox Code Playgroud) 在谷歌搜索没有结果之后,我会问我的问题:
是什么Mailkit.UniqueId?
在结构的元数据中只是读取
表示 MailKit.IMailFolder 中邮件的唯一标识符
1)它是唯一的,只是让我们说收件箱,但随后 Bin 或 Sent 可能再次具有相同的编号(我从我目前检索到的消息中对此表示怀疑)
2) 对整个 imap 帐户是唯一的吗?
3)它是由mailkit还是由Imap Server产生的id?
4) 什么控制此 Id 的增量以确保它是唯一的。
5) 这个 UniqueID 和 MessageID 之间的主要区别是什么?
我正在尝试将邮件移动到另一个文件夹,但我无法找到一种简单的方法来检查目标文件夹是否存在,我假设给定的文件夹路径是根文件夹,我尝试这样做:
\n\npublic void MoveMessages(Config accountInfo, List<int> uids, string \n sourceFolderName, string targetFolderName) \n{\n ValidateAccountInfoConfiguration(accountInfo);\n using (var client = new ImapClient())\n {\n Authenticate(accountInfo, client);\n\n var sourceFolder = GetSourceFolder(sourceFolderName, client);\n sourceFolder.Open(FolderAccess.ReadWrite);\n var topLevelFolder = client.GetFolder(client.PersonalNamespaces[0]);\n var topFolders = topLevelFolder.GetSubfolders();\n var targetFolder = topFolders.FirstOrDefault(folder => folder.Name == targetFolderName);\n if (targetFolder == null)\n targetFolder = topLevelFolder.Create(targetFolderName, true);\n var uidsToMove = GetUniqueIds(sourceFolder, SearchQuery.Seen).Where(uid => uids.Any(uidToMove => uidToMove == uid.Id)).ToList();\n sourceFolder.MoveTo(uidsToMove, targetFolder);\n sourceFolder.Expunge(uidsToMove);\n\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n在文档中,IMailFolder 接口包含 Exists 属性,但是当我尝试使用 IMailFolder.GetFolder("pathToFolder") 获取文件夹时,如果该文件夹不存在,则会抛出folderNotFound 异常,因此我无法理解用例存在财产,我错过了什么?或者我当前的实现是实现获取目标文件夹的正确方法?
\n我正在尝试使用 MailKit 通过我的 Outlook.com 电子邮件地址发送电子邮件。
我遵循了我在网上看到的所有示例,这就是我所拥有的:
public async Task SendEmailAsync(string email, string subject, string htmlmessage)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Service Account", "me@outlook.com"));
message.To.Add(new MailboxAddress("First Last", email));
message.Subject = subject;
message.Body = new TextPart(TextFormat.Html)
{
Text = htmlMessage
};
using (var client = new SmtpClient())
{
//Have tried both false and true
client.Connect("smtp-mail.outlook.com", 587, false);
client.AuthenticationMechanisms.Remove("XOAUTH2");
client.Authenticate("me@outlook.com", "mypassword");
await client.SendAsync(message);
client.Disconnect(true);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
如果我将useSSL参数设置为trueon client.Connect(),则会出现此错误:
An error occurred while attempting to establish …Run Code Online (Sandbox Code Playgroud) 我好像在绕圈子。。
我尝试过Install-Package -Name 'MailKit' -Source 'nuget.org',但无法找到包源 nuget.org
我尝试从下载中进行本地安装,它只是不断要求依赖包,例如 System.Buffers,然后安装了 Portable.BouncyCastle,但随后遵循 System.Security.Cryptography.Pkcs,最后提示“检测到包的依赖循环”
有谁能够提供安装 MailKit 以便与 Powershell 一起使用的途径,或者提供从 Powershell 发送电子邮件的替代方法?
我只需要从脚本偶尔发送一封通知邮件(每天一封??),但 SendMail 不断发出警告,不应使用它并且已过时。
mailkit ×10
c# ×7
imap ×2
mimekit ×2
asp.net ×1
asp.net-core ×1
docker ×1
email ×1
exception ×1
gmail ×1
outlook.com ×1
powershell ×1
smtp ×1
stream ×1