문제
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을 사용해 보았는데 효과가 있었습니다.
- 다운로드했습니다 이것.
- 추가됨
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();
}
}
}