S22.IMAP不总是看附件

S22.IMAP does not always read attachments

我使用 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和私人邮件(我不是说所有这些域都不读附件),其他的读得很好。

问题:

  1. 我想知道是什么原因导致我无法阅读这些电子邮件。会不会是有一些隐私设置,例如在 gmail 中,使其阻止代码中的附件?

  2. 如果这是真的,您将如何启用它?或者我应该改变代码的实现方式?

  3. 最好的例子是什么?

using (var client = new ImapClient ()) {
            client.Connect ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
            client.Authenticate ("mailo@gmail.com", "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[]转string附件内容(不知为何是base64的string),从string base64转成string就更理想了到 byte [ ],从 byte [] 到 string.

如果有人有更好的解决方案,那就太壮观了。