Я использую библиотеку S22.IMAP следующим образом:
using (ImapClient client = new ImapClient(imap, 993,
usuario, psw, AuthMethod.Login, true))
{
foreach (var uid in client.Search(SearchCondition.Unseen()))
{
var message = client.GetMessage(uid);
foreach (Attachment atc in message.Attachments)
{
if (System.IO.Path.GetExtension(atc.Name) == ".xml")
{
String archivoXML_texto = "";
byte[] allBytes = new byte[atc.ContentStream.Length];
int bytesRead = atc.ContentStream.Read(allBytes, 0, (int)atc.ContentStream.Length);
using (MemoryStream memory = new MemoryStream(allBytes))
{
StreamReader archivoXML = new StreamReader(memory);
archivoXML_texto = archivoXML.ReadToEnd();
archivoXML.Close();
memory.Dispose();
}
.......
.......
}
}
}
}
}
У меня проблема: когда я пытаюсь прочитать вложение какого-то письма, При отладке кода я понимаю, что не читает вложение. Странно то, что это событие происходит с некоторыми электронными письмами, а также с gmail и частными электронными письмами (я не говорю, что все эти домены не читают вложения), другие читают их хорошо.
Вопросов:
Я хотел бы знать, по какой причине я не могу читать эти электронные письма. Может быть, есть какие-то настройки конфиденциальности, например в Gmail, которые заставляют его блокировать вложения в коде?
Если бы это было правдой, как бы вы его включили? Или мне следует изменить способ реализации кода?
И какой пример был бы лучшим или хорошим?
Он не использует MailKit, он использует S22.Imap.
IMAP затрудняет или делает невозможным создание таких функций конфиденциальности. У клиентов либо есть доступ ко всем частям сообщения, либо нет. Но если вы используете какую-то защиту от вирусов с повреждением мозга, это может быть оно.





using (var client = new ImapClient ()) {
client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
client.Authenticate ("[email protected]", "password");
client.Inbox.Open(FolderAccess.ReadWrite);
var uids = client.Inbox.Search(SearchQuery.NotSeen);
foreach (var uid in uids)
{
var message = client.Inbox.GetMessage(uid);
client.Inbox.AddFlags(uid, MessageFlags.Seen, true);
foreach (var attachment in message.Attachments.OfType<MimePart>())
{
if (System.IO.Path.GetExtension(attachment.FileName) == ".xml")
{
byte[] allBytes = new byte[attachment.Content.Stream.Length];
int bytesRead = attachment.Content.Stream.Read(allBytes, 0, (int)attachment.Content.Stream.Length);
string texto_definitivo = "";
String archivoXML_textoBase64 = "";
using (MemoryStream memory = new MemoryStream(allBytes))
{
StreamReader archivoXML = new StreamReader(memory);
archivoXML_textoBase64 = archivoXML.ReadToEnd();
byte[] temp_backToBytes = Convert.FromBase64String(archivoXML_textoBase64);
texto_definitivo = Encoding.ASCII.GetString(temp_backToBytes);
archivoXML.Close();
memory.Dispose();
}
}
}
}
client.Disconnect (true);
}
Было бы лучше преобразовать текст, похожий на base64, в строку. Было бы идеально, если бы содержимое текста вложения было получено напрямую, без преобразования в byte [], byte [] для строкового содержания вложения (по какой-то странной причине это строка в base64), из строки base64 в байт [] и из байта [] в строку.
Если у кого-то есть лучшее решение, это будет потрясающе.
Прежде чем вы получите какие-либо отрицательные голоса, отредактируйте / одобрите существующие правки для вашего сообщения, чтобы лучше объяснить вашу проблему. Во-первых,
Titleполностью неправильный. Это должен быть скорееCannot red attachments using MailKit. Переходя к вашему вопросу, ваш главный вопрос имеет много недостатков также, что нельзя описать в комментариях. Насколько я понимаю, вы используете классImapClient, который является частьюImapXили MailKit`, но в вашем случае этоMailKit, который вы должны были добавить по крайней мере вTagsОднако для устранения неполадок перейдите здесь