2011年8月21日日曜日

Uber-Uploader 6.8.2 の使い方(その3)

追記)2017/6に,FreeBSD で fine-uploader を使ってみた(その1)というのを書いた。 そこでは fine-uploader という JavaScript のライブラリを使ったファイルのアップローダーについて書いている。 Uber Uploader はすでに古く更新されていないので,fine-uploader など新しいアップロードライブラリを使うことをお薦めする。
追記)メール送信のスクリプトで,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.phpubr_finished_lib.php をアレンジする。

(3) ubr_finished.phpubr_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.pmNet::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 件のコメント: