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和私人邮件(我不是说所有这些域都不读附件),其他的读得很好。
问题:
我想知道是什么原因导致我无法阅读这些电子邮件。会不会是有一些隐私设置,例如在 gmail 中,使其阻止代码中的附件?
如果这是真的,您将如何启用它?或者我应该改变代码的实现方式?
最好的例子是什么?
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.
如果有人有更好的解决方案,那就太壮观了。
我使用 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 中,使其阻止代码中的附件?
如果这是真的,您将如何启用它?或者我应该改变代码的实现方式?
最好的例子是什么?
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.
如果有人有更好的解决方案,那就太壮观了。