PythonでExcelから会費未払いの会員にリマインダーを自動送信する

この記事では、Pythonを使い、Excelの会員名簿から会費が未払いのメンバーを特定し、彼らにカスタマイズされたリマインダーメールを自動で一括送信するスクリプトの作成方法を解説します。補足として、Twilioサービスを利用してSMSでリマインダーを送る方法も紹介します。


目次

1. 準備:必要なライブラリとデータ

このプロジェクトでは以下のライブラリを使用します。

  • openpyxl: Excelファイル(.xlsx)の読み書き。
  • smtplib, email: Eメールの作成と送信(標準ライブラリ)。
  • twilio: SMS送信サービス(オプション)。

まず、必要なサードパーティ製ライブラリをインストールします。

pip install openpyxl twilio

Excelファイルの準備 duesRecords.xlsxという名前で、以下のようなデータを持つExcelファイルを作成してください。

ABCD
1NAMEEMAILMay
2Alicealice@example.compaid
3Bobbob@example.com
4Carolcarol@example.compaid

アカウント情報の準備

  • メール送信には、Gmailのアプリパスワードが必要です。
  • SMS送信には、TwilioのアカウントSID、認証トークン、Twilioの電話番号が必要です。

2. Excelファイルから未払い会員を特定する

スクリプトの最初のステップは、Excelファイルを開き、最新月の支払い状況をチェックして、未払いのメンバーの名前とメールアドレスを辞書に格納することです。

import openpyxl

def find_unpaid_members(filename):
    unpaid_members = {}
    try:
        workbook = openpyxl.load_workbook(filename)
        sheet = workbook['Sheet1']
        
        # 最新月の列を特定
        last_col = sheet.max_column
        latest_month = sheet.cell(row=1, column=last_col).value
        
        # 2行目から最終行までチェック
        for r in range(2, sheet.max_row + 1):
            payment_status = sheet.cell(row=r, column=last_col).value
            if payment_status != 'paid':
                name = sheet.cell(row=r, column=1).value
                email = sheet.cell(row=r, column=2).value
                unpaid_members[name] = email
        
        return unpaid_members, latest_month
    except FileNotFoundError:
        print(f"エラー: {filename}が見つかりません。")
        return None, None

3. リマインダーメールを送信する

次に、特定した未払いメンバーのリストをループ処理し、一人ひとりにカスタマイズされたメールを送信します。smtplibemailモジュールを使い、スパム判定されにくい適切な形式のメールを作成します。

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

def send_reminder_emails(unpaid_members, month, sender_email, app_password):
    SMTP_SERVER = 'smtp.gmail.com'
    SMTP_PORT = 465

    try:
        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as smtp:
            smtp.login(sender_email, app_password)
            
            for name, email in unpaid_members.items():
                body = f"""{name}様

会費のお支払い記録によると、{month}分の会費がまだお済みでないようです。
ご確認の上、速やかにお支払いいただけますようお願い申し上げます。
"""
                msg = MIMEText(body, 'plain', 'utf-8')
                msg['Subject'] = Header(f'{month}月分会費のお支払いについて', 'utf-8')
                msg['From'] = sender_email
                msg['To'] = email
                
                smtp.send_message(msg)
                print(f"リマインダーメールを {email} に送信しました。")

    except Exception as e:
        print(f"メール送信中にエラーが発生しました: {e}")

4. (補足) TwilioでSMSリマインダーを送信する

メールの代わりに、またはメールに加えてSMSで通知を送ることもできます。twilioライブラリは、この処理を非常に簡単にします。

from twilio.rest import Client

def send_sms_reminder(phone_number, message_body):
    # 自身のアカウント情報を設定
    ACCOUNT_SID = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    AUTH_TOKEN = 'your_auth_token'
    TWILIO_NUMBER = '+1234567890'
    
    client = Client(ACCOUNT_SID, AUTH_TOKEN)
    
    try:
        message = client.messages.create(
            body=message_body,
            from_=TWILIO_NUMBER,
            to=phone_number
        )
        print(f"SMSを {phone_number} に送信しました。SID: {message.sid}")
    except Exception as e:
        print(f"SMS送信中にエラーが発生しました: {e}")

5. 完成したメールリマインダースクリプト

以下は、Excelの読み込みとメール送信を統合したメインのスクリプトです。

# (上記で定義した find_unpaid_members と send_reminder_emails 関数をここに記述)

# --- メイン処理 ---
SENDER_EMAIL = 'your_email@gmail.com'
APP_PASSWORD = 'your_16_character_app_password' # ここにアプリパスワードを入力

unpaid, month = find_unpaid_members('duesRecords.xlsx')

if unpaid is not None and month is not None:
    print(f"{len(unpaid)}人の未払いメンバーが見つかりました。")
    send_reminder_emails(unpaid, month, SENDER_EMAIL, APP_PASSWORD)

まとめ

このプロジェクトは、openpyxlでスプレッドシートからデータを抽出し、そのデータに基づいてsmtplibで多数のカスタマイズメールを自動送信するという、実用的なビジネスオートメーションの典型例です。さらにTwilioのようなAPIサービスと連携させることで、コミュニケーションの手段を広げることもできます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次