python アプリ開発

Pythonでgmailを使って自動でメールを送信する!

こんにちは、こちょすです!

今回はPythonを使ってgmailで自動でメールを送る方法をご紹介します!

Pythonにはメールを送信するためのライブラリとしてsmtplibというライブラリがありますので、今回はそれを使います。

 

自分で書いたPythonコードの処理結果をメールで誰かに送りたいとか、時でメール送信したいということが多々あると思いますので、ぜひマスターしてくださいね!

 

以前にご紹介した、awsの自動実行と組み合わせれば毎日自動でメールを送る仕組みも簡単に作れますのでぜひこちらの記事もごご覧ください!

4ステップで簡単にすぐにtweetbotを動かせる!AWS Lambdaの使い方

続きを見る

 

 

こんな方におすすめ

  • Pythonでメールを送ってみたい
  • 日々の定時送信メールを自動化したい
  • メールでPythonの処理結果を受信したい

 

それでは今回も頑張っていきましょー!

 

まずは早速サンプルコード!

早速ですがサンプルコードを出します!

 
import smtplib

smtp_host = 'smtp.gmail.com'
smtp_port = 465
username = 'XXXXXXXX@gmail.com'
password = 'YYYYYYYYYY'
from_address = 'XXXXXXXX@gmail.com'
to_address = 'ZZZZZZZZ@gmai.com'
subject = 'subject_test'
body = 'test'
message = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s" %
           (from_address, to_address, subject, body))

smtp = smtplib.SMTP_SSL(smtp_host, smtp_port)
smtp.login(username, password)
result = smtp.sendmail(from_address, to_address, message)
print(result)


 

 

 

gmail側の設定

上のコードをさっそく実行してみても、以下のようなエラーが出て、メールを送信できません

 

 command
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials z17sm17855101pfq.38 - gsmtp')

 

なぜならgmailに普通にログインするときのパスワードでは実行できないようにGoogleさんがセキュリティ対策しているからです。

 

というわけでメール側の設定をしましょう!といっても簡単です!

 

gmailにログイン

まずはgmailにログインし、右上の自分のアイコンマークをクリックしましょう!

 

すると、ポップアップのメニューが出てくるので、「Googleアカウントを管理」をクリックします。

 

遷移先のページで、左のメニューから「セキュリティ」から、「2段階認証プロセス」をクリックします。

 

 

「アプリパスワード」の生成

二段階認証の設定ができたらアプリパスワードの生成をしていきます。

ここで生成したパスワードを利用することで、gmailは認証済みのアプリケーションであると認識し、
冒頭で最初に発生したエラーを投げなくなります

 

最後に利用するデバイスが聞かれますが、パソコンで実行する方はMacを、スマホで実行する方はiPhoneを選択すればOKです!

あとは上のサンプルコードにここで生成された16桁の文字コードをコピーペーストしましょう!

 

 

エンコーディングについて

英語のみの文章を送るだけならサンプルコードで十分ですが、日本語を含むメールも送りたい方が多いと思います。

 

サンプルコードの文字を日本語に変えて実行してみてください。以下のようなエラーが出るはずです。(カッコ内の数字は行数なので、人それぞれで異なるのであまり気にしないでくださいね!)

 

 command
msg = _fix_eols(msg).encode('ascii')UnicodeEncodeError: 'ascii' codec can't encode characters in position 79-81: ordinal not in range(128)

 

これを解決する方法はいくつかありますが、今回はMIMEtextというメソッドを使います!

 

MIMEというのは、Multipurpose Internet Mail Extensionを省略したもののことです。

規格上US-ASCIIのテキストしか使用できないインターネットの電子メールでさまざまなフォーマットを扱えるようにする規格です。

つまりこのフォーマットに変換してあげることで日本語も扱うことができるようになります

 

というわけで、最後にMIMEtextを使って日本語を送信するためのサンプルコードを載せておきます!

 

from email.mime.text import MIMEText
from smtplib import SMTPException
import smtplib
from email.header import Header

cset = 'utf-8'
username = 'XXXXXXXXgmail.com'
password = 'xxxxxabcdeqwerty'
from_address = 'XXXXXXXXgmail.com'
to_address = YYYYYYYgmail.com'
title = u'メールタイトル'
body = u'メール本文'
con = smtplib.SMTP_SSL('smtp.gmail.com', 465)  # FQDN とポート番号
con.login(username, password)

con.set_debuglevel(True)

cset = 'utf-8'  

message = MIMEText(body, 'plain', cset)
message['Subject'] = Header(title, cset)
message['From'] = from_address
message['To'] = to_address

con.sendmail(from_address, [to_address],
             message.as_string())

con.close()


 

 

まとめ

Pythonでメールを送るためには以下の2点を気をつけてみてください!

 

Pythonでメールを送るときのポイント

  • メーラー側の設定が必要
  • 日本語を送りたい場合はMIMETextを使う

 

いかかがでしたか??ぜひメール送信処理をマスターして応用してみてくださいね!

 

-python, アプリ開発

© 2022 これブロ