[PR] 自由な名前で定数を共有?!「Addin for Excel 95-2007 Professional Edition」
[AA] 安かったから、買ったよ→BUFFALO ポータブルブルーレイドライブ BR-PX68U2-BK
[予告]次回メンテナンス(運用停止)は 12月7日 10:00~16:00 のうち2時間程度を予定しています。
PopClient/C#
スペシャルサンクス:
.NETでPOPサーバからメールを受信する方法
C#でAPOP
ソース:
class PopClient : System.Net.Sockets.TcpClient
{
public const int POP_PORT = 110;
string ApopKey = "";
private void SendLine(string s)
{
byte[] b = Encoding.ASCII.GetBytes(s + "\r\n");
base.GetStream().Write(b, 0, b.Length);
}
private string ReadLine()
{
System.IO.StreamReader reader = new System.IO.StreamReader(base.GetStream(), System.Text.Encoding.ASCII);
return reader.ReadLine();
}
public PopClient(string hostname, int port) : base (hostname, (port < 0) ? port : POP_PORT)
{
string s = this.ReadLine();
if (!s.StartsWith("+OK"))
{
throw new PopClientException("接続時に POP サーバが \"" + s + "\" を返しました。");
}
// APOP可能かどうか判断
System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(s, @"^.+(<.+>).*$");
if(m.Success)
{
this.ApopKey = m.Groups[1].Value;
}
}
private string ComputeHash(string s)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create();
byte[] bhash = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(s));
string ret = "";
foreach (byte b in bhash)
{
ret += string.Format("{0:X2}", b);
}
return ret;
}
public void Login(string username, string password)
{
if (!(string.IsNullOrEmpty(ApopKey)) && ApopKey.Length > 0)
{
this.SendLine("APOP " + username + " " + ComputeHash(this.ApopKey + password));
string s = this.ReadLine();
if (!s.StartsWith("+OK"))
{
throw new PopClientException("APOP 送信時に POP サーバが \"" + s + "\" を返しました。");
}
}
else
{
// ユーザー名送信
this.SendLine("USER " + username);
string s = this.ReadLine();
if (!s.StartsWith("+OK"))
{
throw new PopClientException("USER 送信時に POP サーバが \"" + s + "\" を返しました。");
}
// パスワード送信
this.SendLine("PASS " + password);
s = this.ReadLine();
if (!s.StartsWith("+OK"))
{
throw new PopClientException("PASS 送信時に POP サーバが \"" + s + "\" を返しました。");
}
}
}
public new void Close()
{
this.SendLine("QUIT\r\n");
this.ReadLine();
base.Close();
}
}
APOP動作に関しては未確認。
実際にメールを取得するには、LISTコマンド等の実装が必要。
間違いが含まれる場合が多々ありますので、流用には十分な検証の上で。
トラックバック(0)
トラックバックURL: https://blog.fne.jp/mt/mt-tb.cgi/1
コメントしちゃいなよ