(追記)メール送信のスクリプトで,Net::SMTP::TLS を使うのは非推奨なので,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うルーチンに変更しておいた。(2016/11/9)
この記事はUber-Uploader 6.8.2 の使い方(その2)からの続きです。
Uber-Uploader 6.8.2 の使い方(その1)
Uber-Uploader 6.8.2 の使い方(その2)
Uber-Uploader 6.8.2 の使い方(その4)
今回は ubr_finished.php と ubr_finished_lib.php をアレンジする。
(3) ubr_finished.php と ubr_finished_lib.php のアレンジ
ファイルのアップロードが完了すると,ubr_finished.php に処理が渡される。この ubr_finished.php は,ライブラリとして ubr_finished_lib.php を利用する。ubr_finished.php では,アップロードされたファイルの一覧表示が出たり,アップロードされたファイルへのリンクを表示と指定しておくと(ubr_default_config.php の中),一覧からファイルへのリンクが貼られたりする。また,メール発送を指定しておくと,指定されたアドレス宛にメールが発送される。
(3-a) config ファイルの読み込み
ubr_finished.php のオリジナルの51行付近(header('Pragma: no-cache'); の直後)に,
require $_INI['default_config'];として config ファイルを読み込ませておくと便利。
(3-b) アップロードパラメータの処理
ubr_finished.php のオリジナルの107行付近にある「// if(isset($_POST_DATA['client_id'])){ do something; }」の下に,
以下のようなルーチンを置いて,入力パラメーターを表示用に変数に入れておく。これらの値は後で用いる。
$in_name=$_POST_DATA['OWNER']; $in_email=$_POST_DATA['EMAIL']; $in_comment=$_POST_DATA['COMMENT']; $in_comment = str_replace("¥r¥n","<br>",$in_comment); $in_comment = str_replace("¥r","<br>",$in_comment); $in_comment = str_replace("¥n","<br>",$in_comment);
(3-c) 終わりの処理(ubr_finished.php のweb 本体)の表示
ubr_finished.php の web 本体は,オリジナルの151行目にある <body> の下に書く。
私の例では,以下のように書いてある(ここでも body の設定は css ファイルに書いてある)。
<body class="yellow"> <div id="main_container"> <br clear="all"/> アップロードありがとうございます。<br> ---------------------------------------<br> <?php if($in_name){ print '名前:'.$in_name."<br>"; } ?> <?php if($in_email){ print ' メール:'.$in_email."<br>"; } ?> <?php if($in_comment){ print 'コメント:'.$in_comment."<br>"; } ?> ---------------------------------------<br> あなたがアップロードした下記のファイルは有効に活用したいと思います。<br> ありがとうございました。<br> <br> 管理人<br><br> <div id="upload_results_container"> <?php print $_FORMATTED_UPLOAD_RESULTS; ?> </div> <br clear="all"/> <?php if(!$_INI['embedded_upload_results']){ ?> <br> <a href="./"><?php print $_CONFIG['my_title_jap']; ?>のページに戻る</a><br> <?php } ?> </div> <br clear="all"/> </body>
(3-d) ubr_finished_lib.php のメール送信ルーチン
ubr_finished_lib.php では,設定によっては,アップロード終了後にメール送信してくれる。
そのルーチンは ubr_finished_lib.php のオリジナルの266行から始まる emailUploadResults ルーチンである。
しかし,そのルーチンは,サブミッションポートなどに対応してなさそうに見えたので,自分で Perl のスクリプトを書いて,そちらに処理を投げることにした。そのため,ubr_finished_lib.php でもメール送信ルーチンを全面的に書きなおしている。
function emailUploadResults($_FILE_DATA, $_CONFIG_DATA, $_POST_DATA){ $_FILE_DATA_EMAIL = getFileDataEmail($_FILE_DATA, $_CONFIG_DATA, $_POST_DATA); $coms='./mail_smtp_587.pl "'.$_CONFIG_DATA['to_email_address'].'" "'.$_CONFIG_DATA['email_subject'].'" "'; $coms=$coms.$_FILE_DATA_EMAIL.'" "'.$_CONFIG_DATA['start_upload'].'" "'.$_CONFIG_DATA['end_upload'].'" "'; $coms=$coms.$_CONFIG_DATA['remote_addr'].'" "'.$_CONFIG_DATA['http_user_agent'].'"'; $in_comment = $_POST_DATA['COMMENT']; $in_comment = str_replace("¥r¥n","¥n",$in_comment); $in_comment = str_replace("¥r","¥n",$in_comment); $coms=$coms.' "'.$_POST_DATA['OWNER'].'" "'.$_POST_DATA['EMAIL'].'" "'.$in_comment.'"'; // print $coms."¥n"; shell_exec($coms); }ここで,mail_smtp_587.pl というのが別途用意した Perl のスクリプトである。mail_smtp_587.pl では,引数として,宛先,タイトル,ファイルデータ,開始時刻,終了時刻,ホストIP,ブラウザの User Agent,送信者名,送信者メールアドレス,コメント,を持つ。また,サブミッションポート 587 番を使ってのメール送信ができるようにしている。
(3-e) mail_smtp_587.pl スクリプト
以下に mail_smtp_587.pl を載せておこう。当然,パーミッションは www が実行可能でないといけない。また,Jcode.pm と Net::SMTP::TLS という2つの Perl 用のモジュールが必要である。
(追記)メール送信のスクリプトで,Net::SMTP::TLS を使うのは非推奨なので,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うルーチンに変更しておいた。(2016/11/9)
#! /usr/local/bin/perl use Jcode; use Net::SMTP; use IO::Socket::SSL; use Authen::SASL; my $mailhost = 'smtp.server.xxx.com'; my $mailport = 587; my $mail_username = 'punipuni%xxx.com'; my $mail_password = 'kerokerokero'; my $from_mail = 'punipuni@xxx.com'; my $to_mail = $ARGV[0]; my $subject = $ARGV[1]; my $FILE_DATA_EMAIL = $ARGV[2]; my $starttime = &GetDateStr($ARGV[3]).' '.&GetTimeStr($ARGV[3]); my $endtime = &GetDateStr($ARGV[4]).' '.&GetTimeStr($ARGV[4]); my $remoteIP = $ARGV[5]; my $Browser = $ARGV[6]; my $sendername = $ARGV[7]; my $senderemail = $ARGV[8]; my $in_comment = $ARGV[9]; $hostname = &get_hostname($remoteIP); # アップロード者のhostnameを取得 $message = 'Uber_Uploaderサイトにファイルがアップロードされました。'."¥n"; if ($FILE_DATA_EMAIL =~ /^(File.Name:.*)¥s+(File.Size:.*)$/) { $filename = $1; $filesize = $2; } $message .= $filename."¥n"; $message .= $filesize."¥n"; $message .= "Start Upload: ".$starttime."¥n"; $message .= "End Upload: ".$endtime."¥n"; $message .= "Remote IP: " .$remoteIP.' ('.$hostname.")¥n"; $message .= "Browser: " .$Browser."¥n"; $message .= "Name: " .$sendername."¥n"; $message .= "e-mail: " .$senderemail."¥n"; $message .= "Comment: " .$in_comment."¥n"; Jcode::convert($message,"jis","utf8"); # ========================================================= # start SMTP routine my $smtp = Net::SMTP->new( $mailhost, Hello => 'hippo.matsup.mydns.jp', Port => $mailport ); die "Error" unless $smtp; # ---------------------------------------------------------- # TLS による認証 my $r = $smtp->starttls( SSL_version=>"TLSv12", SSL_verify_mode=>SSL_VERIFY_PEER, SSL_ocsp_mode=>SSL_OCSP_TRY_STAPLE, SSL_verifycn_name => $mailhost, # defaults to PeerHost SSL_verifycn_schema => 'smtp', SSL_hostname => $mailhost, # SNI support ); die "Error" unless $r; $r = $smtp->auth($mail_username, $mail_password); die "Error" unless $r; # ============================================================= # ヘッダー部用のアドレス。複数アドレスを念頭においているので,配列にしている。 my @mailto = split(',', $to_mail); my $header; $header = "From: ".jcode("$from_mail")->mime_encode."¥n"; $header .= "To: ".jcode("$to_mail")->mime_encode."¥n"; $header .= "Subject: ".jcode($subject)->mime_encode."¥n"; $header .= "MIME-Version: 1.0\n"; $header .= "Content-type: text/plain; charset=ISO-2022-JP\n"; $header .= "Content-Transfer-Encoding: 7bit\n\n"; $smtp->mail($from_mail); $smtp->to(@mailto); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; print "'".$to_mail."'宛に送信しました。¥n"; exit; #========================================== sub get_hostname { my ($ip_address) = @_; my (@addr) = split(/¥./, $ip_address); return $ip_address if @addr != 4; my ($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr(pack("C4", @addr), 2); return $name ? $name : $ip_address; } sub GetDateStr { my(@GTS_date_array) = @_; if ($GTS_date_array[1] eq '') { @GTS_date_array = localtime(time); } my($dum); $dum=($GTS_date_array[5]+1900)."/" .&ZeroPadding($GTS_date_array[4]+1)."/".&ZeroPadding($GTS_date_array[3]); return $dum; } sub GetTimeStr { my(@GTS_date_array) = @_; if ($GTS_date_array[1] eq '') { @GTS_date_array = localtime(time); } my($dum); $dum=&ZeroPadding($GTS_date_array[2]).":" .&ZeroPadding($GTS_date_array[1]).":".&ZeroPadding($GTS_date_array[0]); return $dum; } sub ZeroPadding { my($dum)=sprintf("%d",@_); $dum="00".$dum; $dum=substr($dum,(length($dum)-2)); return $dum; }ここで,以下の変数は各自の環境に合わせて書き換えるのを忘れずに。
my $mailhost = 'smtp.server.xxx.com'; (メールサーバーのアドレス) my $mailport = 587; (メールサーバーのポート番号) my $mail_username = 'punipuni%xxx.com'; (メールを送る時のアカウント名) my $mail_password = 'kerokerokero'; (メール送信のためのパスワード) my $from_mail = 'punipuni@xxx.com'; (メール送信元アドレス)
(次回に続く)
0 件のコメント:
コメントを投稿