• ベストアンサー

メールアドレスでメンバー認証

メンバーサイト構築にて質問です。 ユーザーから送られてきたメールのメールアドレスで、 メンバーであるか新規であるかを判断するプログラムをperlで作成したいと思っております。 まだperl初心者なのでもっと良い方法がないか考えたいのですが経験がないので考えが浅はかです。 何卒、ご意見または別の案などご教示頂けないでしょうか。 (メンバー数の想定は10万~100万 データベースは使いません) ※当初の考え ファイルに新規ユーザーのメールアドレスを追記 →ファイルをオープンして1行づつ検索 懸念:メンバー数が多くなればファイルをオープンするだけで結構なメモリを消費するのではないか、ループで1行づつ検索したらすごい負荷がかかるのではないか。 ※現時点の考え 新規ユーザーのメールアドレスをファイル名にしたファイルを作成(@マークなどは別の記号に変更) →ファイル検査演算子でファイルがあるかどうか判断 懸念:すごく速い気がするのですが、これって現実的なんでしょうか??

  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.2

メールアドレスの 先頭1文字ごとに 別のFileを作って保存したらどうでしょう? abc@hoge.example.com 、 a@test.example.jp 、 aki@example.tv =>file名「a]に書き出し boku@***.net    省略    =>file名「b」に書き出し  メールアドレスの先頭に数字を使えるところと使えないところ 大文字もありのところと小文字だけのところなど様々ですが 多くてもfile数は数十個ですし 検索時の負担も数十分の一にはなるんじゃないでしょうか?

nerumako
質問者

補足

ご回答ありがとうございます。 良い手法ですね。 mailaddres | No | flag |\n を1行として10万行。「10万メンバー分のデータを1ファイルで保存」と仮定して実験してみました。 whileで検索をかけ99999行目でマッチさせるのに、0.15秒でした。サーバー環境もあるでしょうけどかなり速いものですね。 ファイルで管理する場合はこのabcファイルインデックス手法?が最善でしょうか。 この度の主旨から少し離れますが、調べておりましたらDBMという物を知りました。 DBM::Deep(DBMとは別物?)などはPerlで書かれていてすごくとっつきやすそうで、少々気になります。

その他の回答 (2)

回答No.3

DBMとかはつかったこと無いので、、 普通にcsvfileに書き込み/読み出しすれば足りていましたし CSVの方が他にも使い回しが出来るので、、、 DBMについては http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_bigdata.html http://memo.blogdns.net/cgidbm.html あたりを見ていただくか 詳しい人に追加回答いただけると嬉しいです さてと、以下 思いつきで書きますので 適当に取捨選択してください #2の応用ですが インターネット上のメールアドレスだと 最低でも 4つ以上の 半角英数字を含むと思います(<=a@*.jp  LAN内だと a@aも有るが) それを利用してサブディレクトリを生成すれば >メールアドレスをファイル名にしたファイルを作成 も現実的に成りますね $mail に 入力された アドレスがあるとして TESTするなら $mail = 'a@example.com';# ←TEST用アドレス @list_p = ($mail =~/\w/g); #↑ @list_p の各要素に 半角英数字または _ が一つづつ格納される(以前の質問での他の回答者の受け売りですが ) print join(" - ",@list_p); # ← 確認のため表示してみる # 上の例だと a - e - x - a - m 以下略 と表示される 取得した値のうち $list_p[0] ~$list_p[3] まででディレクトリの階層とします データ用の親ディレクトリを /home/tarou/list/ (以下では list/)として 上のサンプルアドレスだと list/a/e/x/a/ と言う階層に a@example.com と言うfileをおきます。 既に数十件のアドレスが登録されている状況を考えると 1.入力されたアドレスから list/a/e/x/a/ と言うディレクトリのパスを取得 2. fileTEST演算子で ディレクトリが存在するか確認    =>アドレス自体を確認するまでも無く 新規だと言う事が判る 3.list/a/e/x/a/a@example.com が有るか fileTEST演算子で確認 尚 個人情報保護の観点から list/ 以下のフォルダに 他人がアクセスできない工夫が必要です suexec でCGIが動くなら ディレクトリのパーミッションを 700 にすれば 大丈夫だと思いますが suexecでないなら共用サーバーではhttpアクセスは防げますが 他のユーザーが設置した CGIによるfile読み込みを防げませんので 現実的ではないですね

nerumako
質問者

お礼

ご回答ありがとうございます。 DBMの参考URL、早速拝見させて頂きます。 @を除くアドレスの頭4文字分のディレクトリは面白い発想ですね。 自分では思いつかない発想に関心致しました。 メンバー×ファイル+かなりの数のディレクトリ数になると言う部分は#1さんの言われている、ファイルシステムのトラブルと言うものが気にかかります。 1フォルダに多量のファイルを入れるより良い。とかあるのでしょうかね。 他の方々の参考意見も聞ければ幸いです。

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.1

動作はしますよ。 ただ現実問題、100万ファイルあるフォルダの中身を操作できるツールは存在しないでしょうね。 FTPなどで接続してもファイルリストの取得中にタイムアウトになると思います。 つまり、単純にダウンロードではバックアップするのは厳しいということです。 あと、ファイル1つ作るごとに、ファイルシステムが管理する情報が実際には発生します。権限、作成日、所有者などなど・・。 これらを100万ファイル分管理させたとなると、ファイルシステムのトラブルが発生する可能性も高まります。 ということで、「当初の考え」のほうをお勧めします。 ファイル内から該当する行を探すには、whileでテータの中身を1行ずつ読ませることでメモリの消費も一定ですみます。

nerumako
質問者

補足

ご回答ありがとうございます。 バックアップに関してはssh操作にてtarボールで圧縮保存するつもりです。 ダイヤモンド演算子に対して間違えた概念を持っておりました。 おっしゃる通り whileで1行づつ処理すればメモリの問題はかなり解決しそうです。 「※現時点の考え」では、メンバーごとにデータファイルを作成し、他の処理も高速に行う予定でしたのでついでにメンバーのメールアドレス認証にファイル名を使おうと思った次第です。 10万~100万メンバーを想定した場合、ファイル1つで全メンバーのデータを入れると何もかも処理が遅くなりそうで不安です。 何か手立てがあればと思います。 また、ファイル1つでデータを管理する以外何か良い方法などありますでしょうか。 それとも10万~100万メンバー規模をファイル管理で高速化を狙うと言う事自体が非現実でしょうか。 宜しくお願い致します。

関連するQ&A

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

    既存のフリーウエアの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で読み込ませてみましたが、結果は変わりませんでした。 解決策のお心当たりのある方はいらっしゃらないでしょうか? どうかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 無料メールアドレスにログインできません。

    無料メールアドレスにログインして、メールを見ようとしたら、 「ログインしているユーザ数が同時ログインユーザ数を超えているためログインできません。」とでて、メールを見ることができなかったのですが、これは私の無料メールアドレスに誰かが別のパソコンでアクセスしているということでしょうか?

  • エクセルシート上に点在するメールアドレスに一括して同報送信するソフトウェア

    表題の通りです。エクセルにデータベースを作成しており、そこにはメンバーのメールアドレスがある行に存在しています。 この行(なり列なり)からのメールアドレスを自動的に拾い出して、同報メールを一括して送る方法、あるいはソフトウェアがあれば教えていただけませんでしょうか。 どうぞよろしくお願いいたします。

  • メールアドレスをフォルダごとにバックアップ

    教えて下さい。 OS:windows XP Pro Outlook Express6を使用しています。 通常メールアドレスのバックアップをするとき ファイル→インポート→他のアドレス帳→テキストファイルでエクスポートしていたのですが、これだと、メインユーザーの連絡先しかバックアップされてませんでした。 アドレスが多いので分かりやすいように区分けとしてフォルダでアドレスを分けていたので別のバックアップ方法として ツール→アドレス帳→ファイル→エクスポート→アドレス帳(WAB)でエクスポートしました。 ・・・ところが、別のパソコンでインポートするとアドレスはもちろんバックアップされているのですが、フォルダ分けが解除されていました。数が多いので、再仕訳が大変です。 フォルダ分けの状態でメールアドレスをバックアップする方法はあるのでしょうか?

  • メールアドレスについて

    レンタル写メール掲示板を作成しているのですが、 ユーザー毎にメールアドレスを発行しないといけないのでしょうか? ユーザー:**** の場合、****@domain.com ユーザー:****2 の場合、****2@domain.com のようにメールアドレスへ送信する形にしたいのです。 こんな感じです http://mobi.to/si/?id=sample1

  • " がメールアドレスに

    こんにちは、honiyonです。    E-MAILアドレスの規格外である事は確かなのですが、   "xxxxxxxx"@hoge.com  なんていうメールアドレスを見つけました。  今のところ2,3通みかけているのですが、"を含むメールアドレスを作成している方はどれくらいいるのでしょうか?  因みに私の見たたアドレスはDoCoMoユーザーでした。  よろしくお願いします(..

  • アドレス帳の改訂がLive Mailで使えない

    Windows7のユーザーファイルにあるアドレス帳に追加、変更等の改訂を行っても、Windows Live Mailのメール作成の際、ウインドウに現れるアドレス帳は古いままで残っており、新しいものが利用できません。対策をお教え願います。

  • aliasesの1フィールド目をメールアドレスへ変換して2フィールド目も表示する

    aliasesファイルの ドメイン.com~user:  user01,user05,外部メールアドレス,user04, となっている行から1フィールド目をメールアドレスに変換して 2フィールド目のユーザを1フィールド目に移動し、さらに 特定のユーザ名前だけを残すことはできますでしょうか こうなってほしいのです↓ user05 user@ドメイン.com 先ほど以下のコマンドでメールアドレスに変換することは できたのですが、関連するユーザを同じ行に表示させたいのですが、 このままではどのユーザのメールアドレスかわからないのです。 awk -F: '/~.*:/{split($1,a,"~"); printf "%s@%s\n", a[2], a[1]}' < /etc/mail/aliases どのようにしたら希望通りになりますでしょうか

  • Windows Live mail のアドレス帳

    Windows Live IDを作成し、アドレス帳の登録がうまくいきません。 ・アドレス帳を選択すると、添付画像のような表示がされます。 ・新規作成にて、あて先を1件作成すると、  「すべてのメンバー(0)」→「すべてのメンバー(1)」となり、 ・一旦、Windows Live mailアプリケーションを閉じる。 ・再度、Windows Live mailを起動し、アドレス帳を選択すると、 ・「すべてのメンバー(0)」となり、先ほど、作成したあて先1件がクリアされてしまいます。 どのようにしたら、アドレス帳の登録(保存)がうまくいきますでしょうか。

  • メールアドレスを一括でエンコードしたい

    HPに掲載してあるメールアドレス(htmlファイル)を ロボット検索により取得されないようにするために、 一括してエンコードしたいと考えています。 メールアドレスの数が多いので、一括でエンコードする 方法があれば教えてください。 Dreamweaverかその他のフリーウェアでお願いします。

専門家に質問してみよう