PerlでS/MIMEを使ったメールフォームの暗号化送信

このQ&Aのポイント
  • Perlを使用して作成したメールフォームからS/MIMEで暗号化してメールを送信する方法について教えてください。
  • 現在、Perlで作成したメールフォームからS/MIMEを使用してメールを送信する際、一度ファイルに保存する必要がありますが、ファイルを使わずに変数を使用して直接送信する方法が分かりません。
  • 具体的なコード例などを教えていただけると助かります。
回答を見る
  • ベストアンサー

perlのメールフォームでS/MIME送信

お世話になります。 perlをつかってメールフォームを作っています。 メールフォームから受け取った情報を(受け取るまでは暗号化してます。) S/MIMEで暗号化しメール送信したいと考えております。(linux sendmeil) 調べてみたところopensslを使いあらかじめ用意したテキストファイルを S/MIMEで送る事ができました。 ↓こんな感じです。--------------------------------------------------------------- $SMIME = 'openssl smime -sign -signer my-cesr.pem -inkey key.pem -in mail.txt -text | openssl smime -encrypt -from masa@****.co.jp -to yosi@****.co.jp -subject "signtest" -des3 my-cesr.pem | /usr/sbin/sendmail masa@****.co.jp'; open (MAIL, "| $SMIME"); close(MAIL); -------------------------------------------------------------------------------- ↑この方法ですとメールフォームから受け取った情報を一度ファイルに 保存(mail.txt)しなければならないので、実用的ではありません。 何とかファイルからではなく変数で送信したいのですがうまく行きません。 っというか方法がさっぱり分かりません。 どうぞ宜しくお願いします。m(__)m

  • sonar
  • お礼率57% (27/47)
  • Perl
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.3

再々度。 悔しい(笑)ので自分のところで試してみたところ,私の環境(openssl 0.9.6c, Solaris 2.6, Perl 5)では,以下のようなPerlスクリプトが正常に動作しましたが...。 - Linux と Solaris (あまり重要な差ではない) - CGIとシェルからの実行 (実行権に気を付けるくらい) - メイルの送信にsendmailではなくmailx (Solaris についてくる sendmail の CUI のようなものなので本質は同じ) くらいしか違いがないと思うのですが…。sonarさんのところのopensslのバージョンはどうなっているでしょうか? #!/bin/somewhere/perl $msg = 'This is my happiness.'; $openssl = 'openssl smime -sign -signer senderCert.pem -inkey senderPrivKey.pem -text | openssl smime -encrypt -des3 senderCert.pem | mailx -s "openssl test" ***@***.***'; system ("echo '$msg' | $openssl"); 1;

sonar
質問者

補足

じっさいに試していただいたのですね。。。(^^; ほんとにありがとうざいます。 動作したということなので自分も何とか頑張ります。 自分の環境は[openssl0.9.6b,redhat7.2,perl5]です。 なぜ駄目なのかちょっと調べてたのですが、どこかのメーリングで 「リダイレクトはOKだがパイプ渡しでは駄目。これはバグです。」のような事が書いてありました。 ちょっと面倒ですが今度はバージョンを上げて試してみます。

その他の回答 (3)

  • aton
  • ベストアンサー率47% (160/334)
回答No.4

殆どダイアログ状態ですね。 > どこかのメーリングで > 「リダイレクトはOKだがパイプ渡しでは駄目。これはバグです。」のような事が書いてありました そのMLは私も見た気がします。また別MLではそれに対するパッチ(ソース)を投稿していた人もいたような。 自分の状況と矛盾するので,ちょっと気になってはいるんですが。 さらにトライしてみられるのであれば, - まず Perl からではなくシェルから, - サインだけとか,暗号だけとかにわけて,echo 'abc' | openssl smime ... を実行し, 問題がどこにあるのかを正確に切り分けられることをお勧めします。

sonar
質問者

お礼

いまだ上手くいきませんが、よくよく考えたら セキュリティー的にはファイルからのほうが無難かなと 思い直しました。。。(^^; ただ、パイプでできないのは悔しいので 今後もトライしてみます。 それでは、いろいろとありがとうございました。m(__)m 失礼します。。。

  • aton
  • ベストアンサー率47% (160/334)
回答No.2

再びatonです。 すごい恥ずかしい間違いをしていました。 誤:open (MAIL, "cat $mail | $SMIME"); 正:open (MAIL, "echo $mail | $SMIME");   open (MAIL, "echo '$mail' | $SMIME");   system ("echo $mail | $SMIME");   system ("echo '$mail' | $SMIME"); の4つのうちのどれか(systemを使う場合 close (MAIL); は不要です)。 これでもうまくいかなそうな気もしますが,とりあえず試すだけ試してみてください。

sonar
質問者

補足

echo については cat のアイデアをいただいた時に 試してみましたが駄目でした。。。 (systemでも) ありがとうございます。

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

なぜ,「実用的ではない」のかが今一つ分からないのですが…。 $SMIME = 'openssl smime -sign -signer my-cesr.pem -inkey key.pem -text | openssl smime -encrypt -from masa@****.co.jp -to yosi@****.co.jp -subject "signtest" -des3 my-cesr.pem | /usr/sbin/sendmail masa@****.co.jp'; open (MAIL, "cat $mail | $SMIME"); close(MAIL); 註:$mail はメイル本文が入っている変数 とかじゃだめでしょうか? (試してないので自信はありません)

sonar
質問者

補足

ご返答ありがとうございます。 試してみましたがうまくいきませんでした。。。 >なぜ,「実用的ではない」のかが今一つ分からないのですが…。 実用的ではない。。っというよりは単なるこだわりに近いかもです。。(^^; なんというかスマートでない気がするんで。。。 もうひとふんばりして駄目だったら一度ファイルに落としてから やる方法にいたします。 ありがとうございました。

関連するQ&A

  • S/MIMEでの証明書の保存と多重暗号化

    メールソフトを作っています。 1.S/MIMEでの証明書は個別のファイルとして保管するのと、 データベースにしておくのではどちらが普通なのでしょうか? 2.S/MIMEでの暗号化をして、さらに他の方式で多重暗号化する上で、 注意することは何でしょうか?(単純なS/MIMEとの上位互換性を持たせたい。) 以上、よろしくお願いします。

  • S/MIMEを実際にOUTLOOK2003か2007で使ってみたいので

    S/MIMEを実際にOUTLOOK2003か2007で使ってみたいのですが、 どうすればいいのでしょうか? 具体的には、 1.メールを暗号化して送信する。  また、受信者の復号の仕方。 2.電子署名付きのメールを送信する。  電子署名付きのメールを受信したことがあるのですが、このとき、どうやって署名がその人のものかの判別も。 です。 よろしくお願いします。

  • メールフォームを作成しましたがうまく送信できません。

    こんにちは。 メールフォームを作ったのですが、上手く送信できません。 「このフォームは電子メールを使って送信されています。このフォームを送信すると、電子メールアドレスが受信者に公開され、フォームのデータが暗号化されずに送信されます。このフォームは続行することもできますが、取り消す事もできます。」と出てきます。 メッセージは出てもかまわないと思いますが、なんとか送信できるようにする方法を教えてください。 もしもフォームだけ作成し公開できるサイトなどもありましたら教えてください。 どうぞよろしくお願いします。 使ったソフト:「ホームページNinja2003」(他のソフトでも同様な結果)(ちなみに「メールフォーム機能だけでなくフォーム機能も使ってみました。)

  • Perl メールフォーム

    Perl勉強中です。ご教示お願いします。 #!/usr/bin/perl -w use Encode qw(from_to encode); use Net::SMTP; use strict; my $from = 'xxxx@xxxxx.jp'; my $mailto= 'xxxx@xxxxx.jp'; my $mailcc= 'xxxx@xxxxx.jp'; my $subject = 'ホームページからのお問い合わせ'; from_to($subject, 'shiftjis', 'iso-2022-jp'); encode('MIME-Header-ISO_2022_JP', $subject); my $header = << "MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = 'ISO-2022-JP" Content-Trensfer-Encoding: 7bit MAILHEADER my $message = "テスト"; from_to($message, 'shiftjis', 'iso-2022-jp'); my $smtp = Net::SMTP->new('xxxx-xxxx.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; 現在ここまでできています。 「ホームページ→お問い合わせクリック→メール送信」 そして、今回教えていただきたいのが、 イメージなのですが、 ホームページ→お問い合わせクリック→メールフォームのページに移動→内容入力 →確認ボタンクリック→確認画面→送信ボタンクリック→送信+送ってきた人へ自動返信(定型文) という風にしたいのですが、どうすればいいのかわかりません・・・ できればコードを教えて頂ければ嬉しいです。

    • ベストアンサー
    • Perl
  • PKIの仕組みのSSLへの適用は理解できるのですが、S/MIMEへの適

    PKIの仕組みのSSLへの適用は理解できるのですが、S/MIMEへの適用が理解できません。 具体的には、証明書により確認する相手は誰なのか(メール送信者?メールサーバー?)、内容の暗号化は誰が行って、誰が復号するか等です。

  • フォームメール送信時のアラートについて

    HTMLとJavaScriptで作ったフォームメールで、送信ボタンをクリックすると、 ブラウザから ------------------------------- このフォームは電子メールを使用して送信されています。 このフォームを送信すると、電子メールアドレスが受信者に公開され、 フォームのデータが暗号化されずに送信されます。 この送信は続行できますが、取り消すこともできます。 [ OK ] [キャンセル] ------------------------------- というメッセージが表示されます。 このメッセージを表示させなくする方法はないのでしょうか?

    • ベストアンサー
    • HTML
  • Perl メール フォーム

    ホームページのメールフォームについて教えてください。 現在ホームページで、お問い合わせページを作っている最中です。 そこで、現在下記のコードまでできております。 #!/usr/bin/perl -w use Encode qw(from_to encode); use Net::SMTP; use strict; use warnings; use Encode; use CGI; my $p = new CGI; #メールアドレス設定 my $from = 'aaaa@aaaaa.jp; my $mailto= 'aaaa@aaaaa.jp; my $mailcc= 'aaaa@aaaaa.jp; #サブジェクト設定 my $subject = 'ホームページからのお問い合わせ'; from_to($subject, 'shiftjis', 'iso-2022-jp'); encode('MIME-Header-ISO_2022_JP', $subject); #メールヘッダー設定 my $header = << "MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = 'ISO-2022-JP" Content-Trensfer-Encoding: 7bit MAILHEADER #メール本体設定 my $message = "a"; #my $subject = $p->param('subject'); #文字コードをJISに変換 from_to($message, 'shiftjis', 'iso-2022-jp'); #メール送信オブジェクト設定 my $smtp = Net::SMTP->new('aaaaaaa.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; これだと、ホームページのボタン等をクリックすると メールは送られます。 差出人が'aaaa@aaaaa.jp 件名がホームページからのお問い合わせ 内容がa です。 これは、コード内にこう書いているから必然的にこれがくるわけなのですが、 そうではなく、 ホームページでお問い合わせボタンがありそこに <a href="http://aaaaaa.jp/cgi/mailform.pl"><img src="img/share/mail.gif" width="100" height="50" alt=""></a> mailform.plもしくはmeilform.htmlを表示させ下記のコードで表示されるページにアクセスし #!/usr/bin/perl <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>メールフォーム</title> </head> <body> <h1 class="title">メールフォーム</h1> <form method="post" action="mail.pl"> <input type="hidden" name="a" value="exec"> 件名(Subject) :<br /> <input type="text" name="subject" size="80" value=""><br /> 宛先(To) :<br /> <input type="text" name="to" size="80" value=""><br /> 差出人(From) :<br /> <input type="text" name="from" size="80" value=""><br /> 本文(Body) :<br /> <textarea name="body" rows="10" cols="65"></textarea><br /> <p> <input type="submit" value="送信"> </p> </form> </body> </html> ここで 差出人、件名、内容を入力し、送信のボタンを押すと my $subject = 'ホームページからのお問い合わせ'; my $message = "a"; my $from = 'aaaa@aaaaa.jp; この3つをmailform.plもしくはmailperl.htmlで 入力した内容で送信をしたいのですが、 これのやり方を教えてほしいです。。。 当方ホームページ作りも初心者で、Perlも最近はじめたとこでまだ理解できていないとこも 多いため説明がわかりにくいかもしれません・・・ その時は、ご指摘ください;; また、業者に頼むことは考えておりません・・・ 参考書やいろいろネットサーフィンしてみたのですが、上手くできません どうかお力添えをお願い致します!

    • ベストアンサー
    • Perl
  • S/MIMEでの公開鍵の個数

    S/MIMEについて調べています。 Xさんが、Aさん、Bさん、、、、Jさんの10人とS/MIMEを使って通信するとします。 暗号はRSAとします。 Xさんは、Aさん用の証明書つきの公開鍵、Bさん用の証明書つきの公開鍵、、、、 のように、10人分の異なる公開鍵を用意して運用することは可能ですか? とうぜん、Aさんが使う秘密鍵は10個となります。 個別にしておいたほうが、因数分解されたときの被害が最小限になる。 もちろん、11番目のKさんとは暗号化しないでメールのやり取りをする。  サンダーバードを使って上のようなことが出来ないかと考えています。    使ったことが無いので、へんな質問かもしれませんがよろしくお願いいたします。

  • PHPでの文字化け

    公開鍵による暗号化のプログラムで、ソースは以下のとおりです。 <?php // 初期設定 $data = file_get_contents('data.txt'); // 平文を読込み $cert = file_get_contents('cert.pem'); // 証明書を読込み $enc_file = 'enc'; // 暗号文ファイルパス // 公開鍵による暗号化処理 $cert_res = openssl_pkey_get_public($cert); // 証明書リソースを取得 openssl_public_encrypt($data, $enc, $cert_res); // データを暗号化 file_put_contents($enc_file, $enc); // 暗号文をファイル出力 ?> これで出力される暗号文が文字化けしたような文字コードになっているのですが、これは正常なのでしょうか? なにか、エンコード等する必要があるのでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • Perlでのメール添付送信のエラー

    PerlでメールにZIPファイルを添付して送信したいです。 http://homepage3.nifty.com/hippo2000/perltips/perlmail.htm#1.2 http://perltips.twinkle.cc/perl/mail_mime_attached_file.php 上記のサイトを参考に以下のプログラムを組んでみました。 するとエラーメッセージが画像のような感じででてきました。 おそらく、なんか文字コードがおかしいのかもしれないのですが、どこから手をつけていいのかわかりません。 どなたかお助け下さいm(__)m 前回も別の問題で助けていただいたのですが、文字コードの問題でした。他の部分は全くひっかからないのに、この部分で40時間ほど悩んでおります・゜・(ノД`;)・゜・ ======================================== sub mail_push { # サーバー、アカウント、パスワード、ポート、送信元アドレス、送信先アドレス、題名、本文、送るべきファイル1(空の場合は無視)、送るべきファイル2(空の場合は無視) my ( $mailhost, $mail_username, $mail_password, $mailport, $from_mail, $to_mail, $subject, $message, $file1, $file2 ) = @_; # 正しいメールの形なのか調べる if ( $to_mail eq '' ) { print "送り先のメールアドレスが空のようです\n"; # ERR } elsif ( $to_mail =~ /^([a-zA-Z0-9\.\-\/_]{1,})@([a-zA-Z0-9\.\-\/_]{1,})\.([a-zA-Z0-9\.\-\/_]{1,})$/ ) { # 実際に送る my $smtp = Net::SMTP->new($mailhost, Port => $mailport); $smtp->auth($mail_username, $mail_password); $smtp->mail($from_mail); $smtp->to($to_mail); $smtp->data(); my $mime = MIME::Entity->build( Type => 'multipart/related', From => $from_mail, To => $to_mail, Subject => $subject, Type => 'text/plain;charset="iso-2022-jp"', Data => $message, Encoding => "7bit"); # エラーがでてくる箇所 $mime->attach( Path   => 'c:/buromaga1.jpg', Type   => 'Application/octet-stream', Encoding => 'Base64',); $smtp->datasend($mime->stringify);# ERR $smtp->dataend();# ERR # SMTP終了 $smtp->quit; } else { print "送り先が正しいメールの形式ではありません\n"; # ERR } }

    • ベストアンサー
    • Perl

専門家に質問してみよう