見出し画像

『退屈なことは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のチャンネルに送信したかったのですが、うまくできなかったのでまたやってみます😀



この記事が気に入ったらサポートをしてみませんか?