S22.IMAP并不总是读取附件

时间:2018-03-27 17:50:53

标签: c# asp.net imap attachment gmail-imap

我使用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. 什么是最好或最好的例子?

1 个答案:

答案 0 :(得分:0)

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 []来链接附件的内容(因为某些奇怪的原因是base64中的字符串),来自字符串base64,这将是理想的到byte [],从byte []到string。

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