DreamweaverCS5 Windows Vista
下記文中のどこかの部分がひっかかり「-」(ハイフン)の入ったアドレスの場合にエラーがでます。
プログラムのつながりがあるので現在のかたちを変えずに修正する場合はどうしたらいいのでしょうか?
# メールアドレスの判定
# パラメータ:(判定文字列,チェックするアドレス)
# 1: OK, 0: NG
sub xxx_chk_user {
my $fromadd;
my $chkadd;
$_ = shift;
$chkadd = shift;
if($_ =~/^From:/) {
if($_=~/<([^>]+)>/){
$fromadd = $1;
}
elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]@[a-zA-Z0-9\.\-\/]+)[\s]*|){
$fromadd = $1;
}
if ($fromadd ne $chkadd) {return 0;}
} else {return 1;}
return 1;
}
if ($fromadd ne $chkadd) {return 0;}
} else {return 1;}
return 1;
}
質問自体はおかしいのかも知れませんがわかる方がいたらお願いします。
メールアドレス欄と確認用メールアドレス欄に入力されたメールアドレスの同一チェックでしょうか?
閉じる場所が不適切な為か、メールアドレスに「-」の有無に関わらずエラーが発生する状態でした。
以下のように修正すると動作しますので、試してみてください。
sub xxx_chk_user { my $fromadd; my $chkadd; $_ = shift; $chkadd = shift; if($_ =~/^From:/) { if($_=~/<([^>]+)>/){ $fromadd = $1; } } elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]+@[a-zA-Z0-9\.\-\/]+)[\s]*|){ $fromadd = $1; } if ($fromadd ne $chkadd) { return 0; } else { return 1; } }
※「[a-zA-Z0-9\.\-\/]」だけだと@の前の1文字しか判定できませんので、「+」を加えて「[a-zA-Z0-9\.\-\/]+」としてあります。
※「elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]+@[a-zA-Z0-9\.\-\/]+)[\s]*|){」の部分は、「elsif($_ =~m|[\t]*([a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+)[\s]*|){」とした方がいいかもしれません。(ブラケット([])の中なので、「./」等に「\」は必要ありませんし、メールアドレスに「\」は含まれないはずです。)
http://www.kent-web.com/perl/chap5.html
【追記】
もしメールヘッダからFromメールアドレスを取得している場合は、次のようにしてください。(※現在の状態では、From以外(「Return-path」等)のメールアドレスを取得する可能性があります。)
if($_ =~/^From:/m) { if($_=~/From:.+\s*?<([^>]+)>/){ $fromadd = $1; } elsif($_ =~m|From:[\s\t]*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)[\s]*|){ $fromadd = $1; } }
※アンダーバー「_」が含まれる場合を考慮していなかったので、正規表現部分にアンダーバーを追加してあります。
ありがとうございます。
2012/02/08 12:18:59具体例をいただき、とてもわかりやすかったです。
CGIのことがあまりわからず、どんな質問していいのかわからない状態でおります。
一度見直してみて再度ご質問させて頂こうかと思います。
またお時間がありましたらご回答いただけると助かります。
ポイントとベストアンサーまでありがとうございます。
ハイフンの後に0「ゼロ」がくると500エラーになるとの事でしたが、どのような値をsub xxx_chk_userに渡して実行しているのでしょうか?
ハイフンの後に0が無い場合の動作を確認した後、CGIスクリプト自体の書き換えを行って確認しているのですか?
ケアレスミスの可能性もあるので、書き換えた箇所を確認するといいのですが・・・
(ハイフンの後に0が無い場合にきちんと動作するのでしたら、sub xxx_chk_userの部分はエラーの原因ではないはずです。)
Fromメールアドレスの検索対象がメールヘッダなのか、メールフォームの特定の入力欄の値なのかによって、必要な処理の記述は異なります。(以下は両方対象にしてありますが、必要ない処理は削ってください。)
・チェック対象のメールアドレスを直接渡している(※メールヘッダからの取得ではない)場合は、以下の処理だけで大丈夫です。
※上記はいづれも$fromaddへの代入部分だけですが、その後の比較チェックの記述も必要です。
2012/02/09 01:41:14メールアドレスごとにCGIを変更して動作確認を行っているのか、その場合どこをどのように変更しているのか、等の他に、このCGIの種類(メールフォームあるいは、メール解析のCGI等)が分かると返答しやすいです。
他に必要な事が出来れば、その都度追加して確認させていただきます。
こちらに返信していただきましたら、分かった場合はもちろん、分からなかった場合も、ここに何らかの返信をしますので・・・