MimeMessage无法在C#中正确读取附件



如果这个问题与其他问题类似,我很抱歉,但我在这里和GitHub上找到的代码无论如何都无法解决它。

我必须开发一个每天运行的工作,并下载特定电子邮件的附件。问题是,程序的行为就像附件是空的,尽管它不是。

以下是我正在使用的代码:

附言:我指定我是一名初级开发人员,当然我的代码不是最好的:(

client.Connect("smtp.gmail.com", 993);
client.Authenticate(USERID, PASSWORD); 
var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadWrite);
for (int i = 0; i < inbox.Count; i++)
{
var message = inbox.GetMessage(i); 

var today = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy"));
var tomorrow = today.AddDays(1);
var address = InternetAddress.Parse("String who contains the email address");
if (message.Date > today && message.Date < tomorrow && message.From.Contains(address))
{
var attachments = message.Attachments; 
foreach(var attachment in attachments)
{
using (MemoryStream ms = new MemoryStream())
{
UTF8Encoding utf8 = new UTF8Encoding();
attachment.ContentType.CharsetEncoding = utf8;
attachment.WriteTo(ms);
}
}

}
break;
}

编辑:

我解决了这个问题。MimeEntity对象不是我必须加载的最后一个对象,它需要MessagePart中的Parse((来只获取文本的正文,这样我就可以使用那个家伙在评论中建议我的方法。为了节省时间,我通过在for之前进行过滤来修复循环。

var client = new ImapClient();
client.Connect("smtp.gmail.com", 993);
client.Authenticate(USERID, PASSWORD);
var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadWrite);
var today = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy"));
var query = SearchQuery.SentOn(today).And (SearchQuery.FromContains(USERID_OF_SENDER)); 
var messageUid = inbox.Search(query);

foreach(UniqueId uid in messageUid)
{

var message = inbox.GetMessage(uid);         
var attachments = message.Attachments;
foreach (var attachment in message.Attachments)
{
using (var ms = new MemoryStream())
{
if (attachment is MessagePart)
{
var part = (MessagePart)attachment; 
part.Message.WriteTo(ms);
}
else
{
var part = (MimePart)attachment;
part.Content.DecodeTo(ms);
}
//method for upload the file
}
}                   
}

我不知道你打算做什么,但以下两行肯定是错误的:

UTF8Encoding utf8 = new UTF8Encoding();
attachment.ContentType.CharsetEncoding = utf8;

下面一行写的MIME实体可能不是您想要的:

attachment.WriteTo(ms);

大概,您想要编写附件的解码内容:

foreach(var attachment in attachments.OfType<MimePart>())
{
using (MemoryStream ms = new MemoryStream())
{
attachment.WriteTo(ms);
}
}

最新更新