• 締切済み

c#で 簡単なメール(添付ファイル無し)を送信(できたら受信も)するプ

c#で 簡単なメール(添付ファイル無し)を送信(できたら受信も)するプログラムのサンプルを掲載したホームページ・書籍をご紹介いただけませんか。 よろしくお願いいたします。 外出時、自宅に泥棒などが侵入した際、赤外線センサーなどで、これを検知し、PIC,AVR等のマイコンのプログラムで処理、シリアル通信などでパソコンに信号を送り、これをイベントとして、VC#のプログラムから、空メールを送信・・・という超簡単な仕組みを作りつつあります。 VC#によるメール送信のプログラムでは件名、宛先アドレス、本文(例:いろは・・・)は固定で構いません。 環境はOSが、WINDOWS7 HOME PREMIUM、開発は VC# 2008 EPRESS EDITIONです。 メールサーバーを自身で用意するのではなく、契約しているプロバイダ(OCN等)のSMTPサーバーに接続します。 いろいろWEBで検索したり、VC#逆引き・・などの書籍を当たっているのですが どれもIIS云々と説明されており、パソコンでIISを設定したりするのですが、SMTPも導入することが前提のようで、いろいろ試しましたがよくわかりません。 IISなどを使わない簡単な方法を是非ご教示ください。 今は、下記のように自分なりにPGMを作り、FORMで件名、本文などを入力し、ボタン1を押すと メールが送信されるはず・・・と思うのですが 応答なし・・・で止まってしまいます。 private void button1_Click(object sender, EventArgs e) { TcpClient tcp = new TcpClient(); StreamWriter wr = null; string send="USER xxxxxxx\nPASS xxxxx\nQUIT\n"; try { tcp.Connect("pop.xxx.xxxx", 110); wr = new StreamWriter(tcp.GetStream()); wr.Write(send); SmtpClient sm = new SmtpClient("smtp.xxxx.xxxx"); sm.Send("myadress@xxx.xxx.xxx", textBox1.Text, ・・・送信先メールアドレス textBox2.Text, ・・・件名 textBox3.Text);・・・本文 label2.Text = "OK"; } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { wr.Close(); tcp.Close(); } }

みんなの回答

回答No.1

/* 検証環境:Windows XP SP3・Yahoo Japanのアカウント・Gmailのアカウント 開発環境:MonoDevelop 2.2.2+ Mono 2.6.4 / .NET Framework 4.0 まぁ大して影響ないでしょう。 */ using System; using System.IO; using System.Net.Sockets; using System.Net.Mail; /* 一応Yahoo Japan経由でGmailに送れたのでそのコードを示す */ /* そっちでうまくいかないときにファイアーウォールとかが原因になっていたとしても知らん。*/ namespace Q5870044 { class MainClass { public static void Main (string[] args) { /* 一応 POP Before SMTPを想定。使える無料のメールサーバとしてYahoo Japanのものを選択しました。 */ /* もちろんパスワードとユーザー名は差し替えてあります。作業中に間違ってとあるところで一回公開しちゃいましたが、消えるかなああ(汗 */ TcpClient tcp = new TcpClient(); StreamWriter sw = null; System.Collections.Generic.List<string> send = new System.Collections.Generic.List<string>(){"USER foo","PASS bar","QUIT"}; tcp.NoDelay = true; tcp.Connect("pop.mail.yahoo.co.jp", 110); NetworkStream ns = tcp.GetStream(); sw = new StreamWriter(ns); /* 一応念のため */ sw.AutoFlush = false; /* この方がエレガントかなと。*/ sw.NewLine = "\r\n"; send.ForEach(delegate(string s){ while(!ns.DataAvailable){ } /* 受け取んなきゃダメっぽいです。最初ReadToEndとか使って嵌ってました。 1000バイト超えたら?知らん。 やらずに、最初のものを送信して二つ目を送信しない、とか、 相手の返事待たずに このへんの分析はメーラーのThunderbirdとパケットキャプチャのWireSharkで動きを把握しています。 */ byte[] x = new byte[1000]; ns.Read(x,0,1000); sw.WriteLine(s); /* Flushしておく */ sw.Flush(); }); tcp.Close(); /* ストリームをクローズしなきゃダメって書いてある。多分これでも大丈夫だと思うけど*/ sw.Close(); /* 受信したから送信。*/ SmtpClient sm = new SmtpClient("smtp.mail.yahoo.co.jp",587); sm.Credentials = new System.Net.NetworkCredential("xxxx","xxxx"); /* SSLに対応していないようなのでEnableSslとかをtrueにしたら怒られました。なんで、MSの実装は"メールアドレスが正しくないFormatException"とかいうんでしょうね */ sm.Send("xxxx@yahoo.co.jp","himajin100000@example.com","b","c"); /* ちゃんと完了していることを確認するため、以上の意味はない。 実際にはForEachのwhile等をちゃんと抜けているのかどうかとか 非同期なのに、処理が途中でハングしてないか、等の確認にもこの手の奴使ってますが、ソース中には残していません */ System.Console.WriteLine("OK1"); } } }

関連するQ&A