Pythonを使ってGmailからメールしたい。

みなさんお久しぶりです。
また少しずつですが、投稿を始めようと思います。

#今回のお題
###Pythonでgmailにログインして、メールを送る事です。

## 参考
[〜PythonでGmailを利用したメール送信〜](https://qiita.com/nakasuke_/items/607cf74d8841f76e59c6)


## メールを送る上での流れ
### MIMEを作成して送信する
めちゃくちゃ簡単ですね。

上の流れを分解すると必要なのは３段階。
1. MIMETextクラスを使ってメッセージを作成
2. gmailにログイン、そして送信


# 1. MIMETextクラスを使ってメッセージを作成
```python:create_msg.py
from email.mime.text import MIMEText


def create_msg(from_email, to_email):
    # メールの内容
    subject = "今日のTodo"
    message = '''
        <ul>
            <li>MINETextについて</li>
            <li>SMTPについて</li>
            <li>Web技術の本</li>
            <li>MVCモデルについて</li>
        </ul>
    '''
    # 解説１
    msg = MIMEText(message, "html")
    msg["Subject"] = subject
    msg["To"] = to_email
    msg["From"] = from_email

    return msg
```

## 解説
### 解説１
***class email.mime.text.MIMEText(_text, _subtype='plain', _charset=None, *, policy=compat32)***
これがMINETextのクラスの引数です。
今回は"_text"と"_subtype"を設定しています。
"_text"には今回送りたいmessageに設定してあり、表示はHTML形式にしたいので"html"を"_subtype"に渡しています。

その後、このMIMETextクラスに件名、送り先、送り元を渡しています。
これで送るためのメッセージ作成は完了しました。


## 参照
[email.mine: メールと MIME オブジェクトを一から作成](https://docs.python.org/ja/3.6/library/email.mime.html)

## 2. gmailにログイン
```python:gmail.py
    # 解説１
    gmail = smtplib.SMTP("smtp.gmail.com", 587)
    # 認証に失敗した時に確認出来る用
    gmail.set_debuglevel(True)
    
    gmail.ehlo()
    if gmail.has_extn('STARTTLS'):
        # 暗号化通信に切り替える
        gmail.starttls()
    gmail.ehlo()
    # 解説２
    gmail.login(from_email, from_password)
    # メールを送信
    gmail.send_message(msg)
```

## 解説
### 解説１
まず、SMTPは
***class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)***
で書かれます。
[SMTP プロトコルクライアント](https://docs.python.org/ja/3.6/library/smtplib.html)

今回はgmailを使うので、
host='smtp.gmail.com'
port=587
としました。
これらがどこから出てきたかは、下記のGoogleヘルプを参照してください。
<img width="824" alt="スクリーンショット 2020-03-17 11.47.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/5fc36253-5c0f-3066-5b18-8c5ca10ac868.png">
[Google ヘルプ](https://support.google.com/mail/answer/7126229?hl=ja)


### 解説２
次にログインをします。
gmail.login(from_email, from_password)でログインできます。
from_emailはあなたのメールアドレスを入れて、
from_passwordはあなたのgmailのパスワードを入力してください。
ここで一つ落とし穴があります。

Gmailは接続元IPアドレスをDNS逆引きしてドメインが見つからない場合は接続を拒否するため、デフォルトではローカルのPythonからメールを送信することができません。このため、予めアカウント設定から**「安全性の低いアプリからのアカウントへのアクセスを許可する」**をONにする必要があります。これはセキュリティ上の危険をはらむため、別途学習用のアカウントを作成することをおすすめします。

### 設定方法
[Google アカウント](https://myaccount.google.com/)から「セキュリティ」に入って、安全性の低いアプリのアクセスを有効にします。

またホストやポート番号はプロバイダーによって異なります。

| プロバイダー      |      STMPサーバー名|
|:-----------------:|:------------------:|
| Gmail |smtp.gmail.com|
| Outlook.com/Hotmail.com |smtp-mail.outllok.com|
| Yahoo Mail| smtp.mail.yahoo.com|
| AT&T |smtp.mail.att.net(port = 465)|
| Comcast | smtp.comcast.net|
| Verizon |smtp.verizon.net(port = 465)|

## 全体のソースコード
```python:main.py
from email.mime.text import MIMEText
import smtplib


def send_email(email):
    # あなたのアカウント
    from_email="あなたのGmailのアドレス"
    from_password="Gmailにログインするためのパスワード"

    # 送り先
    to_email = email

    # メッセージを作成
    msg = create_msg(from_email, to_email)

    gmail = smtplib.SMTP("smtp.gmail.com", 587)
    # 認証に失敗した時に確認出来る用
    gmail.set_debuglevel(True)
    
    gmail.ehlo()
    if gmail.has_extn('STARTTLS'):
        # 暗号化通信に切り替える
        gmail.starttls()
    gmail.ehlo()
    # 解説２
    gmail.login(from_email, from_password)
    # メールを送信
    gmail.send_message(msg)


def create_msg(from_email, to_email):
    # メールの内容
    subject = "今日のTodo"
    message = '''
        <ul>
            <li>MINETextについて</li>
            <li>SMTPについて</li>
            <li>Web技術の本</li>
            <li>MVCモデルについて</li>
        </ul>
    '''
    # 解説１
    msg = MIMEText(message, "html")
    msg["Subject"] = subject
    msg["To"] = to_email
    msg["From"] = from_email

    return msg


if __name__ == '__main__':
    to_addr = '送りたい人のメールアドレス'
    send_email(to_addr)
```




##参考資料一覧
[プログラムからGmailでmailを送ろうとした時に陥ったエラー](http://emoson.hateblo.jp/entry/2014/10/23/124725)
[email.mine: メールと MIME オブジェクトを一から作成](https://docs.python.org/ja/3.6/library/email.mime.html)
[SMTP プロトコルクライアント](https://docs.python.org/ja/3.6/library/smtplib.html)
[Google ヘルプ](https://support.google.com/mail/answer/7126229?hl=ja)