プログラミングメモ

Cプログラムからメールを送る

プログラムに膨大な計算量のシミュレーションや、 反復学習を行わせる時、何十時間、何日もの時間を要するケースがある。 その場合、終わってるかな、と気になって頻繁にチェックしてしまう。 処理が終わったらメールで知らせてくれたら、などと思ったことがあるはずだ。 そこで今回はCプログラムにメールを送らせる簡単な方法を説明する。 これを使えば、進捗状況の報告や、終了アラートを携帯電話などへ送信させることが出来る。
この手法はCプログラムからコマンドライン用送信メールソフトを操作することによって実現する。

.1 SMAIL

SMAILはEva LibRaryによって制作されたコマンドライン用送信専用メールソフトである。 SSL暗号化通信や複数の添付ファイルにも対応している。
下記サイト PicoLix内ダウンロードページからsmail-v4.13.zip(2012.11時点では最新)をダウンロードし、解凍する。
http://dip.picolix.jp/page3.html

解凍したフォルダは、場所を指定しやすいように、Cドライブ直下へ移動する。
(ここではフォルダ名をsmailへ変更した)
フォルダ内のsmail.exeを実行し、SMTPサーバー、POP3サーバーの設定を行う。

設定完了後、保存を行う。


.2 サンプルプログラム

以下のサンプルプログラムは、メールの本文となるtxtファイルの作成と、smailへのコマンド送信を行う。
斜体部は各システム・要件に沿って設定。

#include <stdio.h>
#include <stdlib.h>

void WrightMail() //メールの本文作成関数
{
	FILE *outputfile;         // 出力ストリーム
  
	outputfile = fopen("MailBody.txt", "w");  // ファイルを書き込み用にオープン(開く)
	if (outputfile == NULL) {          // オープンに失敗した場合
		printf("cannot open\n");         // エラーメッセージを出して
		exit(1);                         // 異常終了
	}

	fprintf(outputfile, "自動送信メール\n"); // ファイルに書く
	fprintf(outputfile, "プログラムが終了しました\n");
	fclose(outputfile);          // ファイルをクローズ(閉じる)
	return 0;
}

void SendMail(char Title[], char BodyText[], char Address[]) //メール送信関数
{
	int ret=0;//結果収納
	char buf[256];

	printf("メール送信処理開始!\n");
	sprintf(buf,"C:\\smail\\smail.exe -d -hSERVER.adress.ad 
			-fFROM@adress.ad -s%s -F%s %s",Title,BodyText,Address);
	printf("\n%s\n",buf);

	ret = system(buf);

	if (ret == 0) printf("送信成功\n");
	else printf("送信失敗\n");
}  	

int main()
{
	 WrightMail();	//メール本文の作成
	 SendMail("タイトル","MailBody.txt","TO@address.ad"); 
			//タイトル・本文ファイル(.txt)・宛先
	return 0;
}

コマンドの最初にsmail.exeの場所を指定し、後に続く各オプションは次に対応している。
-d:デバッグ表示モード。このオプションを書くと、実行時にデバッグ情報が表示される。
-h:ホスト名
-f:送信者アドレス(アドレスじゃなくてもOK!)
-s:タイトル
-F:本文のテキストファイル
そして最後に宛先メールアドレスを記入する。

この方法、実は危ない使い方ができる。
送信元アドレスの偽装することができるのだ。実際にはヘッダをみると真の送信元はバレるのだが、通常は気付かない。
必ず良識のある使い方をするべし。

.3 送信に失敗する場合

ポート番号が間違っている場合がある。 →良く分からない人は、SMTPポート番号を、通常の25と、サブミッションポートである587の両方で試してみる。(学校等で使用する場合サブミッションポートを指定する)

HOME > プログラミングメモ > Cプログラムからメールを送る