前提・実現したいこと
名刺を注文するシステムを改修し作っています。
ユーザー登録フォームを実装中に、確認メール届かないという問題が発生しました。
ドメイン名は実際に存在するものです。
「&SENDMAIL」のコードはおそらく下記の「shop_util.pl」に記載してあると思われます。
該当のソースコード
cgi
1#regist.cgi 2 3省略 4 5$cookie{'P1'} = $FORM{'P1'} ; 6$cookie{'P2'} = $FORM{'P2'} ; 7$cookie{'P3'} = $FORM{'P3'} ; 8 9# $bits128 = &md5::convert("$FORM{'P1'}$FORM{'P2'}$FORM{'P3'}$FORM{'P4'}");# 10# $MD5PASS = sprintf("%08x%08x%08x%08x", unpack('NNNN', $bits128)); # 11 12$to = $FORM{'P1'} ; 13$from = 'k.iitsuka@' ; 14$subject = '登録のご案内' ; 15$data .=<<'_HTML_'; 16申し込みいただき有り難うございます。 17登録の準備が出来ました。 18下記のアドレスにアクセスして登録してください。 19 20_HTML_ 21 22$data .="http://www./card/regist.cgi?sd=$MD5PASS"; 23 24$data .=<<'_HTML_'; 25 26このアドレスをクリックするとページが開きます。 27本人確認のため、開いたページにパスワードを入力してください。 28 29認証されますとアカウントが作成されます。 30 31なお、申し込みから24時間が過ぎますと無効になりますので、ご了承ください。 32_HTML_ 33 34&SENDMAIL ; 35 36$html .= <<'_HTLM_' ; 37<h2>申込いただき有り難うございます</h2> 38<p>確認のメールを送信いたしました。<br /> 39メール到着までしばらくお待ちください。<br /><br /> 40メールが到着しましたらメールにあるアドレスにアクセスし、認証作業を続けてください。<br /> 41<a href='http://www./card/'> 42<img src='html_imgs/link_top.gif' alt='トップページへ戻る'></a> 43</p> 44</div> 45_HTLM_ 46 47&page_Print ; 48exit ; 49 50} 51
perl
1#shop_util.pl 2 3Usage: 4require './md5.pl'; 5require './jcode.pl'; 6#require 'C:\inetpub\wwwroot\card\md5.pl'; 7#require 'C:\inetpub\wwwroot\card\jcode.pl'; 8 9$_cookie_name = 'meisi' ; 10$_countFile = 'count.dat' ; 11$USERS_DIR = '/home/.sites/66/site39/shop_users/' ; 12#$USERS_DIR = 'C:\inetpub\wwwroot\card\users/' ; 13 14$PARTS_DIR = '/home/.sites/42/site103/web/card/parts/' ; 15#$PARTS_DIR = 'C:\inetpub\wwwroot\card\parts/' ; 16 17####################################################### 18# メールアドレスのチェック============================== 19sub email_check { 20 $error_flg = 0; # 初期化 21 local($allmail) = @_[0] ; # 初期化 22 #↓@_[0]全体を調べて@がない/2つ以上あるとエラー 23 # $positionは@の位置、$statusは@の数 24 local($position,$status) = 0; 25 while ( ($position = index($allmail , "@" , $position)) > 0 ){ 26 $status ++; 27 $position ++; 28 } 29 if ($status != 1){ # 1でなければ 30 $error .= "メールアドレスにエラーがあります。<br>\n"; 31 $error_flg = 1 ; 32 } else { # @がひとつなら 33 @domain = split(/@/,$allmail); # @で分解 34 # 前半部のチェック 35 # ↓中を調べて英文字と数字、_、ピリオド、-以外のものがあると 36 # ↓$error_flgに1が入る。 37 $error_flg = ( @domain[0] =~ /[^a-zA-Z0-9\_.\-]/ ) ; # これ以外は入力できない 38 if ($error_flg == 1) {$error_flg2 = 1;} # エラーを取っておく 39 # ドメインのチェック 40 # ↓中を調べて英文字と数字、ピリオド、-以外のものがあると 41 # ↓$error_flgに1が入る。 42 $error_flg = ( @domain[1] =~ /[^a-zA-Z0-9.\-]/ ) ; # これ以外は入力できない 43 if ($error_flg == 1) {$error_flg2 = 1;} # エラーを取っておく 44 if ($error_flg2 == 1) { # 前半・ドメインのどちらかでエラー 45 $error .= "メールアドレスは半角英数字で入力してください。<br>\n"; 46 } 47 } 48} 49 50 51 52######################################################## 53 54##############################################################################3 55 56# ------------------------------------------------------- # 57# 58# SMTPメール送信サンプル 59# 60# ------------------------------------------------------- # 61# 【 Program name 】 62# smtp.pl 63# ------------------------------------------------------- # 64# 【 更新履歴 】 65# 2001/5/7 - 作成 66# ------------------------------------------------------- # 67# 68# ソケットモジュ−ルの輸入 69# 70use Socket; 71 72 73sub SENDMAIL{ 74 75$ResultCode = 0 ; 76# ------------------------------------------------------- # 77# 接続情報の設定 78# ------------------------------------------------------- # 79# 80# SMTPサーバ名、又はIPアドレス 81# 82$server = 'mail.' ; 83 84# 85# 文字コード変換ライブラリの使用 86# 87require './jcode.pl'; 88 89 90# ------------------------------------------------------- # 91# ヘッダ、データ部の作成 92# ------------------------------------------------------- # 93 94$send_data = 'X-Mailer: SMTP Samle' . "\n"; 95$send_data .= 'MIME-Version: 1.0' . "\n"; 96$send_data .= 'Content-Type: text/plain; charset=iso-2022-jp' . "\n"; 97$send_data .= 'From: '. $from . '<'. $from .'>' . "\n"; 98$send_data .= 'To: '. $to . "\n"; 99$send_data .= 'Bcc: '. $BCC . "\n"; 100$send_data .= 'Subject: ' . $subject . "\n"; 101$send_data .= "\n"; 102$send_data .= $data; 103 104# ------------------------------------------------------- # 105# SOCKETの作成 106# ------------------------------------------------------- # 107 # PORT番号を取得します 108 $port = getservbyname('smtp','tcp'); 109 # PORT、IPで構造体を作成する 110 $struct = sockaddr_in($port,inet_aton($server)); 111 # ソケットの生成 112 socket(SH, PF_INET, SOCK_STREAM, 0) 113 || return("ソケットの生成失敗 $!") ; 114 # 接続 115 connect(SH, $struct ) 116 || return("接続失敗 $!") ; 117 # ソケットのバッファリングは行わない 118 select(SH); $| = 1; select(STDOUT); 119 $respons = <SH> ; 120 121 unless($respons =~ /^220/) { 122 close(SH); return("接続失敗 $!") ; 123 } 124 125# ------------------------------------------------------- # 126# コマンドの送信 127# ------------------------------------------------------- # 128# -------- HELOコマンドの送信とレスポンスの確認 --------- # 129 # コマンドの作成、送信 130 $command = "HELO $server\n"; 131 print SH $command ; 132 # レスポンスの受信、確認 133 $respons = <SH> ; 134 &decode($respons) ; 135 # レスポンスの確認 136 unless($respons =~ /^250/){ 137 close(SH); return("HELOコマンド失敗 $!") ; 138 } 139 140# -------- MAILコマンドの送信とレスポンスの確認 --------- # 141 # コマンドの作成、送信 142 $command = "MAIL FROM:$from\n"; 143 print SH $command ; 144 # レスポンスの受信、確認 145 $respons = <SH> ; 146 &decode($respons) ; 147 148 unless($respons =~ /^250/){ 149 print SH "RSET\n"; close(SH); 150 return("MAILコマンド失敗 $!") ; 151 } 152 153# -------- RCPTコマンドの送信とレスポンスの確認 --------- # 154 # コマンドの作成、送信 155 $command = "RCPT TO:$to\n"; 156 print SH $command ; 157 # レスポンスの受信、確認 158 $respons = <SH> ; 159 &decode($respons) ; 160 161 unless($respons =~ /^25[0|1]/){ 162 print SH "RSET\n"; close(SH); 163 return("RCPTコマンド失敗 $!") ; 164 } 165 166# -------- DATAコマンドの送信とレスポンスの確認 --------- # 167 # コマンドの作成、送信 168 $command = "DATA\n"; 169 print SH $command ; 170 # レスポンスの受信、確認 171 $respons = <SH> ; 172 &decode($respons) ; 173 174 unless($respons =~ /^354/){ 175 print SH "RSET\n"; close(SH); 176 return("DATAコマンド失敗 $!") ; 177 } 178 179# -------- ヘッダ、本文の送信とレスポンスの確認 --------- # 180 # 文字コードの変換 181 &jcode'convert(*send_data,'jis'); 182 # コマンドの作成、送信 183 $command = "$send_data\n.\n"; 184 print SH $command ; 185 # レスポンスの受信、確認 186 $respons = <SH> ; 187 &decode($respons) ; 188 189 unless($respons =~ /^250/){ 190 print SH "RSET\n"; close(SH); 191 return("本文、ヘッダ部送信失敗 $!") ; 192 } 193# --------QUITコマンドの送信 -------- # 194 # コマンドの作成、送信 195 $command = "QUIT\n"; 196 print SH $command ; 197# --------切断 -------- # 198 close(SH); select(STDOUT); 199 200$ResultCode = 1 ; 201 return "MAILは正常に送信されました。\n"; 202 203} 204 205# -------------------- 206# 改行コード変換 207# -------------------- 208sub decode{ 209 210 my $inf = $_[0]; 211 $$inf =~ s/\x0D\x0A|\x0D|\x0A/\n/g; 212 213} 214
試したこと
まずはタイムアウトが起きるという問題が発生したため
「$bits128 = &md5::convert("$FORM{'P1'}$FORM{'P2'}$FORM{'P3'}$FORM{'P4'}");」の一文を非表示にしました。
タイムアウトは改善されましたが、確認メールが届きません。
こちらのMd5に変換する行に問題があるのか、確認メールを送るためのプログラムに問題があるのか、他に問題があるのかわからず
問題個所の特定に当たりをつけていっているところです。
迷惑メールフォルダにも届いていませんでした。
アドレスを「shop@」から、所有の「k.iitsuka@」に変更してみましたが
変更後のアドレスへも届いていなかったので、確認メールも届かなかったのだと思います。
ユーザー登録のアドレスを「k.iitsuka@」に設定すると、なぜか確認メールが届くようになりました。
@以下が「」のものだと届くようです。しかしそれ以外は届きません。
つたない文章で申し訳ございませんが、何卒よろしくお願いいたします。