質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.33%

  • Linux

    2711questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • SQL

    1699questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

指定の日にちの3日前にメールを送信する方法

解決済

回答 2

投稿 2017/11/28 19:10 ・編集 2017/11/28 21:58

  • 評価
  • クリップ 0
  • VIEW 118

s_ayana

score 3

お知らせメールを定期的に3日前に送れるようなアルゴリズムを教えて欲しいです。

例えばMYSQLにある12月1日に完成させなくてはならないマスタを3日前になっても完成しないとメールを自動送信するプログラムをshellで書きたいです。
ちなみに何日前のプログラムはprofileを読み込んで実行したいです。

ちなみにshellはcentos6.4です。

大変分かりづらいと思うのですが、分かる方ご回答お願いします。

書いたshell script

sendmail.sh

!/bin/sh

sum_date=date -d "-3 days" +%Y-%m-%d
sum_date_from="$sum_date 00:00:00"
sum_date_to="$sum_date 
dir=dirname $0
for sql_file in ls $dir/*.sql
do

sql=cat $sql_file | sed -e "s/SUM_DATE_FROM/$sum_date_from/" | sed -e "s/SUM_DATE_TO/$sum_date_to/"

result=mysql -h mysql_host -u mysql_user -pmysql_password -D database_name --default-character-set utf8 -e"$sql" 2>/dev/null

content="$content\n\n$result"
done

echo -e "$content" | mail -s "Subject $sum_date" "hoge@hoge.com"

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2017/11/28 19:36 編集

    このままだと 丸投げと判断されて回答がつかないと思います。途中までのプログラムでも構いませんので、自分が試した内容を質問に追記してください。  あと、centos6.4は、OS なので、shell は、bash でしょうか?

    キャンセル

  • miyabi-sun

    2017/11/28 19:54

    「cronなど試してもうまくいかなかったです」と言われても、cron等しか選択肢が無いから頑張ってとしか言えない……

    キャンセル

  • otn

    2017/11/28 21:43

    https://teratail.com/help/question-tips#questionTips3-5 の、「ソースコードを書きましょう」をよく読んでその通りにしてください。

    キャンセル

  • 退会済みユーザー

    2017/11/28 22:00

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

0

やりたいの内容をシンプルに考えると「プログラムを実行した時点で、MySQLに登録されているデータから3日後の日付のデータを選択してメールで送信する」という内容でしょうか。


TABLE_NAME テーブルの limit_at カラムに 期限が入っているとして、以下の SQL で 3日後の 00:00 以上 4日後の 00:00 未満に期限を迎えるデータを選択できます。

select * from TABLE_NAME where limit_at between ADDDATE( CURRENT_DATE() , interval '3' DAY ) and ADDDATE( CURRENT_DATE() , interval '4' DAY )

この SQL を bash で、実行して、結果を user@example.com にメールするという最低限の内容だとこんな感じのシェルスクリプトでしょうか。
( MYSQL_HOST = MySQL のホスト、MYSQL_ID = MySQLのユーザID 、 MYSQL_PWD = MySQLのパスワード 、DATABASE_NAME = MySQLのデータベース名 で、置き換えてください。)

#!/bin/sh

content=`mysql -h MYSQL_HOST -u MYSQL_ID --password=MYSQL_PWD --database=DATABASE_NAME -e "select * from TABLE_NAME where limit_at between ADDDATE( CURRENT_DATE() , interval '3' DAY ) and ADDDATE( CURRENT_DATE() , interval '4' DAY )" 2>&1`

echo "$content" | mail -s "Reminder" "user@example.com"

これを ファイル名をつけて保存して cron で、毎日 0:01 に実行するように設定して、実行するということで、どうでしょうか。

1 0 * * * /usr/bin/bash /保存したディレクトリ/ファイル名.sh

投稿 2017/11/28 23:16

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 23:50

    とりあえず試してみます。
    分かりづらいのにありがとうございます。

    キャンセル

0

具体的に何をしたいのかわからないので、方針だけ。

メールを指定した日にちの3日前に送れるようなアルゴリズムを教えて欲しいです。 

その3日前の日付を求めて、その日にメールを送るようにします。
動的にcrontabに行を追加してもいいし、cronから毎日起動するようにして、その日付かどうかをチェックしてその日になったらメールするようにしても良いし。

投稿 2017/11/28 21:48

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.33%

関連した質問

同じタグがついた質問を見る

  • Linux

    2711questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • SQL

    1699questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。