Filtrar Mensagens do Servidor Usando Cliente IMAP
A classe ImapClient fornece o método ListMessages() que obtém todas as mensagens de uma caixa de entrada. Para obter apenas mensagens que correspondem a alguma condição, use o método sobrecarregado ListMessages() que recebe MailQuery como argumento. A classe MailQuery fornece várias propriedades para especificar as condições, por exemplo, data, assunto, remetente, destinatário e assim por diante. O primeiro exemplo ilustra como filtrar mensagens com base na data e no assunto. Também mostramos como filtrar com base em outros critérios e como construir consultas mais complexas. A API também fornece a capacidade de aplicar critérios de pesquisa sensíveis a maiúsculas e minúsculas para corresponder a critérios de filtragem exatos. A API também permite especificar a codificação da string de pesquisa para filtrar mensagens da caixa de entrada.
Filtrando Mensagens da Caixa de Entrada
- Conectar e fazer login em um servidor IMAP
- Crie uma instância de MailQuery e defina as propriedades
- Chame o método
ImapClient.ListMessages(MailQuery query)
e passe oMailQuery
com os parâmetros para obter apenas mensagens filtradas.
O seguinte trecho de código mostra como se conectar a uma caixa de entrada IMAP e obter mensagens que chegaram hoje e têm a palavra “newsletter” no assunto.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Connect and log in to IMAP | |
const string host = "host"; | |
const int port = 143; | |
const string username = "user@host.com"; | |
const string password = "password"; | |
ImapClient client = new ImapClient(host, port, username, password); | |
client.SelectFolder("Inbox"); | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter"); | |
builder.InternalDate.On(DateTime.Now); | |
// Build the query and Get list of messages | |
MailQuery query = builder.GetQuery(); | |
ImapMessageInfoCollection messages = client.ListMessages(query); | |
Console.WriteLine("Imap: " + messages.Count + " message(s) found."); | |
// Disconnect from IMAP | |
client.Dispose(); |
Obter Mensagens que Atendem a Critérios Específicos
Os exemplos de código acima filtram mensagens com base no assunto e na data do e-mail. Podemos usar outras propriedades para definir outras condições suportadas também. Abaixo estão alguns exemplos de como definir as condições usando MailQuery. Os trechos de código a seguir mostram como filtrar e-mails em:
- Data de hoje.
- Um intervalo de datas.
- De um remetente específico.
- De um domínio específico.
- De um destinatário específico.
Data de Hoje
O seguinte trecho de código mostra como filtrar e-mails na Data de Hoje.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails that arrived today | |
MailQueryBuilder builder = new MailQueryBuilder(); | |
builder.InternalDate.On(DateTime.Now); |
Intervalo de Datas
O seguinte trecho de código mostra como filtrar e-mails no intervalo de datas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails that arrived in last 7 days | |
builder.InternalDate.Before(DateTime.Now); | |
builder.InternalDate.Since(DateTime.Now.AddDays(-7)); |
Remetente Específico
O seguinte trecho de código mostra como filtrar e-mails de um remetente específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails from specific sender | |
builder.From.Contains("saqib.razzaq@127.0.0.1"); |
Domínio Específico
O seguinte trecho de código mostra como filtrar e-mails de um domínio específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails from specific domain | |
builder.From.Contains("SpecificHost.com"); |
Destinatário Específico
O seguinte trecho de código mostra como filtrar e-mails de um destinatário específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails sent to specific recipient | |
builder.To.Contains("recipient"); |
Construindo Consultas Complexas
Se diferentes propriedades de MailQueryBuilder forem definidas em declarações separadas, todas as condições serão correspondidas. Por exemplo, se quisermos obter mensagens entre um intervalo de datas e de um host específico, precisamos escrever três declarações.
Combinando Consultas com AND
O seguinte trecho de código mostra como combinar consultas com AND.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago | |
builder.From.Contains("SpecificHost.com"); | |
builder.InternalDate.Before(DateTime.Now); | |
builder.InternalDate.Since(DateTime.Now.AddDays(-7)); |
Combinando Consultas com OR
MailQueryBuilder fornece o método Or() que recebe duas instâncias de MailQuery como parâmetros. Ele obtém as mensagens que correspondem a qualquer uma das duas condições especificadas. O seguinte trecho de código mostra como filtrar mensagens que têm “teste” no assunto ou “noreply@host.com” como remetente. O seguinte trecho de código mostra como combinar consultas com OR.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Specify OR condition | |
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com")); |
Filtragem com base em InternalDate
As mensagens podem ser extraídas do servidor com base no InternalDate, no entanto, às vezes o servidor não retorna todas as mensagens visíveis na caixa de entrada. O motivo pode ser o fuso horário do servidor, já que pode não ser UTC para todos os servidores como o Gmail. Aspose envia comandos como 008 SEARCH ON 4-May-2014 de acordo com o protocolo IMAP, no entanto, o resultado pode diferir devido às configurações de fuso horário do servidor. Um novo membro é adicionado em ImapMessageInfo como InternalDate, o que ajuda ainda mais na filtragem das mensagens. O seguinte trecho de código mostra o uso de InternalDate para filtrar mensagens.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Connect and log in to IMAP | |
const string host = "host"; | |
const int port = 143; | |
const string username = "user@host.com"; | |
const string password = "password"; | |
ImapClient client = new ImapClient(host, port, username, password); | |
client.SelectFolder("Inbox"); | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter"); | |
builder.InternalDate.On(DateTime.Now); | |
// Build the query and Get list of messages | |
MailQuery query = builder.GetQuery(); | |
ImapMessageInfoCollection messages = client.ListMessages(query); | |
foreach (ImapMessageInfo info in messages) | |
{ | |
Console.WriteLine("Internal Date: " + info.InternalDate); | |
} | |
// Disconnect from IMAP | |
client.Dispose(); |
Filtragem de E-mails com Sensibilidade a Maiúsculas e Minúsculas
O seguinte trecho de código mostra como usar filtragem de e-mails com sensibilidade a maiúsculas e minúsculas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter", true); | |
builder.InternalDate.On(DateTime.Now); | |
MailQuery query = builder.GetQuery(); |
Especificar Codificação para o Construtor da Consulta
O construtor ImapQueryBuilder da API pode ser usado para especificar a codificação da string de pesquisa. Isso também pode ser definido usando a propriedade DefaultEncoding do MailQueryBuilder. O seguinte trecho de código mostra como especificar a codificação para o construtor da consulta.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Set conditions | |
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8); | |
builder.Subject.Contains("ğüşıöç", true); | |
MailQuery query = builder.GetQuery(); |
Filtrar Mensagens com Suporte a Paginação
O ImapClient fornece a capacidade de procurar mensagens na caixa de entrada e listá-las com suporte a paginação. O seguinte trecho de código mostra como filtrar mensagens com suporte a paginação.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
///<summary> | |
/// This example shows how to search for messages using ImapClient of the API with paging support | |
/// Introduced in Aspose.Email for .NET 6.4.0 | |
///</summary> | |
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password")) | |
{ | |
try | |
{ | |
// Append some test messages | |
int messagesNum = 12; | |
int itemsPerPage = 5; | |
MailMessage message = null; | |
for (int i = 0; i < messagesNum; i++) | |
{ | |
message = new MailMessage( | |
"from@domain.com", | |
"to@domain.com", | |
"EMAILNET-35128 - " + Guid.NewGuid(), | |
"111111111111111"); | |
client.AppendMessage(ImapFolderInfo.InBox, message); | |
} | |
string body = "2222222222222"; | |
for (int i = 0; i < messagesNum; i++) | |
{ | |
message = new MailMessage( | |
"from@domain.com", | |
"to@domain.com", | |
"EMAILNET-35128 - " + Guid.NewGuid(), | |
body); | |
client.AppendMessage(ImapFolderInfo.InBox, message); | |
} | |
client.SelectFolder("Inbox"); | |
ImapQueryBuilder iqb = new ImapQueryBuilder(); | |
iqb.Body.Contains(body); | |
MailQuery query = iqb.GetQuery(); | |
client.SelectFolder(ImapFolderInfo.InBox); | |
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query); | |
Console.WriteLine(totalMessageInfoCol.Count); | |
////////////////////////////////////////////////////// | |
List<ImapPageInfo> pages = new List<ImapPageInfo>(); | |
PageSettings pageSettings = new PageSettings(); | |
pageSettings.FolderName = ImapFolderInfo.InBox; | |
ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings); | |
pages.Add(pageInfo); | |
while (!pageInfo.LastPage) | |
{ | |
pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings); | |
pages.Add(pageInfo); | |
} | |
int retrievedItems = 0; | |
foreach (ImapPageInfo folderCol in pages) | |
retrievedItems += folderCol.Items.Count; | |
} | |
finally | |
{ | |
} | |
} |
Filtrar Mensagens com Flag Personalizada
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
ImapQueryBuilder queryBuilder = new ImapQueryBuilder(); | |
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1")); | |
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2")); |
Filtrar Mensagens usando Pesquisa Personalizada
Por exemplo, a norma RFC 3501 não permite a pesquisa de mensagens com base na existência de anexos nas mensagens. Mas o Gmail fornece Extensões IMAP que permitem realizar essa pesquisa. O próximo trecho de código mostra como fazer uma consulta correspondente.
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");
MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);