Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MailKit库保存附件?_C#_Asp.net_Imap_Mailkit - Fatal编程技术网

C# 使用MailKit库保存附件?

C# 使用MailKit库保存附件?,c#,asp.net,imap,mailkit,C#,Asp.net,Imap,Mailkit,我试图学习如何使用MailKit库,但我很难检索附件。到目前为止,我的代码将打开一个邮箱,浏览每封邮件并存储发件人、主题、正文、日期等数据,但我无法处理附件 我曾尝试使用在这里、github和其他网站上找到的其他人的解决方案,但我仍然不清楚他们在代码中做了什么,当我接近解决方案时,它会导致更多的bug,因此我感到压力,并删除所有代码。我并不想显得懒惰,但如果有人能解释一下我是如何做到这一点的,我会很高兴的。我基本上是在尝试为web表单应用程序构建邮件客户端 下面是我的代码,您可以看到我相当无知:

我试图学习如何使用MailKit库,但我很难检索附件。到目前为止,我的代码将打开一个邮箱,浏览每封邮件并存储发件人、主题、正文、日期等数据,但我无法处理附件

我曾尝试使用在这里、github和其他网站上找到的其他人的解决方案,但我仍然不清楚他们在代码中做了什么,当我接近解决方案时,它会导致更多的bug,因此我感到压力,并删除所有代码。我并不想显得懒惰,但如果有人能解释一下我是如何做到这一点的,我会很高兴的。我基本上是在尝试为web表单应用程序构建邮件客户端

下面是我的代码,您可以看到我相当无知:)

//打开收件箱文件夹
client.Inbox.Open(FolderAccess.ReadOnly、cancel.Token);
//获取完整的摘要信息以检索所有详细信息
var summary=client.Inbox.Fetch(0,-1,MessageSummaryItems.Full,cancel.Token);
foreach(汇总中的var msg)
{
//这段代码最初只下载了正文中的文本
var text=msg.Body作为BodyPartText;
//但是我试着改变它,这样它也会在这里得到附件
var attachments=msg.Body作为BodyPartBasic;
if(text==null)
{
var multipart=msg.Body作为BodyPartMultipart;
如果(多部分!=null)
{
text=multipart.BodyParts.OfType().FirstOrDefault();
}
}
if(text==null)
继续;
//我希望这会得到内容配置不为空的消息
//让我做一些事情,比如把附件保存到某个地方,但它会抛出异常
//关于对象引用没有设置为对象的实例,因此它是非常错误的
if(attachments.ContentDisposition!=null&&attachments.ContentDisposition.IsAttachment)
{
//我试着和这里的文字一样抓住身体的部分……但是没有
var attachedpart=client.Inbox.GetBodyPart(msg.Index,attachments,cancel.Token);
}
其他的
{
//没有b计划:(
}
//这将下载*只是*文本
var part=client.Inbox.GetBodyPart(msg.Index,text,cancel.Token);
//将主体文本转换为文本部分
TextPart _body=(TextPart)part;

我不完全清楚您想要完成什么,但是如果您只想下载邮件附件(而不下载整个邮件)并将这些附件保存到文件系统中,以下是您可以完成的方法:

var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId);
int unnamed = 0;

foreach (var message in messages) {
    var multipart = message.Body as BodyPartMultipart;
    var basic = message.Body as BodyPartBasic;

    if (multipart != null) {
        foreach (var attachment in multipart.BodyParts.OfType<BodyPartBasic> ().Where (x => x.IsAttachment)) {
            var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, attachment);
            var fileName = mime.FileName;

            if (string.IsNullOrEmpty (fileName))
                fileName = string.Format ("unnamed-{0}", ++unnamed);

            using (var stream = File.Create (fileName))
                mime.ContentObject.DecodeTo (stream);
        }
    } else if (basic != null && basic.IsAttachment) {
        var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, basic);
        var fileName = mime.FileName;

        if (string.IsNullOrEmpty (fileName))
            fileName = string.Format ("unnamed-{0}", ++unnamed);

        using (var stream = File.Create (fileName))
            mime.ContentObject.DecodeTo (stream);
    }
}
var messages=client.Inbox.Fetch(0,-1,MessageSummaryItems.Full | MessageSummaryItems.UniqueId);
int unnamed=0;
foreach(消息中的var消息){
var multipart=message.Body作为BodyPartMultipart;
var basic=消息体作为BodyPartBasic;
如果(多部分!=null){
foreach(multipart.BodyParts.OfType()中的var附件,其中(x=>x.IsAttachment)){
var mime=(MimePart)client.Inbox.GetBodyPart(message.UniqueId.Value,附件);
var fileName=mime.fileName;
if(string.IsNullOrEmpty(文件名))
fileName=string.Format(“未命名-{0}”,++未命名);
使用(var stream=File.Create(文件名))
mime.ContentObject.DecodeTo(流);
}
}else if(basic!=null&&basic.IsAttachment){
var mime=(MimePart)client.Inbox.GetBodyPart(message.UniqueId.Value,basic);
var fileName=mime.fileName;
if(string.IsNullOrEmpty(文件名))
fileName=string.Format(“未命名-{0}”,++未命名);
使用(var stream=File.Create(文件名))
mime.ContentObject.DecodeTo(流);
}
}

另一个适合我的选择,但似乎更简单一些:

var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure | MessageSummaryItems.UniqueId);
int unnamed = 0;

foreach (var message in messages) {
    foreach (var attachment in message.Attachments) {
        var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, attachment);
        var fileName = mime.FileName;

        if (string.IsNullOrEmpty (fileName))
            fileName = string.Format ("unnamed-{0}", ++unnamed);

        using (var stream = File.Create (fileName))
            mime.ContentObject.DecodeTo (stream);
    }
}

请注意,这是要求在Fetch语句中使用BODYSTRUCTURE而不是BODY,这似乎解决了附件未被标记为BODY的问题。

您到底想做什么?是否只想下载附件并将其保存到磁盘(或某个位置)?主体文本如何?嗨,很抱歉延迟回复,我整个周末都不在。你给出的答案是一个巨大的帮助,我现在可以让它按我想要的方式工作:)我需要弄清楚如何检查邮件的附件,然后对其执行一些操作,例如写入磁盘。我目前正在尝试构建一个简单的邮件客户端,如Gmail、Outlook等。您可以将其配置到任何邮件服务器,它将检索您的所有邮件并将其存储在本地数据库中,然后将其显示给用户对附加文件的控制。抱歉,所有问题,但您的库是目前为止最好的:)再次感谢!@jstedfast我尝试了上面的代码,我无法获取内联消息,因为它们具有isattachment属性False您不需要检查isattachment如果您不想为此欢呼,我已经有一段时间没有查看库了,但是w正在考虑在一个新项目上再次尝试。从上次我在这里寻求帮助以来,我学到了一些东西,但感谢您的帮助:)
var messages = client.Inbox.Fetch (0, -1, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure | MessageSummaryItems.UniqueId);
int unnamed = 0;

foreach (var message in messages) {
    foreach (var attachment in message.Attachments) {
        var mime = (MimePart) client.Inbox.GetBodyPart (message.UniqueId.Value, attachment);
        var fileName = mime.FileName;

        if (string.IsNullOrEmpty (fileName))
            fileName = string.Format ("unnamed-{0}", ++unnamed);

        using (var stream = File.Create (fileName))
            mime.ContentObject.DecodeTo (stream);
    }
}