C# 如何区分电子邮件Imap中的内联图像、签名和其他空白图像
我正在使用Mailkit从邮箱中获取电子邮件,并将其保存到数据库中,以显示在我的MVC应用程序中 我将html电子邮件以纯文本形式保存在数据库中,我可以获取附件并将其保存在文件系统中,但当电子邮件中有内联图像时,我的问题在于签名和其他空白图像也被保存为文件系统中的附件 有没有办法区分内联附件和签名或其他空白图像 提前感谢使用: 阅读电子邮件的班级:C# 如何区分电子邮件Imap中的内联图像、签名和其他空白图像,c#,email,model-view-controller,imap,mailkit,C#,Email,Model View Controller,Imap,Mailkit,我正在使用Mailkit从邮箱中获取电子邮件,并将其保存到数据库中,以显示在我的MVC应用程序中 我将html电子邮件以纯文本形式保存在数据库中,我可以获取附件并将其保存在文件系统中,但当电子邮件中有内联图像时,我的问题在于签名和其他空白图像也被保存为文件系统中的附件 有没有办法区分内联附件和签名或其他空白图像 提前感谢使用: 阅读电子邮件的班级: class readMail:IDisposable { public Imap4Client client = new I
class readMail:IDisposable
{
public Imap4Client client = new Imap4Client();
public readMail(string mailServer, int port, bool ssl, string login, string password)
{
Pop3Client pop = new Pop3Client();
if (ssl)
{
client.ConnectSsl(mailServer, port);
}
else
client.Connect(mailServer, port);
client.Login(login, password);
}
public IEnumerable<Message> GetAllMails(string mailBox)
{
IEnumerable<Message> ms = GetMails(mailBox, "ALL").Cast<Message>();
return GetMails(mailBox, "ALL").Cast<Message>();
}
protected Imap4Client Client
{
get { return client ?? (client = new Imap4Client()); }
}
private MessageCollection GetMails(string mailBox, string searchPhrase)
{
try
{
MessageCollection messages = new MessageCollection();
Mailbox mails = new Mailbox();
mails = Client.SelectMailbox(mailBox);
messages = mails.SearchParse(searchPhrase);
return messages;
}
catch(Exception ecc)
{
}
}
public void Dispose()
{
throw new NotImplementedException();
}
}
在我的例子中,所有签名的图像都位于未知位置的imeparts中,但这可能是不同电子邮件客户端等的特定情况。因此,据我所知,我没有发现任何库使用以下方法将嵌入图像从上下文图像分离到签名图像:
阅读电子邮件的班级:
class readMail:IDisposable
{
public Imap4Client client = new Imap4Client();
public readMail(string mailServer, int port, bool ssl, string login, string password)
{
Pop3Client pop = new Pop3Client();
if (ssl)
{
client.ConnectSsl(mailServer, port);
}
else
client.Connect(mailServer, port);
client.Login(login, password);
}
public IEnumerable<Message> GetAllMails(string mailBox)
{
IEnumerable<Message> ms = GetMails(mailBox, "ALL").Cast<Message>();
return GetMails(mailBox, "ALL").Cast<Message>();
}
protected Imap4Client Client
{
get { return client ?? (client = new Imap4Client()); }
}
private MessageCollection GetMails(string mailBox, string searchPhrase)
{
try
{
MessageCollection messages = new MessageCollection();
Mailbox mails = new Mailbox();
mails = Client.SelectMailbox(mailBox);
messages = mails.SearchParse(searchPhrase);
return messages;
}
catch(Exception ecc)
{
}
}
public void Dispose()
{
throw new NotImplementedException();
}
}
在我的例子中,所有签名的图像都在未知位置的imeparts中,但这可能是一个特定的情况,不同的电子邮件客户端等等。因此,据我所知,我没有找到任何库将嵌入图像从上下文图像分离到签名图像使用哪个IMAP库并不重要,它们都没有一个功能可以帮助你做你想做的事情,因为这是一个非常重要的问题,你需要用一些独创性来解决 您可以做的是从中的HtmlPreviewVisitor示例开始,每隔一点修改它,将附件拆分为两个列表: 实际附件清单 通过遍历HTML并跟踪哪些图像被引用,HTML实际引用的图像列表 代码: 一种更简单的方法,虽然不太防错,但它实际上并不验证图像是否被HTML引用,方法如下:
var embeddedImages = message.BodyParts.OfType<MimePart> ().
Where (x => x.ContentType.IsMimeType ("image", "*") &&
x.ContentDisposition != null &&
x.ContentDisposition.Disposition.Equals ("inline" StringComparison.OrdinalIgnoreCase));
现在您已经有了嵌入图像的列表,您必须找到一种方法来确定它们是仅用于签名还是用于HTML的其他地方 很可能您还需要分析HTML本身 可能还值得注意的是,一些HTML邮件将引用web上未嵌入邮件MIME中的图像。如果您也需要这些图像,那么如果我提供的代码在消息的MIME中找不到图像,您需要修改TryGetImage,以便从web下载图像 对于根本不能使用图像的文本/普通消息,将签名与消息正文的其余部分分开的常见约定是一行只有两个破折号和一个空格:- 根据我对具有签名的HTML消息的有限经验,它们似乎没有遵循类似的约定。查看我从使用Outlook的Microsoft同事那里收到的一些HTML邮件,它们似乎在邮件末尾的a内。但是,这假定消息不是答复。一旦你开始解析消息回复,这就结束在消息的某个地方,因为正在回复的原始消息在结尾。
因为每个人的签名都是不同的,我不确定这种相似性是否是Outlook的惯例,或者人们是否在手动构造他们的签名,他们都只是出于巧合而使用表格,我也只看到少数人,大多数人不使用签名,因此,我的样本量非常小。无论您使用哪个IMAP库,它们都没有一个功能可以帮助您完成您想做的事情,因为这是一个非常重要的问题,您需要使用一些独创性来解决 您可以做的是从中的HtmlPreviewVisitor示例开始,每隔一点修改它,将附件拆分为两个列表: 实际附件清单 通过遍历HTML并跟踪哪些图像被引用,HTML实际引用的图像列表 代码: 一种更简单的方法,虽然不太防错,但它实际上并不验证图像是否被HTML引用,方法如下:
var embeddedImages = message.BodyParts.OfType<MimePart> ().
Where (x => x.ContentType.IsMimeType ("image", "*") &&
x.ContentDisposition != null &&
x.ContentDisposition.Disposition.Equals ("inline" StringComparison.OrdinalIgnoreCase));
现在您已经有了嵌入图像的列表,您必须找到一种方法来确定它们是仅用于签名还是用于HTML的其他地方 很可能您还需要分析HTML本身 可能还值得注意的是,一些HTML邮件将引用web上未嵌入邮件MIME中的图像。如果您也需要这些图像,那么如果我提供的代码在消息的MIME中找不到图像,您需要修改TryGetImage,以便从web下载图像 对于根本不能使用图像的文本/普通消息,将签名与消息正文的其余部分分开的常见约定是一行只有两个破折号和一个空格:- 从我对带有签名的HTML消息的有限经验来看,它们是 o似乎没有遵循类似的惯例。查看我从使用Outlook的Microsoft同事那里收到的一些HTML邮件,它们似乎在邮件末尾的a内。但是,这假定消息不是答复。一旦你开始解析消息回复,这就结束在消息的某个地方,因为正在回复的原始消息在结尾。
因为每个人的签名都是不同的,我不确定这种相似性是否是Outlook的惯例,或者人们是否在手动构造他们的签名,他们都只是出于巧合而使用表格,我也只看到少数人,大多数人不使用签名,因此,我的样本量非常小。我也遇到了同样的问题,但我使用ActiveUp,我找到了问题的解决方案,如果您对我的解决方案感兴趣,请告诉我我对它的更多信息感兴趣。我使用的是:基本上我有一个窗口服务,可以检查邮箱文件夹,当它找到一些邮件时,它会读取邮件的html,附件和嵌入在文本中的图像,然后在XWiKi上写一篇文章,我认为你对这部分不感兴趣,如果你认为我的代码是解决方案或有用的答案,我会给你,你的解决方案可以使用MayKIT吗?我正在使用控制台应用程序在邮箱文件夹中查找新电子邮件。我更感兴趣的是如何区分签名和真正的内联附件,而不是附件。事实上,我的问题是签名的图像在第一时间没有显示,因为它们保存在其他对象上,因此,当我的服务在xwiki上写文章时,它在签名上显示缺失的图像,这非常难看,因此基本上使用ActiveUp可以区分不同的图像,但我不知道mailkit Sorry我也有同样的问题,但我使用ActiveUp,我找到了问题的解决方案,如果您对我的解决方案感兴趣,请告诉我我对它的更多信息感兴趣。我使用的是:基本上我有一个窗口服务,检查邮箱文件夹,当它找到一些邮件时,它会读取邮件的html、附件和嵌入文本中的图像,之后,它在XWiKi上写了一篇文章,我认为你对这个部分不感兴趣,如果你认为我的代码是解决方案或有用的答案,我会给你,你的解决方案可以使用MayKIT吗?我正在使用控制台应用程序在邮箱文件夹中查找新电子邮件。我更感兴趣的是如何区分签名和真正的内联附件,而不是附件。事实上,我的问题是签名的图像在第一时间没有显示,因为它们保存在其他对象上,因此,当我的服务在xwiki上写文章时,它在签名上显示缺失的图像,这非常难看,因此基本上使用ActiveUp可以区分不同的图像,但是我不知道mailkit Sorry这是如何区分签名图像和HTML引用的其他图像的?你必须找到一种方法来确定它们是仅用于签名还是用于HTML的其他地方。这就是问题所在,所以你的答案根本没有回答。我只是从你的答案中复制了它,因此,即使是你的答案也不能回答:这就是为什么我解释了如何遍历HTML以让他至少开始:这如何区分签名图像和HTML引用的其他图像?你必须找到一种方法来确定它们是仅用于签名还是用于HTML中的其他位置。这就是问题是,所以你的答案根本没有答案。ops我只是从你的答案中复制了它,所以即使是你的答案也没有答案:这就是为什么我解释了如何遍历HTML让他至少开始:谢谢。我从你的文件中试过了。但是它不能工作。我会再试一次。你想做的事情非常困难,因为除非你能找到一种简单易行的方法来确定什么HTML内容构成了签名,否则就无法确定HTML中的哪些图像是签名。哇,这是一个很棒的答案。@jstedfast我有一个问题,图像在web上,我得到的内容配置为null,内容类型为text\html。你能为我指出一个正确的方向吗?你必须解析HTML并提取图像源的URL,然后使用HttpWebRequest或其他方法下载它。您可以使用MimeKit.Text.HtmlTokenizer来标记HTML内容,也可以使用更简单的解决方案,如HtmlAgilityPack。谢谢。我从你的文件中试过了。但是它不能工作。我会再试一次。你想做的事情非常困难,因为除非你能找到一种简单易行的方法来确定签名是由什么HTML内容组成的,否则就无法确定HTML中的哪些图像是签名。哇,这是一个很棒的答案。@jstedfast i
如果图像在web上出现此问题,我得到的内容配置为null,内容类型为text\html。你能为我指出一个正确的方向吗?你必须解析HTML并提取图像源的URL,然后使用HttpWebRequest或其他方法下载它。您可以使用MimeKit.Text.HtmlTokenizer标记HTML内容,也可以使用更简单的解决方案,如HtmlAlityPack。
var embeddedImages = message.BodyParts.OfType<MimePart> ().
Where (x => x.ContentType.IsMimeType ("image", "*") &&
x.ContentDisposition != null &&
x.ContentDisposition.Disposition.Equals ("inline" StringComparison.OrdinalIgnoreCase));