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