PHS経由でネットに接続できるEthernetアダプタのファームウェアをハック・中編 ―― LANにつないでメールの送受信と自動実行を実現

中本伸一

tag: 組み込み

技術解説 2007年11月 1日

// Send sub  
char SendStr(char s,char *b){if(Write(s,b,StrLen(b))<0)return -2; // TCP/IPへ1行出力
WaitWriteComplete(s);return 0;} // 接続先からのACKを確認してリターン
// SMTP handler (with SMTP auth)  
char SmtpHandler(char soc) // SMTPステート・マシン・スタート
{  
int len; char *recbuf, *sendbuf; // 読み出し&書き込みバッファ変数確保
char *MailFrom="name@domain.jp", *MailName="OSX-1"; // 自分のアドレス&自分の名前
char *Subject="Mail from OSX-1"; // メール件名
char *MsgBody="My URL is http://$IP            ¥r¥n"; // メール本文
char *SmtpName="userid"; // SMTP認証用のユーザID
char *SmtpPass="password"; // SMTP認証用のパスワード
 if(SmtpState) // アイドル・ステート以外であればSMTPサーバから1行入力する
 {if((len=Read(soc,2000))<0)return -1;recbuf=GetReceiveBuffer(soc,1); // SMTPサーバから1行入力
  PrStr(recbuf); // デバッグ用に画面へ出力
  if(*recbuf!='3'&&*recbuf!='2'){MemoryFree(recbuf);return -4;} // ステータスを確認
 } // SMTPサーバからの入力終わり
 MemoryFree(recbuf); // 1行入力バッファを開放
 switch(SmtpState){ // それぞれのステートの動作へ分岐
 case 1: // コネクト直後
  if(SendStr(soc,"HELO OS1¥r¥n")<0)return -2;SmtpState++;break; // HELOコマンド送出
 case 2: // HELO送出済み
  if(SendStr(soc,"AUTH LOGIN¥r¥n")<0)return -2;SmtpState++;break; // AUTHコマンド送出
 case 3: // AUTH送出済み
  sendbuf=MemoryAlloc(128);BASE64::Enc64(sendbuf,SmtpName); // SMTP認証IDをBASE64でエンコード
  StrCat(sendbuf,"¥r¥n");if(SendStr(soc,sendbuf)<0)return -2; // CR/LF付加と送出
  MemoryFree(sendbuf);SmtpState++;break; // BASE64用バッファを開放してステート進行
 case 4: // SMTP認証のID送出済み
  sendbuf=MemoryAlloc(128);BASE64::Enc64(sendbuf,SmtpPass); // SMTP認証パスワードをBASE64でエンコード
  StrCat(sendbuf,"¥r¥n");if(SendStr(soc,sendbuf)<0)return -2; // CR/LF付加と送出
  MemoryFree(sendbuf);SmtpState++;break; // BASE64用バッファを開放してステート進行
 case 5: // SMTP認証のパスワード送出済み
  if(SendStr(soc,"RSET¥r¥n")<0)return -2;SmtpState++;break; // RSETコマンド送出
 case 6: // RSETコマンド送出済み
  sendbuf=MemoryAlloc(StrLen(MailFrom)+15); // MAIL FROMコマンド文字列用バッファ確保
  StrCpy(sendbuf,"MAIL FROM:<");StrCat(sendbuf,MailFrom); // コマンド文字列生成
  StrCat(sendbuf,">¥r¥n");if(SendStr(soc,sendbuf)<0)return -2;  // MAIL FROMコマンド送出
  MemoryFree(sendbuf);SmtpState++;break; // コマンド・バッファ開放とステート進行
 case 7: // MAIL FROMコマンド送出済み
  sendbuf=MemoryAlloc(StrLen(MailTo)+13); // RCPT TOコマンド文字列用バッファ確保
  StrCpy(sendbuf,"RCPT TO:<");StrCat(sendbuf,MailTo); // RCPT TOコマンド生成
  StrCat(sendbuf,">¥r¥n");if(SendStr(soc,sendbuf)<0)return -2; // CR/LF付加してコマンド送出
  MemoryFree(sendbuf);SmtpState++;break; // コマンド・バッファ開放とステート進行
 case 8: // RCPT TOコマンド送出済み
  if(SendStr(soc,"DATA¥r¥n")<0)return -2;SmtpState++;break; // DATAコマンド送出とステート進行
 case 9: // DATAコマンド送出済み
  sendbuf=MemoryAlloc(StrLen(MailTo)+8); // To:ヘッダ用のバッファ確保
  StrCpy(sendbuf,"To:<");StrCat(sendbuf,MailTo);StrCat(sendbuf,">¥r¥n"); // To:ヘッダ生成
  if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf); // To:ヘッダ送出とバッファ開放
  sendbuf=MemoryAlloc(StrLen(MailName)+StrLen(MailFrom)+12); // Fromヘッダ用のバッファ確保
  StrCpy(sendbuf,"From: ");StrCat(sendbuf,MailName);StrCat(sendbuf," <"); // From:ヘッダ生成
  StrCat(sendbuf,MailFrom);StrCat(sendbuf,">¥r¥n"); // From:ヘッダ生成
  if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf); // From:ヘッダ送出
  StrCat(sendbuf,Subject);StrCat(sendbuf,"¥r¥n¥r¥n"); // Subject:ヘッダ生成
  if(SendStr(soc,sendbuf)<0)return -2;MemoryFree(sendbuf); // Subject:ヘッダ送出
  ReplaceCgi(MsgBody,StrLen(MsgBody)); // CGI処理でメール本文にIPアドレスを挿入
  if(SendStr(soc,MsgBody)<0)return -2; // メール本文を送出
  if(SendStr(soc,"¥r¥n.¥r¥n")<0)return -2;SmtpState++;break; // ピリオドのみの行を送出してステート進行
 case 10: // メール本文送出済み
  if(SendStr(soc,"QUIT¥r¥n")<0)return -2;SmtpState++;break; // QUITコマンド送出
 case 11: // QUITコマンド送出済み
  SmtpState=0;return 1; // アイドル・ステートに復帰して1でリターン
 }  
 return 0; // ステート・マシンが実行中は0でリターン
}  

リスト2 メール送信のSMTPAUTHファイル

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日