LoginSignup
0
3

More than 5 years have passed since last update.

schedule, emailを使ってheroku上から定期的にgmailを飛ばす

Last updated at Posted at 2019-03-10

ほんとうに頭が悪く、短期記憶が4ミリ秒しかありません。
汎用性のない記事を石版に彫ります。
スケジューラはscheduleを使います。

herokuユーザ登録、heroku toolbeltのインストールは省略。
scheduleライブラリ入れよ。

$ pip install schedule

Googleアカウントのパスワードでログインしようとすると弾かれます。
怪しい自作アプリでもsmtpサーバを使わせてもらうため、Googleアカウントの設定からアプリパスワードというものを取得してきて下さい。
FROM_ADDRESSには自分のアドレスを、MY_PASSWORDにはアプリパスワードを設定します。

main.py
import smtplib
import schedule
import time
from email.mime.text import MIMEText
from email.utils import formatdate

    # ================================================================
    FROM_ADDRESS = 'MAIL'
    MY_PASSWORD = 'PWD'
    TO_ADDRESS = 'TO'
    BCC = 'BCC'
    SUBJECT = '件名'
    BODY = '本文'
    # ================================================================


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, my_pwd, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587) # gmail
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(from_addr, my_pwd)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


def job(): # 実行したい処理。
    msg = create_message(FROM_ADDRESS, TO_ADDRESS, BCC, SUBJECT, BODY)
    send(FROM_ADDRESS, TO_ADDRESS, MY_PASSWORD, msg)
    print('SENT=========>')


# コンフィグ。お昼の12時に一日一回送信。
# cronより覚えやすい。clockworkみたいだね。
schedule.every().day.at('12:00').do(job)

# 本体。コンフィグを読み出して実行してくださる。
while True: 
    schedule.run_pending()
    time.sleep(1)

git initheroku createより先に打っておくと自動でherokuがリモートリポジトリに登録される。

$ cd <APP_CURRENT_DIRECTORY>
git init
heroku login
heroku create

herokuに必要なファイルをいくつか作っておく。

$ pip freeze > requirements.txt
copy nul Procfile
copy nul runtime.txt

Procfileのtypeはworkerになる。
djangoみたいにwebだと起動しないね。調べないと。調べた。

web dyno
HTTPのリクエスト・レスポンスの処理。ユーザーからのリクエストは全部webが行うそう。

worker dyno
バックグラウンド処理。web dyno以外、APIsからのデータ取得やRSSフィード利用だそう。

そのあとは起動コマンド。

Procfile
worker: python main.py
runtime.txt
python-3.7.2

デプロイします。

$ git add --all
git status
git commit -m "Firstslap"
git status
git push heroku master

とりあえずこれで動くかな。エラったらすいません。
定期的に起こさないと寝ちゃうかも。止まってますね。何か対策しないと。

0
3
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
3