C# 2.0 で Pop3 を使用してメールを読む方法を探しています。現在、CodeProjectにあるコードを使用しています。ただし、このソリューションは理想的とは言えません。最大の問題は、Unicode で書かれたメールをサポートしていないことです。
8 に答える
OpenPop.NETを使用して、POP3 経由で電子メールにアクセスすることに 成功しました。
POP3プロトコルを介して電子メールをダウンロードすることは、タスクの簡単な部分です。プロトコルは非常に単純であり、ネットワーク経由でクリアテキストのパスワードを送信したくない場合(SSL暗号化通信チャネルを使用できない場合)、唯一の難しい部分は高度な認証方法である可能性があります。詳細については、 RFC 1939:Post Office Protocol-Version3 およびRFC1734:POP3AUTHenticationコマンドを参照してください。
難しいのは、受信した電子メールを解析する必要がある場合です。つまり、ほとんどの場合、MIME形式を解析する必要があります。数時間または数日でquick&dirty MIMEパーサーを作成でき、すべての着信メッセージの95%以上を処理します。ほとんどすべての電子メールを解析できるようにパーサーを改善することは、次のことを意味します。
- 最も人気のあるメールクライアントから送信された電子メールサンプルを取得し、それらによって生成されたエラーとRFCの誤解を修正するためにパーサーを改善します。
- メッセージヘッダーとコンテンツのRFCに違反するメッセージがパーサーをクラッシュさせないこと、およびマングルされた電子メールからすべての読み取り可能または推測可能な値を読み取ることができることを確認します
- 国際化の問題の正しい処理(たとえば、右から左に書かれた言語、特定の言語の正しいエンコーディングなど)
- UNICODE
- 「MIME拷問メールサンプル」に見られる添付ファイルと階層メッセージアイテムツリー
- S / MIME(署名および暗号化された電子メール)。
- 等々
堅牢なMIMEパーサーのデバッグには、数か月の作業が必要です。私は友人が下記のコンポーネント用にそのようなパーサーを1つ書いているのを見ていて、それについてもいくつかの単体テストを書いていたので、知っています;-)
元の質問に戻ります。
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();
私のオープン ソース アプリケーションBugTracker.NETには、MIME を解析できる POP3 クライアントが含まれています。POP3 コードと MIME コードはどちらも別の作成者のものですが、私のアプリではすべてがどのように組み合わされているかを見ることができます。
MIME の解析には、http://anmar.eu.org/projects/sharpmimetools/を使用します。
ファイル POP3Main.cs、POP3Client.cs、および insert_bug.aspx を参照してください。
また、 Mail.dll メール コンポーネントを試すこともできます。これには、SSL サポート、Unicode、および多国籍電子メール サポートがあります。
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からダウンロードできます。
これは私が作成した商用製品であることに注意してください。
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または Nuget [HigLabo]から入手できます。
旧式と呼んでください。しかし、単純なプロトコルにサードパーティのライブラリを使用する理由は何ですか。暗号化と認証のために System.Net.Sockets.TCPClient と System.Net.Security.SslStream を使用して Web ベースの ASP.NET アプリケーションに POP3 リーダーを実装しました。プロトコルに関する限り、POP3 サーバーとの通信を開始すると、対処しなければならないコマンドはほんの一握りです。これは非常に扱いやすいプロトコルです。
OpenPOP はお勧めしません。問題のデバッグに数時間を費やしました - OpenPOP の POPClient.GetMessage() が不思議なことに null を返していました。これをデバッグしたところ、文字列インデックスのバグであることがわかりました。ここで提出したパッチを参照してください。例外を飲み込む空の catch{} ブロックがあるため、原因を特定するのは困難でした。
また、プロジェクトはほとんど休眠状態です... 最後のリリースは 2004 年でした。
今のところ、まだ OpenPOP を使用していますが、ここで人々が推奨している他のプロジェクトをいくつか見ていきます。
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();
}
}
}