3
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-17

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

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

参考

〜PythonでGmailを利用したメール送信〜

メールを送る上での流れ

MIMEを作成して送信する

めちゃくちゃ簡単ですね。

上の流れを分解すると必要なのは3段階。

  1. MIMETextクラスを使ってメッセージを作成
  2. gmailにログイン、そして送信

1. MIMETextクラスを使ってメッセージを作成

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>
    '''
    # 解説1
    msg = MIMEText(message, "html")
    msg["Subject"] = subject
    msg["To"] = to_email
    msg["From"] = from_email

    return msg

解説

解説1

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

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

参照

email.mine: メールと MIME オブジェクトを一から作成

2. gmailにログイン

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

解説

解説1

まず、SMTPは
class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)
で書かれます。
SMTP プロトコルクライアント

今回はgmailを使うので、
host='smtp.gmail.com'
port=587
としました。
これらがどこから出てきたかは、下記のGoogleヘルプを参照してください。
スクリーンショット 2020-03-17 11.47.29.png
Google ヘルプ

解説2

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

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

設定方法

Google アカウントから「セキュリティ」に入って、安全性の低いアプリのアクセスを有効にします。

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

プロバイダー 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)

全体のソースコード

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()
    # 解説2
    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>
    '''
    # 解説1
    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を送ろうとした時に陥ったエラー
email.mine: メールと MIME オブジェクトを一から作成
SMTP プロトコルクライアント
Google ヘルプ

3
8
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?