Pythonでメールを送信

#Pythonでメールを送信しよう
　今回から５回にわたってPythonでAmazonの商品の価格を監視し，値下げを検出したら通知するシステムを作成します．今回は第１回ということでまずはメールを送信してみます．
　使う環境はPython3.7です．Pycharmの仮想環境で実行しました．使用するライブラリはsmtplib，emailです．smtplibでメールサーバへの接続や送信の処理を行います．emailを用いてメールの本文を作成します．

##Gmailにログインしよう
　早速Gmailにログインしてみましょう．Pythonのコンソールに次のよう入力してください．

```python:gmail_login.py
import smtplib
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(MAIL_ADDRESS, PASSWORD)
```

　今回はGmailを利用するので('smtp.gmail.com', 587)でSMTPオブジェクトを作成します．ログインの際にはMAIL_ADDRESSをログインするメールアドレスに，PASSWORDをそのアカウントのパスワードに変更してください．
　Gmailは初期設定の状態では安全性の低いアプリからのアカウントへのアクセスを拒否します．残念ながらPythonは安全性の低いアプリと判断されるため，Pythonからログインするためにはそのアクセスを許可する必要があります．アクセスを許可する手順はGmailアカウントのヘルプに記載されていますので[こちら](https://support.google.com/accounts/answer/6010255)を参考に安全性の低いアプリからのアカウントへのアクセスを許可してください．
 ログインに成功すると次のように表示されます．

```python:gmail_login.py
(235, b'2.7.0 Accepted')
```

##メール本文を作成しよう
　メールを送信するためにメッセージを作成します．メッセージの作成にはemailを使用します．書き方は次の通りです．

```python:create_message.py
from email.mime.text import MIMEText
from email.utils import formatdate
msg = MIMEText(body_msg)
msg['Subject'] = subject
msg['From'] = from_address
msg['To'] = to_address
msg['Date'] = formatdate()
```

　emailライブラリのうち，MIMETextとformatdateのみ使用するため，fromを使用してこれら2つのみimportします．fromを使用すると名前空間が衝突する可能性があるため大規模な開発では避けましょう．今回のような遊び程度の開発でしたら問題ありません．
　MIMETextを使用してメッセージを作成します．MIMETextに与える引数はメールの本文です．本文以外の情報はキーワード引数を用いて設定します．件名は'Subject'，送信元メールアドレスは'From'，宛先メールアドレスは'To'，そして日付は'Date'に代入します．日付の記述方法は特殊ですので，formatdate()を使用します．
　例えば次のように入力してみます．

```python:create_message.py
from email.mime.text import MIMEText
from email.utils import formatdate
msg = MIMEText('body message')
msg['Subject'] = 'subject'
msg['From'] = 'from_addr@gmail.com'
msg['To'] = 'to_addr@gmail.com'
msg['Date'] = formatdate()
print(masg)
```

すると次のように表示されます．

```python:create_message.py
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Subject
From: from_addr@gmail.com
To: to_addr@gmail.com
Date: Wed, 02 Jan 2019 17:44:55 -0000
body message
```

このように簡単にメール本文を作成することができました．

##メールを送信しよう
　ここまで出来ればすぐにメールを送信することができます．先ほどまでの手順に沿ってGmailにログインします．そして，メッセージを作成し，msgに代入しておきます．この状態で次のようにコマンドを入力するとメールを送信することができます．

```python:send_message.py
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
smtpobj.close()
```

　sendmailメソッドを用いてメールを送信することができます．引数には送信元メールアドレスと宛先メールアドレス，メッセージの文字列を与えます．これでメールを送信することができます．試しに自分宛てにメールを送信してみてください．処理を終えたら最後にsmtpobj.close()を実行するようにしましょう．

##まとめ
　Pythonでメールを送信することができました．これで通知を送りたいときにメールを使うことができます．今回の内容を次のように関数化しておくといつか役に立つかもしれません．

```python:functions.py
def create_message(from_addr, to_addr, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg


def send_mail(from_addr, to_addr, body_msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addr, body_msg.as_string())
    smtpobj.close()
```
では今回はこれで終わります．[次回](https://qiita.com/kawa-Kotaro/items/9933f56abd53a09826d9)はSQLiteを使って簡単なデータベース管理を行います．
ここまで読んでいただきありがとうございました．