『退屈なことはPythonにやらせよう』18章 電子メールやSMSの送信のらくがき帳📝
こんにちは。aliceです。
ひきわり納豆が好きなので、スーパーにある全種類のひきわり納豆を買ってしまいました。
味の違いがわかる気がしません…。
今回はメールの送信です。
勝手にメールを送るのは怖いと思ったのですが、使い方によっては便利ですね。
本当にいろんなことができるんだなぁ。
前回のらくがき帳
では、以下らくがきです。
18章 英語版🔤
GitHub💖
18.1.2 Gmailアカウントからメールを送信する
この本の著者さんが作ったモジュール(EZGmail)を使ってメールを送信しました。
すごく簡単に送れたのですが、私の環境だとうまくいかない…。
import ezgmail
ezgmail.send('宛先メールアドレス', 'Subject', 'Message')
18.2 SMTP
SMTPを使ってメールを送信します。
SMTPは電子メールを送信するためのプロトコルです。
難しくて読んでもあまり理解できなかった🥲
ということで、ググってGmailのアプリパスワードを取得してメールを送ってみました。
ChatGPTに書いてもらったコードを読んで、なんとなく言いたかったことがわかりました。
パスワードはenvファイルに入れています。
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from dotenv import load_dotenv
# .envファイルを読み込む
load_dotenv()
def send_email(subject, body):
# GmailのSMTPサーバーとポート
smtp_server = 'smtp.gmail.com'
smtp_port = 587
# .envファイルから設定情報を取得
sender_email = os.getenv('SENDER_EMAIL') # 送信元のGmailアドレス
sender_password = os.getenv('SENDER_PASSWORD') # 送信元のGmailパスワードまたはアプリパスワード
receiver_email = os.getenv('RECEIVER_EMAIL') # 送信先のメールアドレス
# メッセージの作成
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = subject # メールの件名
# メッセージの本文を追加
message.attach(MIMEText(body, 'plain')) # プレーンテキストメッセージを添付
# SMTPサーバーに接続
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # TLS暗号化を有効にする
server.login(sender_email, sender_password) # Gmailアカウントにログイン
text = message.as_string()
server.sendmail(sender_email, receiver_email, text) # メッセージを送信
print('メールが送信されました')
except Exception as e:
print(f'エラーが発生しました: {str(e)}')
finally:
server.quit() # SMTPサーバーとの接続を閉じる
if __name__ == '__main__':
# メイン処理
subject = 'Pythonからのテストメール'
body = 'これはPythonから送信したテストメールです。'
send_email(subject, body)
こっちはいい感じに送れています。
18.4 IMAP
今度はIMAPを使用して受信メールを操作します。
IMAPは電子メールクライアントがメールサーバーと通信して電子メールを受信、管理、保存するためのプロトコルです。
本当は未読メールを取得するのですが、未読メールが多すぎて悲惨なことになりそうだったので、受信フォルダの一覧を取得してみました。
なぞの文字が取得されたので、これであっているかはわかりません🥲
とりあえず、やってみた!!
えらい!!
import os
from imaplib import IMAP4_SSL
from dotenv import load_dotenv
# .envファイルを読み込む
load_dotenv()
def get_gmail_inbox_list():
# .envファイルから認証情報を取得
username = os.getenv('GMAIL_USERNAME')
password = os.getenv('GMAIL_PASSWORD')
if not username or not password:
return 'Gmailのユーザー名とパスワードが設定されていません。.envファイルを確認してください。'
try:
# GmailのIMAPサーバーに接続
imap_server = IMAP4_SSL('imap.gmail.com')
# Gmailアカウントにログイン
imap_server.login(username, password)
# メールボックス(フォルダ)の一覧を取得
response, mailbox_list = imap_server.list()
# メールボックス一覧を表示
if response == 'OK':
inbox_list = []
for mailbox in mailbox_list:
parts = mailbox.decode('utf-8').split(' "/" ')
if len(parts) > 1:
mailbox_name = parts[1]
else:
mailbox_name = parts[0]
inbox_list.append(mailbox_name)
return inbox_list
else:
return 'メールボックスの一覧取得に失敗しました。'
except Exception as e:
return f'エラーが発生しました: {str(e)}'
finally:
# IMAPサーバーからログアウト
imap_server.logout()
def main():
inbox_list = get_gmail_inbox_list()
if isinstance(inbox_list, list):
print('受信メールボックス一覧:')
for mailbox_name in inbox_list:
print(mailbox_name)
else:
print(inbox_list)
if __name__ == '__main__':
main()
18.6.4 Twilioを使ってSMSを送る
PythonはSMSも送れるんですね。
「後日、本人確認書類を送付する必要があります。」の一文を読んでやめました。
そこまでしてSMSを送らなくても良いかな。
outlookからメールを送ってみる
普段使っているのがoutlookなので、outlookからもメールを送ってみました。
本当はこちらもアプリパスワードを取得したり、APIを使ったりしたかったのですが、時間がかかりそうだったのでまずはwin32com.clientモジュールを使う方法にしてみました。
import win32com.client
def send_outlook_email(subject, body, to_address):
try:
# Outlookアプリケーションを開く
outlook_app = win32com.client.Dispatch('Outlook.Application')
# メールアイテムを作成
mail_item = outlook_app.CreateItem(0) # 0はメールアイテムのタイプを表します(0はメール)
# メールの設定
mail_item.Subject = subject
mail_item.Body = body
mail_item.To = to_address
# メールを送信
mail_item.Send()
print('メールが送信されました。')
except Exception as e:
print(f'メールの送信中にエラーが発生しました: {str(e)}')
# メールを送信する例
subject = 'テストメール'
body = 'これはテストメールです。'
to_address = '宛先メールアドレス'
send_outlook_email(subject, body, to_address)
こちらもいい感じに送信できました。
本当はTeamsのチャンネルに送信したかったのですが、うまくできなかったのでまたやってみます😀
この記事が気に入ったらサポートをしてみませんか?