// 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でリターン |
} |
|