C#: 2006年1月アーカイブ
はじめてこれを書いたときは、まだまだPOPのサンプルとかってほとんどなかったのに、最近いろんなとこで公開されてるなぁ。C#もだいぶこなれてきたかな。
大事なことは、メールの送受信の方法ではありません。
ソケットプログラミングの基礎を知ること、それとPOPコマンドを知ることです。
ソケットプログラミングを覚えると、FTPソフトなんかも作れるようになりますよ。
using System.Net; using System.Text; using System.Net.Sockets; using System.IO; using System.Diagnostics;
private void button1_Click(object sender, System.EventArgs e)
{
//POPサーバと接続、ストリームを開く
TcpClient pop3Conn = new TcpClient("メールサーバ",110);
NetworkStream pop3Stream = pop3Conn.GetStream();StreamReader stmReader = new StreamReader(pop3Stream);
Debug.WriteLine(ReadStreamLine(stmReader));//ユーザ名を送信
SendStream(pop3Stream,"USER アカウント\r\n");
Debug.WriteLine(ReadStreamLine(stmReader));//パスワードを送信
SendStream(pop3Stream,"PASS パスワード\r\n");
Debug.WriteLine(ReadStreamLine(stmReader));//メールの件数を取得
SendStream(pop3Stream,"STAT\r\n");
string[] strMailCount = ReadStreamLine(stmReader).Split(' ');
int intMailCount = int.Parse(strMailCount[1]);//メール本文の取得、件数分ループさせる
for (int i=1;i<=intMailCount;i++)
{
//i件目のメールをちょうだいというコマンドを送信
SendStream(pop3Stream,"RETR " + i + "\r\n");string strBody = ReadStreamToEnd(stmReader);
Debug.Write(strBody);
}//終了コマンドの送信
SendStream(pop3Stream,"QUIT\r\n");
Debug.WriteLine(ReadStreamLine(stmReader));//ストリームを閉じる
pop3Stream.Close();
//サーバとの接続を閉じる
pop3Conn.Close();
}
private void SendStream(Stream pop3Stream, string strSendString)
{
//コマンドをバイト配列にしてストリームに流す
byte[] ByteData = Encoding.Unicode.GetBytes(strSendString);
int intByteDataCount = Encoding.Unicode.GetByteCount(strSendString);pop3Stream.Write(ByteData,0,intByteDataCount);
}private string ReadStreamLine(TextReader txtReader)
{
return txtReader.ReadLine() + "\r\n";
}private string ReadStreamToEnd(TextReader txtReader)
{
//本文開始のフラグ
bool blFlg = false;//本文を作成するStringBuilder。stringに += していくのは効率悪い
StringBuilder strReturn = new StringBuilder();//読み込んだ一行
string strBuffer;//読み込んだ文字列のバイト配列
byte[] ByteData;//配列数
int intByteDataCount;while(true)
{
strBuffer = txtReader.ReadLine();
//"."が来たら終了、メール1件の最後には必ずこれがついている
if (strBuffer.Equals(".")) break;//ヘッダ部分と本文の境目は空白一行あるだけ。
//一行ずつ読んでいって、ここに来たらフラグを立てる
if (strBuffer.Length.Equals(0))
{
blFlg = true;
}//フラグたってたら本文開始ということで、読み込み始める
if (blFlg)
{
ByteData = Encoding.ASCII.GetBytes(strBuffer);
intByteDataCount = Encoding.ASCII.GetByteCount(strBuffer);
strReturn.Append(Encoding.GetEncoding("iso-2022-jp").GetString(ByteData,0,intByteDataCount) + "\r\n");
}
}//StringBuilderをstringに変換して返す
return strReturn.ToString();
}
自分の居場所を知るのに使う
DirectoryInfo dirCurrent= new DirectoryInfo(".") ; dirCurrent.FullName + "\hoge.exe";
だと、例えばデスクトップにショートカットを作成し、
そのショートカットをダブルクリックした場合はデスクトップ上の「hoge.exe」を指してしまう。
「現在イベントの起きたところ」という意味合いだろうか。
今回使ったのはこれ
Application.StartupPath
まさしく、アプリケーションの実行ファイルの位置を示してくれた。
ディレクトリのサイズを一発で求めるメソッドはなかった。
つまり、ディレクトリのサイズを求めるには、そのディレクトリ内のすべてのファイルサイズを加算していく必要がある。
FTPコマンドでディレクトリサイズもとめる方法と同じである。
APIを直叩きすれば別の方法があるのかもしれないが、C#としてはこれが簡単であろう。
public long GetDirSize(DirectoryInfo dirBaseDir)
{
long lngDirSize = 0;
//ターゲットディレクトリのすべてのファイルの加算
foreach (FileInfo filFilesInDir in dirBaseDir.GetFiles())
{
lngDirSize += filFilesInDir.Length;
}
//ターゲットディレクトリのすべてのディレクトリの加算
foreach (DirectoryInfo dirDirInBaseDir in dirBaseDir.GetDirectories())
{
lngDirSize += GetDirSize(dirDirInBaseDir);
}return lngDirSize;
}
死活監視、ここでは特定のプロセスからの応答があるかないかで判断するとしましょう。
//名前空間がインポートされている前提 using System.Diagnostics;//"explorer"と名のつくプロセスの取得
Process[] proc = Process.GetProcessesByName("explorer");//応答があるかどうか
foreach(Process p in proc)
{
if(p.Responding)
{
Debug.WriteLine("live");
}
else
{
Debug.WriteLine("dead");
}
}
使うケースはレアかもしれないけど、
ちょっと便利かもしれない。