ファイルを鍵付きzipにしてメールで送ってくれるプログラム

すごい日にちが経っちゃいましたね。
さて、表題の通りのプログラムがあったらいいなー、と仕事中に思い立ったもので、とりあえず作ってみました。
構想段階ではああしたい、こうしたい、というのがあったのですが、なかなか形にするのが難しくて困りますね。
現段階では以下の様な状態となっています。
ファイルのアップロード部分に関しては以下サイトを参照させていただきました。

HTML5のFile APIを使って、複数(の画像)ファイルをサーバにアップロードする方法。


但し、日本語ファイルは日本語のままアップしたかったので一部試行錯誤しながら修正しております。

<?php

define('FILE_PATH','./image/'); // 保存するパスを指定

if ( !empty($_FILES) ) {
    for ( $i=0; $i<count($_FILES["upfile"]["tmp_name"]); $i++ ) {
        if ( is_uploaded_file($_FILES["upfile"]["tmp_name"][$i]) ) {

            $name = $_FILES['upfile']['name'][$i];
            $tempFile = $_FILES['upfile']['tmp_name'][$i];

            // Validate the file type
            $fileTypes = array('jpg','jpeg','gif','png','sql','doc','docx','xls','xlsx','ppt','pptx','txt','pdf');   // File extensions
            $fileParts = pathinfo($_FILES['upfile']['name'][$i]);

            if ( preg_match("/\.jpg$/ui", $name) == true ) {
                    $ret = explode('.jpg', $name);
                } elseif ( preg_match("/\.jpeg$/ui", $name) == true ) {
                    $ret = explode('.jpeg', $name);
                } elseif ( preg_match("/\.gif$/ui", $name) == true ) {
                    $ret = explode('.gif', $name);
                } elseif ( preg_match("/\.png$/ui", $name) == true ) {
                    $ret = explode('.png', $name);
                } elseif ( preg_match("/\.JPG$/ui", $name) == true ) {
                    $ret = explode('.JPG', $name);
                } elseif ( preg_match("/\.GIF$/ui", $name) == true ) {
                    $ret = explode('.GIF', $name);
                } elseif ( preg_match("/\.PNG$/ui", $name) == true ) {
                    $ret = explode('.PNG', $name);
                } elseif ( preg_match("/\.JPEG$/ui", $name) == true ) {
                    $ret = explode('.JPEG', $name);
                } elseif ( preg_match("/\.doc$/ui", $name) == true ) {
                    $ret = explode('.doc', $name);
                } elseif ( preg_match("/\.docx$/ui", $name) == true ) {
                    $ret = explode('.docx', $name);
                } elseif ( preg_match("/\.xls$/ui", $name) == true ) {
                    $ret = explode('.xls', $name);
                } elseif ( preg_match("/\.xlsx$/ui", $name) == true ) {
                    $ret = explode('.xlsx', $name);
                } elseif ( preg_match("/\.ppt$/ui", $name) == true ) {
                    $ret = explode('.ppt', $name);
                } elseif ( preg_match("/\.pptx$/ui", $name) == true ) {
                    $ret = explode('.pptx', $name);
                } elseif ( preg_match("/\.txt$/ui", $name) == true ) {
                    $ret = explode('.txt', $name);
                } elseif ( preg_match("/\.TXT$/ui", $name) == true ) {
                    $ret = explode('.TXT', $name);
                } elseif ( preg_match("/\.pdf$/ui", $name) == true ) {
                    $ret = explode('.pdf', $name);
                }
                $saveFileName = $ret[0]; // 拡張子を除いたそのまま
            //}

            $saveFileName = FILE_PATH  . $saveFileName;

            if ( in_array($fileParts['extension'], $fileTypes) ) {

                if ( move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], $saveFileName . '.' . $fileParts['extension']) ) {
                    echo $_FILES["upfile"]["name"][$i] . " のアップロードに成功しました。<br />";
                } else {
                    echo "アップロードエラー";
                }

            } else {
              echo "アップロードの対象は画像ファイル(.jpg(jpeg)/.gif/.png)、テキストファイル(.txt)、ドキュメントファイル(.doc(docx)/.xls(xlsx)/.ppt(pptx))のみです。";
            }
$convmv = "convmv -r -f utf8 -t cp932 ". $saveFileName . '.' . $fileParts['extension'] ." --notest";
exec($convmv);
        }
    }
}

// ここから圧縮パスワード生成
// 生成する文字数
$length = 10;
 
// 使用する文字
$char = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 
$charlen = mb_strlen($char);
$passwd = "";
 
for($i=1;$i<=$length;$i++){
  $index = mt_rand(0, $charlen - 1);
  $passwd .= mb_substr($char, $index, 1);
}
// パスワード生成ここまで
 
// zipファイル名
$fileName = uniqid("file_");
// 圧縮対象フォルダ
$compressDir = "/var/www/html/compress/image/";
// 削除対象
$delDir = "/var/www/html/compress/image/*";
// zipファイル保存先
$zipFileSavePath = "/var/www/html/compress/zip/";
// zipファイル格納URL
$URL = "https://hogehoge.jp/compress/zip/";

// 実行するコマンド
$command =  "cd ". $compressDir .";".
        //"zip -r ". $zipFileSavePath . $fileName .".zip .";
        "zip -P " . $passwd . " -r ". $zipFileSavePath . $fileName .".zip .";

// Linuxコマンドの実行
exec($command);

system("rm -f {$delDir}");

echo "<br \>";
echo "<a href=\"./index.php\">戻る</a>";

//相手へのメール送信
mb_language("ja");
mb_internal_encoding("UTF-8");
$message = $_POST['iname']." 様\n\n".$_POST['message'] ."\n". "\nダウンロードURLは以下の通りです。\n$URL$fileName.zip\n※解凍パスワードは別送されます。\n\nファイルは1週間で削除されます。\nお手数ですが期限までにダウンロードくださいますよう、お願い申し上げます。";
$subject = $_POST['subject'];
$to1 = $_POST['imail'];
$from = $_POST['mname'];
$honbun = $_POST['message'];

mail(
    $to1,
    mb_encode_mimeheader($subject, 'ISO-2022-JP-MS'),
    mb_convert_encoding($message, 'ISO-2022-JP-MS'),
    "From: " . mb_encode_mimeheader (mb_convert_encoding ($from, 'ISO-2022-JP-MS','AUTO'))."<".$_POST['mmail'].">"
);

//相手へのメール送信(解凍パスワード通知)
mb_language("ja");
mb_internal_encoding("UTF-8");
$message2 = $_POST['iname']." 様\n\n先ほど送信いたしましたZIPファイルの解凍パスワードは以下の通りです。\n" .$passwd;
$subject2 = $_POST['subject'] ."【解凍パスワード通知】";
$to2 = $_POST['imail'];

mail(
    $to2,
    mb_encode_mimeheader($subject2, 'ISO-2022-JP-MS'),
    mb_convert_encoding($message2, 'ISO-2022-JP-MS'),
    //"From: " . $_POST['mmail']
    "From: " . mb_encode_mimeheader (mb_convert_encoding ($from, 'ISO-2022-JP-MS','AUTO'))."<".$_POST['mmail'].">"
);

//送信控え
mb_language("ja");
mb_internal_encoding("UTF-8");
$message3 = "ファイルURL:$URL$fileName.zip\nパスワード:$passwd\nメール本文:$honbun";
$subject3 = "添付ファイルメール送信控え";
$to3 = $_POST['mmail'];

mail(
    $to3,
    mb_encode_mimeheader($subject3, 'ISO-2022-JP-MS'),
    mb_convert_encoding($message3, 'ISO-2022-JP-MS'),
    //"From: " . $_POST['mmail']
    "From: " . mb_encode_mimeheader (mb_convert_encoding ($from, 'ISO-2022-JP-MS','AUTO'))."<".$_POST['mmail'].">"
);

?>

クソ長いですね(´・ω・`)
メール送信部分は別のphpとかにした方がいいのかな…。
とりあえずメールフォーム部分を適当にhtmlかなんかで作成して、このphpをform actionとかで読んでやれば動く…ハズです。

※注意書きとして、Linuxサーバーでconvmvコマンドが動くことが前提となっています。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)