この記事では、Pythonを使い、Excelの会員名簿から会費が未払いのメンバーを特定し、彼らにカスタマイズされたリマインダーメールを自動で一括送信するスクリプトの作成方法を解説します。補足として、Twilio
サービスを利用してSMSでリマインダーを送る方法も紹介します。
1. 準備:必要なライブラリとデータ
このプロジェクトでは以下のライブラリを使用します。
openpyxl
: Excelファイル(.xlsx
)の読み書き。smtplib
,email
: Eメールの作成と送信(標準ライブラリ)。twilio
: SMS送信サービス(オプション)。
まず、必要なサードパーティ製ライブラリをインストールします。
pip install openpyxl twilio
Excelファイルの準備 duesRecords.xlsx
という名前で、以下のようなデータを持つExcelファイルを作成してください。
A | B | C | D |
1 | NAME | May | |
2 | Alice | alice@example.com | paid |
3 | Bob | bob@example.com | |
4 | Carol | carol@example.com | paid |
アカウント情報の準備
- メール送信には、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. リマインダーメールを送信する
次に、特定した未払いメンバーのリストをループ処理し、一人ひとりにカスタマイズされたメールを送信します。smtplib
とemail
モジュールを使い、スパム判定されにくい適切な形式のメールを作成します。
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サービスと連携させることで、コミュニケーションの手段を広げることもできます。