アプリ版:「スタンプのみでお礼する」機能のリリースについて

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();
}
}

A 回答 (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");
}
}

}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!