我在其他的例子在网上看了,但我无法弄清楚如何从一个MimeMessage对象下载并存储所有附件。我没有看到的writeTo(),但我不能得到它的工作。也想知道是否附件将根据原文件名保存,并键入电子邮件内。这是我到目前为止有:
using (var client = new ImapClient())
{
client.Connect(Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect);
client.AuthenticationMechanisms.Remove(Constant.GoogleOAuth);
client.Authenticate(Constant.GoogleUserName, Constant.GenericPassword);
if (client.IsConnected == true)
{
FolderAccess inboxAccess = client.Inbox.Open(FolderAccess.ReadWrite);
IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);
IList<UniqueId> uids = client.Inbox.Search(SearchQuery.All);
if (inboxFolder != null & inboxFolder.Unread > 0)
{
foreach (UniqueId msgId in uids)
{
MimeMessage message = inboxFolder.GetMessage(msgId);
foreach (MimeEntity attachment in message.Attachments)
{
//need to save all the attachments locally
}
}
}
}
}
这是所有在FAQ中解释说,“我如何保存附件?”部分。
这里是你在你的问题发布的代码的固定版本:
using (var client = new ImapClient ()) {
client.Connect (Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect);
client.AuthenticationMechanisms.Remove (Constant.GoogleOAuth);
client.Authenticate (Constant.GoogleUserName, Constant.GenericPassword);
client.Inbox.Open (FolderAccess.ReadWrite);
IList<UniqueId> uids = client.Inbox.Search (SearchQuery.All);
foreach (UniqueId uid in uids) {
MimeMessage message = client.Inbox.GetMessage (uid);
foreach (MimeEntity attachment in message.Attachments) {
var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
using (var stream = File.Create (fileName)) {
if (attachment is MessagePart) {
var rfc822 = (MessagePart) attachment;
rfc822.Message.WriteTo (stream);
} else {
var part = (MimePart) attachment;
part.Content.DecodeTo (stream);
}
}
}
}
}
几点注意事项:
client.IsConnected
。如果没有连接,它会甩在了Authenticate()
方法例外。这本来甩在了Connect()
方法的异常,以及如果没有成功。有没有必要检查IsConnected
状态,如果你真的只是叫Connect()
2行了。inboxFolder.Unread
如果你甚至不随地使用它呢?如果你只是想下载未读邮件,更改您的搜索是SearchQuery.NotSeen
,这将给你只尚未阅读该邮件的UID。IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);
逻辑,因为你不需要它。如果你打算使用client.Inbox
做搜索,那么不重复的进行不同的文件夹中对象的结果。