문제

C# 2.0에서 Pop3를 사용하여 이메일을 읽는 방법을 찾고 있습니다.현재 다음에서 찾은 코드를 사용하고 있습니다. 코드프로젝트.그러나 이 솔루션은 이상적이지 않습니다.가장 큰 문제는 유니코드로 작성된 이메일을 지원하지 않는다는 점이다.

도움이 되었습니까?

해결책

성공적으로 사용했습니다 오픈팝.NET POP3를 통해 이메일에 액세스합니다.

다른 팁

POP3 프로토콜을 통해 이메일을 다운로드하는 것은 작업의 쉬운 부분입니다.프로토콜은 매우 간단하며 네트워크를 통해 일반 텍스트 비밀번호를 보내고 싶지 않은 경우(그리고 SSL 암호화 통신 채널을 사용할 수 없는 경우) 유일한 어려운 부분은 고급 인증 방법일 수 있습니다.보다 RFC 1939:우체국 프로토콜 - 버전 3 그리고 RFC 1734:POP3 AUTHentication 명령 자세한 내용은.

어려운 부분은 수신된 이메일을 구문 분석해야 할 때 발생하는데, 이는 대부분의 경우 MIME 형식을 구문 분석하는 것을 의미합니다.몇 시간 또는 며칠 안에 Quick&Dirty MIME 파서를 작성할 수 있으며 들어오는 모든 메시지의 95% 이상을 처리합니다.거의 모든 이메일을 구문 분석할 수 있도록 구문 분석기를 개선하는 것은 다음을 의미합니다.

  • 가장 널리 사용되는 메일 클라이언트에서 보낸 이메일 샘플을 받고 파서를 개선하여 생성된 오류 및 RFC 잘못된 해석을 수정합니다.
  • 메시지 헤더와 내용에 대해 RFC를 위반하는 메시지가 파서를 중단시키지 않고 손상된 이메일에서 읽을 수 있거나 추측할 수 있는 모든 값을 읽을 수 있는지 확인하세요.
  • 국제화 문제의 올바른 처리(예:오른쪽에서 왼쪽으로 작성된 언어, 특정 언어에 대한 올바른 인코딩 등)
  • 유니코드
  • 첨부 파일 및 계층적 메시지 항목 트리는 다음과 같습니다. "마임 고문 이메일 샘플"
  • S/MIME(서명되고 암호화된 이메일).
  • 등등

강력한 MIME 파서를 디버깅하려면 몇 달이 걸립니다.나는 내 친구가 아래에 언급된 구성 요소에 대해 그러한 파서를 작성하는 것을 보고 그에 대한 몇 가지 단위 테스트도 작성하고 있었기 때문에 알고 있습니다. ;-)

원래 질문으로 돌아갑니다.

수행원 POP3 튜토리얼 페이지에서 가져온 코드 링크가 도움이 될 것입니다.

// 
// 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();

내 오픈소스 애플리케이션 버그트래커.NET MIME을 구문 분석할 수 있는 POP3 클라이언트가 포함되어 있습니다.POP3 코드와 MIME 코드는 모두 다른 작성자의 코드이지만 내 앱에서 이 모든 코드가 어떻게 조화를 이루는지 확인할 수 있습니다.

MIME 구문 분석을 위해 다음을 사용합니다. http://anmar.eu.org/projects/sharpmimetools/.

POP3Main.cs, POP3Client.cs 및 insert_bug.aspx 파일을 참조하세요.

당신은 또한 시도할 수 있습니다 Mail.dll 메일 구성 요소, SSL 지원, 유니코드 및 다국적 이메일 지원이 있습니다.

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);      
}

여기에서 다운로드할 수 있습니다. https://www.limilabs.com/mail

제가 만든 상업용 제품이니 참고해주세요.

저는 OpenPOP을 추천하지 않습니다.방금 문제를 디버깅하는 데 몇 시간을 보냈습니다. OpenPOP의 POPClient.GetMessage()가 이상하게도 null을 반환했습니다.이것을 디버깅한 결과 문자열 인덱스 버그라는 사실을 발견했습니다. 여기에 제출한 패치를 참조하세요. http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.예외를 삼키는 빈 catch{} 블록이 있어서 원인을 찾기가 어려웠습니다.

게다가 이 프로젝트는 거의 휴면상태인데...마지막 릴리스는 2004년이었습니다.

현재 우리는 여전히 OpenPOP을 사용하고 있지만 여기에서는 사람들이 추천한 다른 프로젝트 중 일부를 살펴보겠습니다.

HigLabo.Mail은 사용하기 쉽습니다.다음은 샘플 사용법입니다:

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"); 
} 

당신은 그것을 얻을 수 있습니다 https://github.com/higty/higlabo 또는 너겟 [HigLabo]

나를 구식이라고 부르는데 왜 간단한 프로토콜을 위해 타사 라이브러리를 사용합니까?암호화 및 인증을 위해 System.Net.Sockets.TCPClient 및 System.Net.Security.SslStream을 사용하여 웹 기반 ASP.NET 응용 프로그램에 POP3 리더를 구현했습니다.프로토콜에 관한 한, 일단 POP3 서버와의 통신을 시작하면 처리해야 할 명령은 몇 가지뿐입니다.작업하기 매우 쉬운 프로토콜입니다.

방금 SMTPop을 사용해 보았는데 효과가 있었습니다.

  1. 다운로드했습니다 이것.
  2. 추가됨 smtpop.dll 내 C# .NET 프로젝트에 대한 참조

다음 코드를 작성했습니다.

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();
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top