我正在使用MailKit/MimeKit 1.2.7(最新的NuGet版本).
我尝试通过API文档中的示例("使用BodyBuilder"部分)将图像嵌入到我的电子邮件的HTML正文中.
我当前的代码如下所示:
var builder = new BodyBuilder();
builder.HtmlBody = @"<p>Hey!</p><img src=""Image.png"">";
var pathImage = Path.Combine(Misc.GetPathOfExecutingAssembly(), "Image.png");
builder.LinkedResources.Add(pathLogoFile);
message.Body = builder.ToMessageBody();
Run Code Online (Sandbox Code Playgroud)
我可以发送此电子邮件,实际上图像已附加到电子邮件中.但它没有嵌入.
我错过了什么吗?或者这是Apple Mail的错(这是我用来接收电子邮件的电子邮件客户端)?
我很感激任何想法(非常感谢Jeffrey Stedfast提供这么棒的工具集!!).
英格玛
我正在涉足ASP 5/MVC 6组合,我发现我不再知道如何做最简单的事情.例如,您如何发送电子邮件?
在MVC 5世界中,我会做这样的事情:
using (var smtp = new SmtpClient("localhost"))
{
var mail = new MailMessage
{
Subject = subject,
From = new MailAddress(fromEmail),
Body = message
};
mail.To.Add(toEmail);
await smtp.SendMailAsync(mail);
}
Run Code Online (Sandbox Code Playgroud)
现在这段代码不再编译,System.Net.Mail似乎不再存在.在互联网上进行一些讨论之后,它似乎不再包含在新的核心(dnxcore50)中.这让我想到了我的问题......
你如何在新世界发送电子邮件?
还有一个更大的问题,你在哪里可以找到核心.Net中不再包含的所有东西的替代品?
我正在为我的项目使用Mailkit库(Imap).
我可以通过SmtpClient轻松发送新消息.
目前我正在挖掘如何回复特定邮件.是否可以为该回复邮件添加更多收件人?
@jstedfast感谢精彩的:)
我使用MailKit(https://github.com/jstedfast/MailKit)通过imap连接谷歌应用程序,我怎么能删除一条消息呢?(我可以将它移到垃圾箱,只需将其从收件箱中取出即可.
到目前为止,我已将其连接,下载,解析来自邮件正文的链接.我只需要最后一个动作来获得我需要的东西.
谢谢!
有没有办法将MimeKit.MimeMessage转换为可以在Web浏览器中呈现的HTML?我不关心邮件附件,但希望能够在浏览器中显示邮件正文,包括嵌入的图像.我是MimeKit的新手,无法在API文档中找到任何内容.任何信息表示赞赏.
编辑:我没有找到与MimeKit本地执行此操作的方法,但我将其与HtmlAgilityPack结合以解析MimeMessage.HtmBody并修复内嵌图像.这似乎有效,除非有人有更好的主意,否则我会继续使用它.供参考,这是代码:
//////////////////////////////////////////////////////////////////////////////////////////
// use MimeKit to parse the message
//////////////////////////////////////////////////////////////////////////////////////////
MimeKit.MimeMessage msg = MimeKit.MimeMessage.Load(stream);
//////////////////////////////////////////////////////////////////////////////////////////
// use HtmlAgilityPack to parse the resulting html in order to fix inline images
//////////////////////////////////////////////////////////////////////////////////////////
HtmlAgilityPack.HtmlDocument hdoc = new HtmlAgilityPack.HtmlDocument();
hdoc.LoadHtml(msg.HtmlBody);
// find all image nodes
var images = hdoc.DocumentNode.Descendants("img");
foreach (var img in images)
{
// check that this is an inline image
string cid = img.Attributes["src"].Value;
if (cid.StartsWith("cid:"))
{
// remove the cid part of the attribute
cid = cid.Remove(0, 4);
// …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 imap 访问 gmail 电子邮件,并且代码在 ssl 握手时失败,但没有显示任何错误。如果有人可以帮忙解决这个问题,真的很感激。我已经使用 xunit,.NET Core 2.1 构建了它。我正在使用 MailKit Nuget
public GMailHandler(string mailServer, int port, bool ssl, string login, string password)
//mailServer = imap.gmail.com
//port = 993
//ssl = true
{
if (ssl)
Client.Connect(mailServer, port);
else
Client.Connect(mailServer, port);
Client.Authenticate(login, password);
Client.Inbox.Open(FolderAccess.ReadOnly);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用MailKit/MimeKit 1.2.7(最新的NuGet版本).
使用ImapClient删除电子邮件非常简单......
client.Inbox.AddFlags(uniqueId, MessageFlags.Deleted, silent: true);
Run Code Online (Sandbox Code Playgroud)
...如果您知道电子邮件UniqueId或其索引.
就我而言,我不知道其中任何一方.我所拥有的只是消息本身(MimeMessage)和它的MessageId.
我希望MessageId == UniqueId,但显然事实并非如此.
我是否有机会通过拥有相应的MimeMessage/MessageId来删除电子邮件?
IMAP 规范(RFC 2060,5.1.3。邮箱国际命名约定)描述了如何处理文件夹名称中的非 ASCII 字符。它定义了经过修改的UTF-7 编码:
按照惯例,国际邮箱名称使用 [UTF-7] 中描述的 UTF-7 编码的修改版本指定。这些修改的目的是纠正 UTF-7 的以下问题:
UTF-7 使用“+”字符进行移位;这与邮箱名称中常用的“+”冲突,尤其是 USENET 新闻组名称。
UTF-7 的编码是 BASE64,它使用“/”字符;这与使用“/”作为流行的层次结构分隔符相冲突。
UTF-7 禁止“\”的未编码使用;这与使用“\”作为流行的层次结构分隔符相冲突。
UTF-7 禁止“~”的未编码使用;这与在某些服务器中使用“~”作为主目录指示符相冲突。
UTF-7 允许多种替代形式来表示同一个字符串;特别是,可打印的 US-ASCII 字符可以以编码形式表示。
在修改后的 UTF-7 中,除“&”之外的可打印 US-ASCII 字符代表它们自己;也就是说,八位字节值为 0x20-0x25 和 0x27-0x7e 的字符。字符“&”(0x26)由两个八位字节序列“&-”表示。
所有其他字符(八位字节值 0x00-0x1f、0x7f-0xff 和所有 Unicode 16 位八位字节)都以修改后的 BASE64 表示,[UTF-7] 进一步修改为使用“,”而不是“/”。
修改后的 BASE64 不得用于表示任何可以表示其自身的打印 US-ASCII 字符。"&" 用于转换到修改后的 BASE64 和 "-" 用于转换回 US-ASCII。所有名称都以 US-ASCII 开头,并且必须以 US-ASCII 结尾(即以 Unicode 16 位八位字节结尾的名称必须以“-”结尾)。
在我开始实现它之前,我的问题是:是否有一些.NET 代码/库(甚至在框架中)可以完成这项工作?我找不到 .NET 资源(仅适用于其他语言/框架的实现)。
谢谢!
我想从我的Gmail帐户中读取emial.我正在使用"OpenPop.Pop3"来阅读我的Gmail帐户中的电子邮件,我使用下面的代码: -
using OpenPop.Pop3;
public DataTable ReadEmailsFromId()
{
DataTable table = new DataTable();
try
{
using (Pop3Client client = new Pop3Client())
{
int messageCount = client.GetMessageCount();
for (int i = messageCount; i > 0; i--)
{
table.Rows.Add(client.GetMessage(i).Headers.Subject, client.GetMessage(i).Headers.DateSent);
string msdId = client.GetMessage(i).Headers.MessageId;
OpenPop.Mime.Message msg = client.GetMessage(i);
OpenPop.Mime.MessagePart plainTextPart = msg.FindFirstPlainTextVersion();
string message = plainTextPart.GetBodyAsText();
}
}
}
return table;
}
Run Code Online (Sandbox Code Playgroud)
但它在2016年3月4日之前收到的电子邮件,没有提取新的/最新的电子邮件."OpenPop.Pop3"中有任何限制,还是我遗漏了什么?
我正在尝试将邮件移动到另一个文件夹,但我无法找到一种简单的方法来检查目标文件夹是否存在,我假设给定的文件夹路径是根文件夹,我尝试这样做:
\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