Pergunta

Estou a procura de um método de leitura de e-mails usando o Pop3 no C# 2.0.Atualmente, estou usando o código encontrado na CodeProject.No entanto, esta solução é menos do que o ideal.O maior problema é que ele não oferece suporte a e-mails escritos em unicode.

Foi útil?

Solução

Eu tenho usado com sucesso OpenPop.NET para acessar e-mails via POP3.

Outras dicas

download o e-mail através do protocolo POP3 é a parte mais fácil da tarefa.O protocolo é bastante simples e a única parte difícil poderiam ser avançados métodos de autenticação, se você não quiser enviar uma senha de texto não criptografado pela rede (e não pode usar o SSL canal de comunicação criptografado).Ver RFC 1939:Post Office Protocol Versão 3 e 1734 RFC:Autenticação de POP3 comando para obter detalhes.

A parte difícil é quando você precisa analisar o e-mail recebido, o que significa analisar o formato MIME, na maioria dos casos.Você pode escrever rápida e suja analisador de MIME em poucas horas ou dias e ele irá lidar com 95+% de todas as mensagens recebidas.Melhorar o analisador de forma que ele pode analisar quase qualquer e-mail que significa:

  • obter e-mail amostras enviadas a partir de clientes de email mais populares e melhorar o parser a fim de corrigir erros e RFC interpretações geradas por eles.
  • Certificando-se de que as mensagens violar RFC para cabeçalhos de mensagem e o conteúdo não irá falhar o analisador e o que você vai ser capaz de ler todos os legível ou adivinhação valor do deturpados e-mail
  • a manipulação correta de questões de internacionalização (e.g.idiomas escritos a partir de n para a esquerda, a codificação correta para o idioma específico, etc.)
  • UNICODE
  • Anexos de e hierárquica item de mensagem de árvore, como visto na "Mime tortura e-mail de exemplo"
  • (S/MIME assinadas e criptografadas e-mails).
  • e assim por diante

A depuração de um robusto analisador de MIME, leva meses de trabalho.Eu sei, porque eu estava assistindo o meu amigo a escrever uma tal analisador para o componente abaixo mencionados e estava a escrever alguns testes de unidade para ele também ;-)

De volta à pergunta original.

Seguinte código do nosso POP3 Tutorial e ligações seria ajudar você a:

// 
// create client, connect and log in 
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");

// get message list 
Pop3MessageCollection list = client.GetMessageList();

if (list.Count == 0)
{
    Console.WriteLine("There are no messages in the mailbox.");
}
else 
{
    // download the first message 
    MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
    ...
}

client.Disconnect();

Meu aplicativo de código aberto BugTracker.NET inclui um cliente POP3 que pode analisar MIME.Tanto o POP3 código e o código MIME são de outros autores, mas você pode ver como tudo se encaixa no meu app.

Para a análise de MIME, eu uso http://anmar.eu.org/projects/sharpmimetools/.

Consulte o arquivo POP3Main.cs, POP3Client.cs, e insert_bug.aspx

Você também pode tentar Mail.dll componente de correio, ele tem suporte a SSL, unicode, e multi-nacionais de e-mail de suporte:

using(Pop3 pop3 = new Pop3())
{
    pop3.Connect("mail.host.com");           // Connect to server and login
    pop3.Login("user", "password");

    foreach(string uid in pop3.GetAll())
    {
        IMail email = new MailBuilder()
            .CreateFromEml(pop3.GetMessageByUID(uid));
          Console.WriteLine( email.Subject );
    }
    pop3.Close(false);      
}

Você pode baixá-lo aqui no https://www.limilabs.com/mail

Por favor, note que este é um produto comercial que criei.

Eu não recomendaria OpenPOP.Eu só passei algumas horas a depuração de um problema - OpenPOP do POPClient.GetMessage() foi misteriosamente retornar null.Eu depurado isso e achou que era uma seqüência de caracteres índice de erro - veja o patch que eu apresentadas aqui: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.Foi difícil encontrar a causa desde há vazio catch{} blocos que engolir exceções.

Além disso, o projeto é principalmente dormente...o último lançamento foi em 2004.

Por agora ainda estamos usando OpenPOP, mas eu vou dar uma olhada em alguns dos outros projetos de pessoas têm recomendado aqui.

HigLabo.O correio é fácil de usar.Aqui está um exemplo de uso:

using (Pop3Client cl = new Pop3Client()) 
{ 
    cl.UserName = "MyUserName"; 
    cl.Password = "MyPassword"; 
    cl.ServerName = "MyServer"; 
    cl.AuthenticateMode = Pop3AuthenticateMode.Pop; 
    cl.Ssl = false; 
    cl.Authenticate(); 
    ///Get first mail of my mailbox 
    Pop3Message mg = cl.GetMessage(1); 
    String MyText = mg.BodyText; 
    ///If the message have one attachment 
    Pop3Content ct = mg.Contents[0];         
    ///you can save it to local disk 
    ct.DecodeData("your file path"); 
} 

você pode obtê-lo a partir de https://github.com/higty/higlabo ou Nuget [HigLabo]

chame-me à moda antiga, mas por que usar uma festa de 3 biblioteca para um protocolo simples.Eu tenho implementado POP3 leitores com base na web ASP.NET aplicativo com o Sistema.Líquida.Sockets.TCPClient e do Sistema.Líquida.Segurança.SslStream para a criptografia e de autenticação.Na medida protocolos de ir, depois de abrir a comunicação com o servidor POP3, há apenas um punhado de comandos que você tem que lidar com.É muito fácil de protocolo para trabalhar.

Eu apenas tentei SMTPop e funcionou.

  1. Eu baixei este.
  2. Adicionado smtpop.dll referência ao meu C# .LÍQUIDO do projeto

Escreveu o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    
using SmtPop;

namespace SMT_POP3 {

    class Program {
        static void Main(string[] args) {
            SmtPop.POP3Client pop = new SmtPop.POP3Client();
            pop.Open("<hostURL>", 110, "<username>", "<password>");

            // Get message list from POP server
            SmtPop.POPMessageId[] messages = pop.GetMailList();
            if (messages != null) {

                // Walk attachment list
                foreach(SmtPop.POPMessageId id in messages) {
                    SmtPop.POPReader reader= pop.GetMailReader(id);
                    SmtPop.MimeMessage msg = new SmtPop.MimeMessage();

                    // Read message
                    msg.Read(reader);
                    if (msg.AddressFrom != null) {
                        String from= msg.AddressFrom[0].Name;
                        Console.WriteLine("from: " + from);
                    }
                    if (msg.Subject != null) {
                        String subject = msg.Subject;
                        Console.WriteLine("subject: "+ subject);
                    }
                    if (msg.Body != null) {
                        String body = msg.Body;
                        Console.WriteLine("body: " + body);
                    }
                    if (msg.Attachments != null && false) {
                        // Do something with first attachment
                        SmtPop.MimeAttachment attach = msg.Attachments[0];

                        if (attach.Filename == "data") {
                           // Read data from attachment
                           Byte[] b = Convert.FromBase64String(attach.Body);
                           System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);

                           //BinaryFormatter f = new BinaryFormatter();
                           // DataClass data= (DataClass)f.Deserialize(mem); 
                           mem.Close();
                        }                     

                        // Delete message
                        // pop.Dele(id.Id);
                    }
               }
           }    
           pop.Quit();
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top