MailKit:如何从 MimeMessage 本地下载所有附件
MailKit: How to download all attachments locally from a MimeMessage
我看过其他在线示例,但我无法弄清楚如何从 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
}
}
}
}
}
"How do I save attachments?" 部分的 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()
方法中抛出异常。如果您只是调用 Connect()
2 行,则无需检查 IsConnected
状态。
- 如果您甚至没有在任何地方使用它,为什么还要检查
inboxFolder.Unread
?如果您只想下载未读邮件,请将搜索更改为 SearchQuery.NotSeen
,这将只为您提供尚未阅读的邮件 UID。
- 我删除了您的
IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);
逻辑,因为您不需要它。如果您打算使用 client.Inbox
进行搜索,则不要使用不同的文件夹对象迭代结果。
我看过其他在线示例,但我无法弄清楚如何从 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
}
}
}
}
}
"How do I save attachments?" 部分的 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()
方法中抛出异常。如果您只是调用Connect()
2 行,则无需检查IsConnected
状态。 - 如果您甚至没有在任何地方使用它,为什么还要检查
inboxFolder.Unread
?如果您只想下载未读邮件,请将搜索更改为SearchQuery.NotSeen
,这将只为您提供尚未阅读的邮件 UID。 - 我删除了您的
IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);
逻辑,因为您不需要它。如果您打算使用client.Inbox
进行搜索,则不要使用不同的文件夹对象迭代结果。