テキストファイルからメールアドレスを読み取る方法について

このQ&Aのポイント
  • メールアドレスをテキストファイルから読み取る方法について質問があります。既存のフリーウエアのCGIを改造して、フォームから送信されたメールアドレスを元に、それに対応する社員番号をテキストファイルから読み込んで、入力されたアドレス宛にメールするCGIを作ろうとしています。
  • しかし、テキストファイルに存在するメールアドレスをCGIが見つけてくれていないようです。そのため、どのようにデータファイルを読み込んでいるのか確認するために、別の簡単なCGIを動かしてみました。
  • データファイルの中に該当するメールアドレスを表示させようとすると、正しい結果を得ることができませんでした。なぜ読み込んだ結果が「00」となってしまうのか、また、正しくメールアドレスを読み込むためにはどのようにすれば良いのか教えていただきたいです。
回答を見る
  • ベストアンサー

メールアドレスをテキストファイルから読み取れないのですが

既存のフリーウエアのCGIを改造して、フォームから送信されたメールアドレスを元に、それに対応する社員番号をテキストファイルから読み込んで、入力されたアドレス宛にメールするCGIを作ろうとしてます。 しかし、テキストファイルに確かに存在するメールアドレスをCGIが見つけてくれていないみたいなので、CGIがデータファイルをどう読み込んでいるのか確認するために以下のような別の簡単なCGIを動かしてみました。 (私はPerlの知識はかなり浅いので、この簡単なテスト用CGIはこのサイトで見つけたソースを元に作らせて頂いたものです) #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; my $file = 'data/member.usr'; # 読み込むファイル名 open(my $fd, $file); # ファイルを開く foreach (<$fd>) { # 以下1行ずつ読み込み my @cols = split("\t", $_); # タブで分割して配列へ $aidhi = $cols[2] if $cols[0] eq "031234567"; # 1項目めが該当の電話番号ならなら$aidhiはこの行の3項目めの内容 } close($fd); # ファイルを閉じる print $aidhi, "\n"; そして、データファイル「member.usr」の内容は次のようになっています。 0454329876 DG2GOUd75C2V2 nantoka@jcom.ne.jp 1187785757 1187785757 1187785757 1187785757 031234567 oHMTws.ycIreE namae@home.ne.jp 1187785757 1187785757 1187785757 1187785757 09012340001 aQH3oO85YlTdU denwa@docomo.ne.jp 1187785757 1187785757 1187785757 1187785757 こうして031234567に対応するメールアドレスを表示させようとすると、検索結果は「namae@home.ne.jp」と表示されずに「00」と表示されてしまいます。 でも、ここでCGIで取り出す内容を $aidhi = $cols[1] if $cols[0] eq "031234567"; と変えると、ちゃんと2項目めの「oHMTws.ycIreE」を表示してきます。 @マークやドットがいけないのでしょうか? $aidhi の内容に正しくメールアドレスを読み込ませるにはどうしたら良いのでしょう? だいたい、なぜ読み込んだ結果が「00」とゼロ2つになってしまうのでしょう? ちなみに、このデータファイルは別の既存CGI(スクリプトゲイトというフリーウエアです)が吐き出すデータベースファイルで、このファイルは既に色々な別のCGIに参照されているのでこのデータファイルのフォーマットを変えるのは極力避けなければなりません。 データファイルがタブ区切りになっているのがいけないのかなと思い、区切り方をカンマにしてCSVで読み込ませてみましたが、結果は変わりませんでした。 解決策のお心当たりのある方はいらっしゃらないでしょうか? どうかよろしくお願い致します。

  • MORGEN
  • お礼率100% (466/466)
  • Perl
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hito-koto
  • ベストアンサー率53% (14/26)
回答No.1

Linux環境ですが、 コピペして、member.usrのスペースをタブに置き換えて(コピペなので、スペースになってしまうので)、 動かしたら、きちんと動きました。。。 疑わしいのは、member.usrですね。 バイナリダンプで見て、余計なコードが入っていませんか?

MORGEN
質問者

お礼

ご回答ありがとうございました。 バイナリエディタって、テキストファイルの内容をチェックするのにも使えるって知りませんでした。 おっしゃる通り、テキストエディタでは表示されない黒点のコードが2つ入っていました! これの正体がわからないので、「eq」でなく「$aidhi = ~ m/abc@xxx.ne.jp/」で「このメールアドレスを含む場合」という抽出方法で切り抜けることにしました。 おかげさまで助かりました。 どうもありがとうございました!

関連するQ&A

  • メールフォーム

    #!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $to = '*********@*****************'; #$from = ''; $subject ='************'; # メール送信 open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae<br><br>"; print " $naiyou<br><br>"; print "メールを送信しました<br>"; exit HTMLで<textarea rows="6" cols="60" wrap="hard" required name="naiyou"> としたのですが Perlで確認表示の$naiyouの所が英語も日本語は改行されません。

    • ベストアンサー
    • Perl
  • 同一のメールアドレスの禁止設定を追加したい

    同一のメールアドレスを禁止するのを掲示板に適用させたいのですが、男性のログと女性のログがあり、どう設定していいか分かりません。男女のログファイルは階下のフォルダに入ってて、 男性 $mensfile 女性 $ladysfile とメインのCGIで設定されていす。 チャレンジしてみたら、過去のログファイルが全て消えてしまい散々な目に会いました。下のどちらかでできそうな・・宜しくお願い致します。 (1)# 二重登録のチェックをします if(-e $data){ open(FILE, "< $data"); # この時点でファイルは必ず存在します while(<FILE>){ @v = split(/\t/); if(@v[0] eq $name){ print "<center><b>すでに$nameさんは登録されています</b><br>\n"; print "「戻る」を押して入力しなおしてください</center>\n"; exit(0); } } close(FILE); } (2)#----------2重登録チェック---------- &lock; if(!open(IN,"$mail01")) {print 'ファイルOPENができませんでした。',"\n"; exit;} @dataline = <IN>; close(IN); unlink $lockfile; foreach $DATA (@dataline) { chomp $DATA; if($DATA eq $MAIL){ print 'このメールアドレスは既に登録されています。',"\n"; exit; } 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • Perl/CGIについて

    #!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $jcode = './jcode.pl'; $to = 'ha***@***.ne.jp'; #$from = ''; $subject ='名鉄と地下鉄の直通運転'; # 文字コードライブラリの読み込み require $jcode; # メール送信 &jcode'convert(*subject,'jis'); open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae\n"; print " $naiyou\n"; print "メールを送信しました\n"; end #確認表示の所で表示が改行されない。

    • ベストアンサー
    • Perl
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • 確認のメールアドレスの比較の方法

    フォームメールなどで、メールアドレスを入力違いを防ぐため、2回入力させ、違う場合はエラーメッセージを表示させたいのですが、どのように 記述すればよいでしょうか? ちなみに今使っているのでは、以下のような形で入力項目をチェックしています。どうぞよろしくお願いします。 if ($namae eq "") { &error("名前が入力されていません");} if ($post eq "") { &error("郵便番号が入力されていません");} if ($pref eq "") { &error("県名が入力されていません");} if ($address eq "") { &error("住所が入力されていません");} if ($phone eq "") { &error("電話番号が入力されていません");} if ($phone!~ /^\d{2,5}-\d{1,4}-\d{4}$/) { &error("電話番号は半角数字でハイフォンで区切って入力して下さい"); } if ($email eq "") { &error("メールアドレスが入力されていません");} if ($email =~ /\s|\,/) { &error("メールアドレスの入力が不正です");} if ($email !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error("メールアドレスは半角で正しくご入力ください");} #if ($email !~ /(.+)\@(.+)\.(.+)/) { &error("メールアドレスの入力が不正です");}

    • ベストアンサー
    • Perl
  • CGIでファイルが読み込めない

    CGI初心者です。 (osはlinuxです。) #!/usr/local/bin/perl use strict; use CGI; my $file=new CGI; open(DATA,"/home/data.txt"); $file=<DATA>; close=(DATA); print "Content-type: text/html\n\n"; print "data=$file"; このスクリプトで、/home/data.txt(フルパスです)に書かれているデータを1行だけをブラウザで表示させたいのですが、表示できません。 どこがおかしいのか教えてください。 ちなみにdata.txtには実際に「abc」という文字1行しか入れていません。

    • 締切済み
    • CGI
  • HTMLからCGIへデータを引き継ぎ

    HTMLでメールフォームを作りCGI(Perl)で次のプログラムを作りました。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "$mail\n"; print "$namae\n"; print "$naiyou\n"; 動作確認のためプログラムは少しにしました。何も表示されません。

    • ベストアンサー
    • Perl
  • テキストファイルが開けません。

    main関数に2つの引数をとり、第1引数で指定したファイルの内容を第2引数で指定したファイルにコピーするプログラムを以下のように作りました。 #include<stdio.h> #include<fcntl.h> int main(int argc, char* argv[]){ int fd1, fd2, rs, ws; char buffer[10000]; if(argc!=3){ write(2, "使用法:実行ファイル コピー元ファイル コピー先ファイル\n", 54); exit(1); } fd1=open(argv[1], O_RDONLY); if(fd1<0){ fprintf(stderr, "can't open file '%s'.\n", argv[1]); exit(1); } fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); if(fd2<0){ fprintf(stderr, "can't open file '%s'.\n", argv[2]); exit(1); } while((rs=read(fd1, buffer, 10000))>0){ if((ws=write(fd2, buffer, rs))!=rs){ write(2, "an error occurred while copying.\n"); exit(1); } } close(fd1); close(fd2); } コンパイル、実行ともに正常終了したのですが、 コピー先のテキストファイルを開こうとすると、 「アクセスは拒否されました。」というダイアログが表示されて 開くことができません。 なぜなのでしょうか。 よろしくお願いします。 ちなみにOSはWindows Vistaで、 プログラムはcygwin上で実行しました。

  • 添付ファイルをつけてメールを送る

    以下のようなイメージでプログラムを制作しようと思っています。 csvファイル メールアドレス1,添付ファイル1 メールアドレス2,添付ファイル2 メールアドレス3,添付ファイル3 メールアドレス4,添付ファイル4   ・   ・   ・ cgiファイル ・csvファイルを読み込む   ↓ ・タイトル、本文は固定。 ・メールアドレス1には添付ファイル1を送る。(アドレス2なら2を添付) ・csvファイルの行数だけこれを繰り返す。 ----------------------------------------------------------------- フォーム入力送信→担当者にメールが届く というのはサンプルをもとに作る事ができたのですが、 それに「添付ファイルを付ける」にはどうしたら良いのでしょうか? 現在メールの書き出しは下記のようになっています。(添付無し状態) #######################################################メール送信 $head = "From: 送信者" . "\n" . "To: 宛先" . "\n" . "Subject: タイトル" . "\n\n"; open(MAIL, "| sendmailパス -t -f'送信者'") ; print MAIL "$head"; print MAIL <<__END__; ###メール本文### __END__ close(MAIL);

    • ベストアンサー
    • Perl
  • テキストファイル内の変数を展開して出力したい

    テキストファイル内に変数を書いておいて、出力時に その変数を展開させる方法を教えてください。 具体的には、[test.txt]を[出力]のようにしたいのです。 ためしに[test.cgi]を作ったのですが[test.txt]の内容がそのまま出てきてしまいました。 [test2.cgi]ができるなら、[test.cgi]でもできると思っていたのですが… [test.cgi] #!/usr/local/bin/perl $moji="OK"; print "Content-type: text/html\n\n"; open(IN, 'test.txt'); while (<IN>) { print "$_"; } close(IN); exit; [test2.cgi] #!/usr/local/bin/perl $moji="OK"; $naka="<HTML><BODY>$moji</BODY></HTML>"; print "Content-type: text/html\n\n"; print "$naka"; } close(IN); exit; [test.txt] <HTML><BODY>$moji</BODY></HTML> [出力] <HTML><BODY>OK</BODY></HTML>

    • ベストアンサー
    • Perl

専門家に質問してみよう