Pythonでメールを送信（Outlook）

# はじめに
Python で Email を送るプログラムを一から順に説明しながら追っていきたいと思います。

環境は Mac で PyCharm を使用しています。
ホットメールは Outlook を使用します。

## import

まず`email`から`message`というものがあるのでそちらと`smtplib`を import します。
`smtplib`は smtp サーバをー使用してメール送るものとなっています。

```.py
from email import message
import smtplib
```

## 設定

メールを送信する際の設定に関して記述していきます。

メールを送るサーバーを指定します。
ホットメールで`smtp.live.com`というものが存在するので、ホストに指定します。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
```

次にポートを記述します。
今回は`587`を使用します。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
```

メールの送信元のアドレスを記述します。
メールアドレスは`xxxx@outlook.jp`としていますが自分のメールアドレスを記述すれば大丈夫です。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
```

送信元が完了したら送信先のアドレスも`to_email`として記述します。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
```

次に`username`を記述します。
こちらはホットメールのアカウントのユーザーネームなのでメールアドレスがそのまま記述されると思います。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
```

最後にアカウントのパスワードを記述します。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'
```

上記の内容でメールを誰から誰に送るかの設定とホットメールにログインするための情報が記述できました。

## メッセージ
メッセージを作成します。

先ほど import してきた`message`の中に`EmailMessage()`というオブジェクトがあるので使用します。

```.py
from email import message
import smtplib

smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

msg = message.EmailMessage()
```

メッセージ内容を記述していきます。
`set_content()`を使用して`()`内にメールの本文を打ちます。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

msg = message.EmailMessage()
msg.set_content('こんにちは')
```

メールの件名と送信元、送信先を記述します。

件名は`Subject`、送信元は`From`、送信先は`To`になります。
送信元、送信先に関しては先ほど記述した`from_email`と`to_email`の変数を使用します。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email
```

# サーバーの設定

上記で記述したメッセージをサーバーに送るための設定を記述していきます。

サーバーの指定に import してきた`smtplib`の`SMTP`クラスを使用します。
`smtplib.SMTP()`とし`()`の中にホストとポートを入れます。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

server = smtplib.SMTP(smtp_host, smtp_port)
```

smtp とのコネクションの手順として、まず`server.ehlo()`でsmtpサーバーと
今からやりとりしますよと呼んであげます。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
```

セキュアにするために`server.starttls()`と記述した後に
もう一度`server.ehlo()`とします。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
server.starttls()
server.ehlo()
```

次にホットメールでログインするための情報が聞かれるので
`server.login()`を使用して`()`の中に`username`と`password`を記述します。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
```

ログインできたら`send_message()`を使用して`()`の中に作成したメッセージ内容を入れます。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
server.send_message(msg)
```

一番最後にもうサーバーとやりとりしないので終了させるために`server.quit()`とします。

```.py
from email import message
import smtplib

# メールの設定
smtp_host = 'smtp.live.com'
smtp_port = 587
from_email = 'xxxx@outlook.jp'
to_email = 'xxxx@outlook.jp'
username = 'xxxx@outlook.jp'
password = 'xxxxxxxxxxxx'

#メッセージ内容
msg = message.EmailMessage()
msg.set_content('こんにちは')
msg['Subject'] = 'Test email'
msg['From'] = from_email
msg['To'] = to_email

# サーバーとのやりとり
server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
server.send_message(msg)
server.quit()
```

## 実行

上記の内容でメールを自分宛にして
実行してみると実際にメールが送信されたことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/4df75574-02a9-35ef-9935-fd2cc558f5f2.png)


# 最後に

このメール送信してくれるプログラムを他のプログラムと紐づけて
いろんなことができたらと思います。