LoginSignup
0
0

More than 5 years have passed since last update.

XREA シェルスクリプトでメールが送れないので、Cakephpで添付ファイル付けて送ってみた。

Last updated at Posted at 2018-03-28

前回書いたシェルスクリプトでバックアップでメールを送りたかったので、cakephp側からシェルスクリプトを起動させてメールで送ってやった。
添付にはMysqlのバックアップのみ送り、サイトのソースは重いのでダウンロード形式にした。

0.cakephp側にフォルダを作る
webroot以下に「downloads」フォルダをつくる。

1.シェルスクリプトを書き換え
1部分だけ変更、cakephp側にコピーを置くようにした。

backup.sh
#ソース保存 *public_html以下の特定フォルダだけの場合は後ろのパスを変える。
tar cvfz $TARFILE2 $PROGRAM --exclude downloads
#downloadsというフォルダを除外。cakephpにコピーした時に増えるので。

# ファイルのコピー
cp $TARFILE $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
cp $TARFILE2 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz

ファイル名には複数押した時でも上書きされるように日付は入れない。
html側で日付を入れてあげる。

2.cakephpのコントローラーにcakemailを
cakemailを使えるようにしてあげる。
んで、大事なコマンドはこれ

Controller/UsersController.php
// シェルスクリプト起動
shell_exec("sh ~/backup-mysql/backup.sh");

if(preg_match('/backup/', $_GET['mode'])){

    // シェルスクリプト起動
    shell_exec("sh ~/backup-mysql/backup.sh");

    $email = new CakeEmail('default');
    $email->from('example@example.xrea.com');
    $email->to('example@gmail.com');
    $email->subject(date('Ymd').'_example_データバックアップ');
    $body = '日次:'.date('Ymd').' / exampleサーバー(XREA)/ データバックアップが成功しました。';
    $body_error = '日次:'.date('Ymd').' / exampleサーバー(XREA)/ データバックアップが失敗しています。';

    //ファイルの添付
    $route = '/virtual/example/backup-mysql/';
    $route2 = $_SERVER['CONTEXT_DOCUMENT_ROOT'].'/example/app/webroot/downloads/';
    $sqlfilename = 'mysql.'.date("Ymd").'.tar.gz';
    $datafilename = 'source.'.date("Ymd").'.tar.gz';
    if(file_exists($route.$sqlfilename) && file_exists($route.$datafilename)){

      $email->attachments($route2.'mysql.tar.gz');

      //メール送信する
       $email->send($body);
       $download = array(['mysql.tar.gz', $sqlfilename, 'Mysqlバックアップ'], ['source.tar.gz', $datafilename, 'ソースバックアップ']);
      $this->set('success', $download);
    }else{
      $email->send($body_error);
      $this->Flash->error(__('ファイルエラーです。失敗しました。'));
    }

}

これでシェルが走る。
添付のやり方は前回ので。

3.後はViewを弄るだけ

View/Users/index.ctp
<div>
  <p class="btn"><a href="/example/users?mode=backup" onclick="return confirm('データをバックアップしてメールします。');"><button type="button" class="btn btn-outline-primary">全>データをバックアップする<i class="far fa-envelope"></i></button></a></p>

  <?php if(!empty($success)): ?>
    <?php foreach($success as $value): ?>
    <p class="btn"><a href="/example/downloads/<?php echo $value[0]; ?>" download="<?php echo $value[1]; ?>"><button type="button" class="btn btn-outline-primary"><?php echo $value[2]; ?><i class="far fa-arrow-alt-circle-down"></i></button></a></p>
    <?php endforeach; ?>
  <?php endif; ?>
</div>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0