質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

2回答

2176閲覧

メールフォームからのメールが届かない

soraatori

総合スコア55

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/06/17 06:00

編集2022/03/19 09:43

前提・実現したいこと

名刺を注文するシステムを改修し作っています。
ユーザー登録フォームを実装中に、確認メール届かないという問題が発生しました。
ドメイン名は実際に存在するものです。
「&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@」に設定すると、なぜか確認メールが届くようになりました。
@以下が「」のものだと届くようです。しかしそれ以外は届きません。

つたない文章で申し訳ございませんが、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2020/06/17 07:04

メールが届かないということですが... 迷惑メールフォルダに届いていたりしないでしょうか? メールサーバーのログを確認するとエラーになっていることはないでしょうか? 送信者アドレスにエラーメールが返ってきていることはないでしょうか? もし、エラーが出ているのであれば、エラーの内容を質問に追記していただけないでしょうか。 また、お使いのサーバーは、何でしょうか? レンタルサーバー等の場合、同じサーバーの利用者等が大量のメールを送信したりして、ブラックリストに登録されている場合は、迷惑メールに判定されたり、受信拒否される場合もあります。 ---- また、質問に記載されているドメインは、利用されているドメインになりますが、ご自身で所有されているドメインでしょうか? 質問に記載するドメイン名は「ご自身が所有する実際のドメイン名」か「例示用に用意されているドメイン名 ( example.com / example.netexample.jpexample.co.jp 等)」を使ってください。( 例示用ドメイン名については、https://www.atmarkit.co.jp/fwin2k/win2ktips/801exampledom/exampledom.htmlhttps://jprs.jp/faq/use/等を参照してください。)
CHERRY

2020/06/18 03:33

質問のコードにメールを送信する部分の記載がないのですが、どのように送信しているのでしょうか? mb_sendmail ? mail ? smtp 通信? その他の方法?
CHERRY

2020/06/19 03:21 編集

perl ですか。 質問に PHP のタグがついていて、タグが間違っているので、Perl のタグに修正していただければとおもいます。 質問に記載されたプログラムには、メール送信部分がないようです。 おそらく ` &SENDMAIL ; ` と関数を呼び出しているので、この部分でメール送信しているのではないかと思いますが、肝心の関数部分のコードが、書かれていません。 どこか別の場所で記載されていますか?
soraatori

2020/06/28 04:57

返答ありがとうございます。 指示いただいた通り思い当たるコードを記載しましたが、合っておりますでしょうか。
soraatori

2020/07/07 04:04

基本的なことですみません。 もともとのプログラムは「&SENDMAIL ;」となっておりましたが、本来は「$sendmail = '/usr/bin/sendmail';」のようにプログラムを指定する必要があるものなのでしょうか。
CHERRY

2020/07/07 04:35 編集

Perl の `&SENDMAIL ; ` は、関数の呼び出しですね。 https://perldoc.jp/docs/perl/5.20.1/perlsub.pod の「サブルーチンを呼び出すには:」参照。 具体的には、shop_util.pl の sub SENDMAIL{ 〜 } で定義されている関数を 呼び出しています。 ---- プログラムでエラーが出ていない状況で、メールが届かないということであれば、迷惑メールに判定されていたり、メールサーバーの方でエラーが出ている場合があります。 メールサーバーのログには、なにか出ていないでしょうか?
soraatori

2020/07/07 05:40

なるほどです。 ありがとうございます。 やはり迷惑メールフォルダにも入っておりませんでした。 サーバーの「logs」の中に「access_log」などはございましたが、こちらとはまた違うものですよね。
CHERRY

2020/07/07 11:01

お使いのサーバーは何でしょうか? レンタルサーバー等の共用サーバーではメールのログは見れない場合があります。
soraatori

2020/07/07 11:48

レンタルサーバーは他社が管理されてまして、ログの内容を聞きましたが教えていただけませんでした。 ユーザー登録のアドレスを「k.iitsuka@creaplus.co.jp」に設定すると、なぜか確認メールが届くようになりました。 @以下が「creaplus.co.jp」のものだと届くようです。しかしそれ以外は届きません。
guest

回答2

0

まずはメールを送信する行の直前で、テキストの内容を/tmpの一時ファイルなどに書き出し、これが期待通りにできているか確認してみてはどうでしょうか。
この一時ファイルすらできないとすると、その上流の条件判定などに何か問題があるのだろうとの推測ができますよね。

それから、日本語をスクリプトに直接書き込んでありますが、文字コード周りで想定外の問題が出ている可能性も考えられます。このcgiをperl5.8.1以降で実行しているとすると、日本語を書き込むには所定の作法を守る必要があります。

そもそも、jcode.plとかあまりにも古すぎ(18年前に開発が止まった2世代前のデファクトスタンダード)なので、変な挙動に悩むぐらいならゼロから書き直してしまったほうが早そう、あるいは、見る限りそれほど特殊な処理ではないようですし、もう少しモダンな既製品を探してリプレイスしてしまうべきな気がします。いろいろ事情があるのだとは思いますが……。

投稿2020/06/27 14:38

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soraatori

2020/06/28 05:12

返答ありがとうございます。 とりあえずはjcode.plをjacode.plへと更新しました。 他にもmd5.plなどあやしいプログラムがございますが、代替えプログラムが見つかりませんでした。 使えそうな既製品がありましたら使った方がいいかもしれませんが、やはり無料はございませんよね…。 こっちの方面のプログラムに疎いもので、どのように探したらよいのかどうか。
KojiDoi

2020/06/30 12:55

それで、一時ファイルを使った問題の切り分けはやってみたんでしょうか?
soraatori

2020/07/06 08:51

ありがとうございます。探してみます。 すみません。現在検証中です。
guest

0

SENDMAIL関数はエラー時にエラー内容の文字列を返しているようですから、

perl

1&SENDMAIL ;

の行を

perl

1$html .= &SENDMAIL ;

に変更して実行すると、画面に表示される「申込いただき有り難うございます」の文言の前に「MAILは正常に送信されました。」あるいは何らかのエラー文言が表示されると思うのですが何が表示されますか?

投稿2020/07/15 19:16

編集2020/07/21 08:30
harrek

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soraatori

2020/07/21 01:32

ご回答ありがとうございます。 画面には表示されますが、同ドメイン以外のドメインには返信されない 正常にユーザー登録できないという問題があります。 メールが返信されないのは、文字コードか何かでブロックされているのではないかなと思います。 登録できないのはmd5を変換する必要があるのではないかと思います。 ただいま「Digest::MD5」を使用し検証中です。
KojiDoi

2020/07/21 03:16

その「&SENDMAILが出力したテキスト」をcgiを使わずにmailコマンドなどで直接送信してみたらどうなりますか。「文字コードか何かでブロックされている」のであればしかるべきエラーメッセージがmailコマンドが吐き出すエラーログに残っているはずです。
harrek

2020/07/21 08:23

すみません、説明が不十分でした。 前述の通りコードを修正して実行したとき、画面に表示される「申込いただき有り難うございます」の文言の前に「MAILは正常に送信されました。」あるいは何らかのエラー文言が表示されると思うのですが何が表示されますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問