質問
C# 2.0でPop3を使用してメールを読む方法を探しています。現在、私はにあるコードを使用しています コードプロジェクト. 。ただし、この解決策は理想的とは言えません。最大の問題は、Unicode で書かれた電子メールをサポートしていないことです。
解決
無事に使用できました オープンポップ.NET POP3経由で電子メールにアクセスします。
他のヒント
POP3 プロトコル経由で電子メールをダウンロードするのは簡単な作業です。プロトコルは非常に単純で、ネットワーク経由でクリア テキストのパスワードを送信したくない場合 (SSL 暗号化通信チャネルを使用できない場合)、唯一の難しい部分は高度な認証方法です。見る RFC 1939:ポスト オフィス プロトコル - バージョン 3 そして RFC 1734:POP3認証コマンド 詳細については。
難しいのは、受信した電子メールを解析する必要があるときです。これは、ほとんどの場合、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/sharpimetools/.
ファイル 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
これは私が作成した商用製品であることに注意してください。
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 または Nuget [ヒグラボ]
時代遅れだと言われても仕方がありませんが、なぜ単純なプロトコルにサードパーティのライブラリを使用するのでしょうか。暗号化と認証のために、System.Net.Sockets.TCPClient と System.Net.Security.SslStream を使用して、Web ベースの 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();
}
}
}