Adsense_top

2010年1月27日水曜日

C# POP3への接続の続き(説明)

今日は、先日書いた「POP3へのログイン (リンクは別ウインドウで開きます)」の説明だけにしておきます。
その前にコードの訂正があります。「finally」ブロックの部分は、以下のように書かないと接続に失敗した時に、「finally」の所で例外が発生してしまうの可能性がありました。

finally
{
if(stream != null)
stream.Close();
if(tcp != null && tcp.Connected)
tcp.Close();
}

大体はコメントで分かると思いますが順に説明していきます。
1.サーバーとポートを指定して接続しています。
2.読み書き時のタイムアウト時間を設定しています。例では、30秒(30000ミリ秒)固定にしていますが、Outlookなどのデフォルトは60秒なので、サーバーなどに合わせて調整出来るようにした方が良かった思います。
3.「TcpClient.GetStream()」で取得した「NetworkStream」を、そのまま使って読み書きしても良いのですが、コードが簡単になるので、今回は StreamReader / StreamWriterを取得しています。
4.「result = reader.ReadLine();」は、サーバーからの応答を読みとっています。
5.「if(!result.StartsWith("+OK"))」は、応答が正常を表す「+OK」で始まっていない場合は、例外をスローしています。(if(result.StartsWith("-ERR"))でも可)
6.後は「USER」コマンドでユーザー名(アカウント)、「PASS」コマンドでパスワードを送り、認証されログイン出来たのち「QUIT」コマンドで接続を切断しています。


大体こんな感じです。
このままではメール受信もなにも出来ていないので、もう少し実用的な感じにして次の機会に書きます。


2010年1月25日月曜日

C# POP3へのログイン

メール受信をC#行うためのコードを書いていきたいと思います。


POP3、IMAP4 や 認証方法など結構多岐にわたるので、今日は基本的ところでなPOP3への平文でログインして閉じるだけのコードです。

public void Connect(string host, int port, string user, string pass)
{
string result;
Stream stream;
TcpClient tcp;
tcp = new TcpClient();
try
{
// 接続
tcp.Connect(host, port);
// NetworkStreamを得る
stream = tcp.GetStream();
// タイムアウト時間の設定
stream.ReadTimeOut = 30 * 1000;
stream.WriteTimeOut = 30 * 1000;
// StreamReader、StreamWriterを被せる
StreamReader reader = new StreamReader(stream, Encoding.ASCII);
StreamWriter writer = new StreamWriter(stream, Encoding.ASCII);
// 改行文字とバッファフラッシュを設定
writer.NewLine = "\r\n";
writer.AutoFlush = true;
// サーバーからの挨拶コードを得る
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
// USERコマンド
writer.WriteLine("USER {0}", user);
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
// PASSコマンド
writer.WriteLine("PASS {0}", pass);
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
writer.WriteLine("QUIT");
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
}
finally
{
stream.Close(); 
tcp.Close();
}
}

コメントである程度わかると思いますが、ソース内容の説明は、今日は眠たいので次回にします。


2010年1月18日月曜日

人気プログラミング言語ランキング でC#6位でした

マイコミジャーナルに人気プログラミング言語ランキングが載っていました。


人気プログラミング言語ランキング ‐ PHP、C++を抜いて3位


C#は6位で、私の思っているより人気があるように感じました。
このランキングでC#より下位の Ruby や Python の方が、ネットでの情報が多いように思っていたからです。
Microsoftの取り組み方がC#対して中途半端なのが、人気が伸びない原因だと思います。VBなのかC#なのかそろそろはっきりしてもらえないものでしょうか。
やっぱり C や Java に乗り換えようかなぁなんて考えてしまします。


話は変わりますが、次のテーマを考えています。
メール受信か、以前やったDataGridViewのセルの結合に再挑戦するかで悩んでします。
DataGridViewをやるなら、慎重に構成を考える必要がありそうなので...。メール受信かな?


2010年1月10日日曜日

C# 外部アプリケーションにキーストロークを送り操作する。

外部のアプリケーションにキーストロークを送りたかったのですが、「SendKeys」では、アクティブなウインドウが対象なので、WIN32 APIを使って書いてみました。


以下のコードでは、Internet Explorer を全画面表示にしています。


まずはP/Invoke定義部

[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(String lpClassName,
String lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern bool PostMessage(int hWnd, Int32 Msg,
int wParam, int lParam);

private const Int32 WM_KEYDOWN = 0x0100;

キーストロークを送る部分です。

// IEのウィンドウハンドル取得
IntPtr hWnd =
FindWindow(null, "Yahoo! JAPAN - Windows Internet Explorer");
// ハンドル取得失敗時
if (hWnd == IntPtr.Zero)
{
Console.WriteLine("ハンドルが取得できません");
return;
}

// メッセージPOST
bool result =
  PostMessage(hWnd, WM_KEYDOWN, (int)(Keys.F11),0);

以上で、IEが全画面表示になります。今回は簡単にするために、IEで YAHOO を表示していると仮定してしています。
実際に使用するには、ウインドウハンドルの取得部分に工夫が必要だと思います。


2010年1月6日水曜日

GodMode

今日、CNETを観ていたら、気になる記事があったので、メモとして残しておきます。(CLSIDの部分が絶対覚えられないので)


「Windows 7」「Vista」でフォルダを作成しフォルダ名を「GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}」にすると、コントロールパネルの拡張版のような物が出来上がるとのことです。
Vistaで試しましたが、結構便利そうに感じました。


元記事はCNET JAPANの「Windows 7」の管理機能を集約--「GodMode」の存在が明らかに」です。


2010年1月4日月曜日

明けまして おめでとうございます

明けまして おめでとうございます。
��ケ月以上、書いていませんでしたが、ネタが思いつかなかっただけで、止めたわけではありませんので、またお越しください。
去年以上に、頻繁に書いていくようにします。
と、書きつつ今日はネタが無かったので、挨拶だけで失礼します。