MENU

【業務効率化】初心者がPythonとAIで自動メール返信ツールを作成|Gmail・ChatGPT API

今回は「業務効率化」の第一歩として、「自動メール返信ツール」作りにチャレンジします!日々のメール対応、定型的な返信だけでなく、もっと賢い返信も自動化できたら嬉しいですよね。

この記事では、私がPythonとAIを使って自動メール返信ツールを作成する過程で学んだこと、試行錯誤した点、そして「こうすればもっと良くなるかも!」という気づきを共有します。AI初心者の私が、手探りで進めていく様子をぜひご覧ください。

この記事で分かること
  • Pythonを使った基本的なメール送信・受信の方法(smtplib, imaplibライブラリ)
  • テンプレートエンジン(例:Jinja2)を使ったメール本文の効率的な作成
  • 特定の条件でメールをフィルタリングし、自動返信する仕組みの考え方
  • OpenAI API (ChatGPT) を使って、受信メールに対する返信文案をAIに生成させる方法
  • ツール作成の過程で実際にハマった点や、そこから学んだこと
目次

【STEP1】まずは基本の「き」!Pythonでメールを送信してみよう

Pythonからメールを送信するところからスタートします。これができなければ始まりませんからね!

メール送信の仕組みとは?

メール送信には、SMTP (Simple Mail Transfer Protocol) というプロトコル(通信ルールのようなもの)が使われます。Pythonには、このSMTPを簡単に扱えるようにするための smtplib という標準ライブラリが用意されています。これを使えば、プログラムからメールサーバーに接続してメールを送信できるんです。

メール送信のための準備

使用ライブラリの説明

まずは使用するライブラリの説明と準備をしていきます。

  • smtplibメール送信のためのライブラリ。Pythonの標準ライブラリなので、追加のインストールは不要です。
  • emailメールの件名や本文、宛先などの情報(メッセージオブジェクト)を作成・編集するためのモジュール。これも標準装備!
  • python-dotenv:APIキーやパスワードなどの機密情報をコードに直接書かず、.envファイルで管理し、環境変数として読み込むためのライブラリ。セキュリティ向上のため導入します。

アプリパスワードの取得

Pythonでメールを送信するためには、Gmailのアプリパスワードというものが必要になります。

以下の手順でアプリパスワードを発行しましょう。

アプリパスワード発行手順
  1. Googleアカウントにログインして管理画面を開く(https://myaccount.google.com/
  2. アカウントの 「セキュリティ」 タブを開く
  3. 2段階認証プロセスを設定する(※2段階認証が設定されていないとパスワードが発行できません)
  4. 上部の検索で「アプリ」と検索し、「アプリパスワード」を選択
  5. アプリ名を設定して「作成」することで、アプリパスワードを発行

アカウントの「セキュリティ」タブを開き、2段階認証プロセスを設定

上部の検索で「アプリ」と検索し、「アプリパスワード」を選択

アプリ名を設定して「作成」(名前は自由に決めて良いです)

作成された「アプリパスワード」を控えておく(次で使います)

アドレスやパスワードの安全性確保

コードを安全に保つために、メールアドレスやアプリパスワードのような機密情報は、コードに直接書き込むのではなく、python-dotenvを使って環境変数から読み込む必要があります。

pip install python-dotenv

次に、プロジェクトのルートディレクトリ(Pythonスクリプトと同じ場所など)に .env という名前のファイルを作成し、以下のようにご自身のGmailアカウント情報とアプリパスワードを記述します。

# .envファイルの例
GMAIL_USERNAME="your_email@gmail.com"
GMAIL_APP_PASSWORD="your_app_password"

これで準備は完了です。早速次の章でメール送信を行ってみましょう!

実践!smtplibライブラリでシンプルなテキストメールを送信

準備ができたので、以下のコードでメールを送信してみましょう!今回はGmailを使用します。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
import os # 環境変数を扱うために追加
from dotenv import load_dotenv # .envファイルを読み込むために追加

# .envファイルから環境変数を読み込む
load_dotenv()

# --- 設定項目 ---
smtp_server = 'smtp.gmail.com'  # GmailのSMTPサーバー
smtp_port = 587  # GmailのSMTPポート (TLS)

# 環境変数からGmailの認証情報を読み込む
username = os.getenv('GMAIL_USERNAME')
password = os.getenv('GMAIL_APP_PASSWORD')

from_addr = username
to_addr = 'recipient_email@example.com'  # 送信先のメールアドレス

subject = 'Pythonからのテストメール'
body = 'こんにちは!Pythonからメールを送信しています。\nこれはテストです。'
# --- 設定項目ここまで ---

# ユーザー名やパスワードが.envファイルから正しく読み込めたか確認
if not username or not password:
    print("エラー: GMAIL_USERNAME または GMAIL_APP_PASSWORD が .env ファイルに設定されていないか、読み込めませんでした。")
    print(".envファイルを作成し、正しい情報を記述してください。")
    exit() # 認証情報がない場合は処理を中断

try:
    # メールメッセージを作成
    msg = MIMEText(body, 'plain', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr

    # SMTPサーバーに接続してメールを送信
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # TLSで暗号化
    server.login(username, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    print('メールを送信しました。')

except smtplib.SMTPAuthenticationError:
    print(f'メール送信に失敗しました: 認証エラー。Gmailのユーザー名またはアプリパスワードが正しいか、.envファイルの設定を確認してください。')
except Exception as e:
    print(f'メール送信に失敗しました: {e}')

finally:
    if 'server' in locals() and server:
        server.quit()  # サーバーとの接続を閉じる

試した結果とつまずいたポイント

コードを実行すると、以下のように無事にメールを送信することができました!これは色々と活用できそうですね!

つまずきポイント1:アプリパスワードが表示されない?

アプリパスワードの発行について調べていると、「二段階認証」を設定すれば「アプリパスワード」の項目が出てくると書いてあることが多かったです。

ただ、いざ実行してみると「アプリパスワード」が表示されず躓いてしまいました。結果として、手順で示したように「検索バー」に「アプリ」と入力して検索することで表示することができました。

つまずきポイント2:メールが受信できない?

最初、プログラムを動かしましたがメールが受信できていませんでした。色々と調べた結果、迷惑メールフォルダに振り分けられていました。

おそらく、今回例文として送った文章がスパムメールと判断されてしまったのだと思います。メールが見つからない場合は、迷惑メールフォルダも確認してみましょう!

【STEP2】テンプレート(Jinja2)で返信メールを効率化!

Pythonとテンプレートエンジンで定型メールを賢く生成!準備編

メール送信の基本が分かったところで、次はメール本文の作成を効率化してみましょう。毎回同じような内容のメールを手で書いたり、コピペしたりするのは面倒ですよね。

そこで登場するのがテンプレートエンジンです!

テンプレートエンジンを使うと、メールのひな形(テンプレート)を用意しておき、名前や日付などの可変部分だけをプログラムで差し込むことができます。

今回は、Pythonでよく使われるテンプレートエンジンの一つである Jinja2 を使ってみます。

まずはインストールから。pipコマンドで簡単にインストールできます。

pip install Jinja2

実践!Jinja2 を使って名前などを差し込んだメール本文を生成

まず、メールのテンプレートとなるテキストファイル (email_template.txt) を用意します。

# email_template.txt の例
{{ name }}様

お問い合わせありがとうございます。
{{ product_name }}の件、承知いたしました。
詳細については{{ date }}までにご連絡いたします。

よろしくお願いいたします。

そして、このテンプレートにPythonからデータを渡して、メール本文を生成するコードは以下のようになります。

from jinja2 import Environment, FileSystemLoader
import os # template_dir を絶対パスにする場合などに便利

# --- 設定項目 ---
# テンプレートファイルがあるディレクトリ (カレントディレクトリを想定)
# スクリプトの場所によっては os.path.dirname(os.path.abspath(__file__)) などで絶対パスを指定すると確実
template_dir = '.' 
template_file = 'email_template.txt'

data_for_template = {
    'name': '山田太郎',
    'product_name': 'すごいツールVer2.0',
    'date': '明日'
}
# --- 設定項目ここまで ---

try:
    # Jinja2の環境を設定
    env = Environment(loader=FileSystemLoader(template_dir, encoding='utf-8'))
    template = env.get_template(template_file)

    # テンプレートにデータを渡してレンダリング
    email_body = template.render(data_for_template)
    print("--- 生成されたメール本文 ---")
    print(email_body)
    print("--------------------------")

    # この email_body をSTEP1のメール送信コードの body として使えばOK!

except Exception as e:
    print(f"テンプレート処理中にエラーが発生しました: {e}")

テンプレート(Jinja2)で返信を試した結果

テンプレートを使用してメールを送ると、以下のように様式に沿ったメールを送ることができました。

実際に使ってみると、本当に便利!テンプレートに変数を埋め込むだけなので、手作業による宛名間違いや内容の抜け漏れを防げそうです。同じようなメールを何通も送る必要がある場合には、絶大な効果を発揮しそうですね。

【STEP3】Pythonで受信したメールの確認に挑戦!

新着メールをPythonがチェック!imaplibでGmail受信箱にアクセス

メールを送信できるようになったら、次はメールを受信する処理に挑戦です。自動返信するには、まずメールをプログラムで読み込む必要がありますからね。

メール受信の仕組みについて

メール受信には、主に IMAP (Internet Message Access Protocol)POP3 (Post Office Protocol version 3) というプロトコルが使われます。

  • IMAP:メールをサーバーに残したまま操作できる
  • POP3:基本的にメールをダウンロードしてクライアント側で管理する

今回は、複数のデバイスからアクセスする可能性も考えて、IMAPを使ってみます。

Pythonには、IMAPを扱うための imaplib という標準ライブラリがあるため、これを使います。

実践!特定の条件(例:未読、特定の送信元)でメールを取得・表示

Gmailの受信箱に接続し、未読メールを取得して、その件名や送信元、本文の一部を表示するコードを書いてみました。STEP1同様、認証情報は.envファイルから読み込みます。

import imaplib
import email
from email.header import decode_header
import os
from dotenv import load_dotenv

# .envファイルから環境変数を読み込む
load_dotenv()

# --- 設定項目 ---
imap_server = 'imap.gmail.com'
username = os.getenv('GMAIL_USERNAME')
password = os.getenv('GMAIL_APP_PASSWORD')
# --- 設定項目ここまで ---

# 認証情報の確認
if not username or not password:
    print("エラー: .envファイルにGMAIL_USERNAMEとGMAIL_APP_PASSWORDを設定してください")
    exit()

def decode_subject(header_value):
    """メールの件名や送信者名を日本語対応でデコードする関数"""
    decoded_parts = decode_header(header_value)
    result = ""
    for part, charset in decoded_parts:
        if isinstance(part, bytes):
            # バイト形式の場合は文字エンコーディングでデコード
            result += part.decode(charset or 'utf-8')
        else:
            # 文字列の場合はそのまま追加
            result += part
    return result

# 1. Gmailサーバーに接続
mail = imaplib.IMAP4_SSL(imap_server)
mail.login(username, password)

# 2. 受信箱を選択
mail.select('inbox')

# 3. 未読メールを検索
status, messages = mail.search(None, 'UNSEEN')
email_ids = messages[0].split()

print(f"未読メール数: {len(email_ids)}通")

# 4. 各未読メールの内容を表示
for email_id in email_ids:
    # メールデータを取得(BODY.PEEK[]で既読にしない)
    status, msg_data = mail.fetch(email_id, '(BODY.PEEK[])')
    raw_email = msg_data[0][1]
    
    # メールオブジェクトに変換
    email_message = email.message_from_bytes(raw_email)
    
    # 送信者と件名を取得・表示
    from_ = decode_subject(email_message['From'])
    subject = decode_subject(email_message['Subject'])
    
    print(f"\n--- メール ID: {email_id.decode()} ---")
    print(f"送信者: {from_}")
    print(f"件名: {subject}")
    
    # メール本文を取得・表示
    if email_message.is_multipart():
        # マルチパート(添付ファイルありなど)の場合
        for part in email_message.walk():
            if part.get_content_type() == "text/plain":
                body = part.get_payload(decode=True).decode('utf-8')
                print(f"本文: {body[:100]}...")  # 最初の100文字のみ表示
                break
    else:
        # シンプルなテキストメールの場合
        body = email_message.get_payload(decode=True).decode('utf-8')
        print(f"本文: {body[:100]}...")  # 最初の100文字のみ表示

# 5. 接続を閉じる
mail.close()
mail.logout()
print("\n処理完了")
コード解説

def decode_subject(header_value)文字化けを防ぐための関数

  • メールの件名や送信者名に日本語が含まれていると文字化けが発生する。
  • 文字化けする文字列を、私たちが読める普通の日本語に翻訳(デコード)している。

status, messages = mail.search(None, ‘UNSEEN’):メールボックスの検索

  • mail.search(…)を使って、受信箱の中から条件に合うメールを探す。
  • ‘UNSEEN’(=未読)という条件を指定しているので、未読メールだけを探している。
  • 見つかったメールのID(識別番号)がmessagesに入る。

メール内容の取得

  • mail.fetch(…):メールID(num)を指定して、メールの全てのデータを持ってくる。
  • email.message_from_bytes(…):持ってきたデータを、emailライブラリの便利な道具を使って、件名・送信者・本文などを取り出しやすい形に変換する。
  • decode_subject(…):取り出した送信者(From)と件名(Subject)を、先ほどの「翻訳機」関数を使って日本語に直し、画面に表示する。

if email_message.is_multipart():メール形式の解析(HTMLや添付ファイルなど)

  • メールが複雑な形式(マルチパート)か? をチェック。
  • どちらのタイプでも、最終的には本文のテキスト部分(text/plain)だけを取り出し、body という変数に入れる。
  • print(f”本文: {body[:100]}…”):最初の100文字だけを切り取って表示する。

Pythonで受信メール確認を試した結果

実行すると、以下のように、未読メールを取得して「送信者(from)」と「件名(Subject)」と「メールの内容(Body)」を表示できました!

これを活用すれば、問い合わせなどの特定の内容に対して自動で返信するツールを作成できそうですね!

メールの既読処理について

自動返信ツールを作る上では、「どのメールに返信して、どのメールはまだか」を管理する必要があります。また、広告メールなどは返信の必要がなく、興味がなければそのまま既読にしてしまいたいですね。

IMAPにはメールにフラグを立てる機能があり、例えば \Seen フラグを立てることで既読にできます。これを利用して処理済みのメールを管理する方法なども組み込めそうです。

【STEP4】受信メールに自動で返信するツール開発

いよいよこれまでの知識を組み合わせて、自動メール返信ツールのプロトタイプを作ってみます!

基本設計について

まずはシンプルなものから作ります。

  1. 定期的に(今回は手動実行ですが)新着メールをチェックする (STEP3の知識)
  2. 特定の件名(例:「お問い合わせ」)が含まれるメールを見つける
  3. そのメールの送信者に対して、事前に用意したテンプレートを使って一次返信する (STEP2とSTEP1の知識)

こんな流れで実装してみましょう。認証情報は引き続き .env ファイルから読み込みます。

STEP1, STEP2, STEP3の知識を組み合わせた自動返信スクリプト

このコードは、これまでのステップの知識を一つにまとめたものです。全体の流れを掴むことを目的に、エラー処理などを簡略化しています。

import smtplib
import imaplib
import email
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr
from jinja2 import Environment, FileSystemLoader
import os
from dotenv import load_dotenv

# .envファイルを読み込む
load_dotenv()

# --- 設定 ---
IMAP_SERVER = 'imap.gmail.com'
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
GMAIL_USERNAME = os.getenv('GMAIL_USERNAME')
GMAIL_APP_PASSWORD = os.getenv('GMAIL_APP_PASSWORD')

TARGET_SUBJECT_KEYWORD = "お問い合わせ"
REPLY_TEMPLATE_FILE = "reply_template.txt"
PROCESSED_EMAIL_IDS_FILE = "processed_email_ids.txt"

# --- 処理済みIDを管理する関数 (STEP3と同じ) ---
def load_processed_ids():
    if not os.path.exists(PROCESSED_EMAIL_IDS_FILE):
        return set()
    with open(PROCESSED_EMAIL_IDS_FILE, 'r', encoding='utf-8') as f:
        return {line.strip() for line in f}

def save_processed_id(email_id):
    with open(PROCESSED_EMAIL_IDS_FILE, 'a', encoding='utf-8') as f:
        f.write(email_id + '\n')

# --- メイン処理 ---
try:
    # 1. メール受信 (STEP3の応用)
    mail = imaplib.IMAP4_SSL(IMAP_SERVER)
    mail.login(GMAIL_USERNAME, GMAIL_APP_PASSWORD)
    mail.select('inbox')
    
    processed_ids = load_processed_ids()
    status, messages = mail.search(None, 'UNSEEN')
    email_ids = messages[0].split()
    print(f"未読メールを{len(email_ids)}通チェックします...")

    # 2. 各メールをチェックして条件にあえば返信
    for email_id_bytes in email_ids:
        email_id_str = email_id_bytes.decode()
        if email_id_str in processed_ids:
            continue

        # メールを取得・解析
        status, msg_data = mail.fetch(email_id_bytes, '(BODY.PEEK[])')
        email_message = email.message_from_bytes(msg_data[0][1])
        
        # 件名を取得
        subject_header = email.header.decode_header(email_message['Subject'])[0]
        subject = subject_header[0].decode(subject_header[1] or 'utf-8') if isinstance(subject_header[0], bytes) else subject_header[0]
        
        # 3. 条件判定 (件名にキーワードが含まれるか?)
        if TARGET_SUBJECT_KEYWORD in subject:
            print(f"\n-> 返信対象を発見: {subject}")
            
            # 送信元アドレスを取得
            from_header_str = email.header.decode_header(email_message['From'])[0][0]
            if isinstance(from_header_str, bytes):
                from_header_str = from_header_str.decode(email.header.decode_header(email_message['From'])[0][1] or 'utf-8')
            sender_address = parseaddr(from_header_str)[1]

            # 4. 返信メール作成 (STEP2の応用)
            env = Environment(loader=FileSystemLoader('.', encoding='utf-8'))
            template = env.get_template(REPLY_TEMPLATE_FILE)
            reply_body = template.render({'name': sender_address.split('@')[0]})
            reply_subject = f"Re: {subject}"

            # 5. 返信メール送信 (STEP1の応用)
            msg = MIMEText(reply_body, 'plain', 'utf-8')
            msg['Subject'] = Header(reply_subject, 'utf-8')
            msg['From'] = GMAIL_USERNAME
            msg['To'] = sender_address

            server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
            server.starttls()
            server.login(GMAIL_USERNAME, GMAIL_APP_PASSWORD)
            server.send_message(msg)
            server.quit()
            print(f"-> 返信メールを {sender_address} に送信しました。")

            # 6. 処理済みにする
            save_processed_id(email_id_str)
            print(f"-> メールID {email_id_str} を処理済みとして記録しました。")

    mail.logout()
    print("\n処理を完了しました。")

except Exception as e:
    print(f"エラーが発生しました: {e}")
コード解説

このコードは、これまでのSTEP1〜3で学んだことをすべて組み合わせた集大成です。

ポイント1:全体の大まかな流れ
「メール受信 → 条件チェック → 返信メール作成 → メール送信 → 処理済み記録」という一連の流れが、上から順番に書かれています。このように、一つ一つの部品(送受信やテンプレート)を組み合わせて、より複雑なツールが作られていくのが分かります。

ポイント2:条件判定 (if TARGET_SUBJECT_KEYWORD in subject)
この一行が、自動返信するかどうかを決める「司令塔」の役割を果たします。受信したメールの件名に、あらかじめ設定したキーワード(今回は「お問い合わせ」)が含まれているかをチェックしています。ここを変えれば、色々な条件で返信を出し分けることができます。

ポイント3:送信元アドレスの抽出 (parseaddr)
email.utils.parseaddr()は、"山田 太郎 <taro@example.com>"のようなヘッダー情報から、メールアドレス部分である<taro@example.com>だけを綺麗に取り出してくれる便利な関数です。返信先を正確に指定するために重要です。

ポイント4:無限返信の防止
STEP3で導入した「処理済みIDの記録」の仕組み(load_processed_ids, save_processed_id)が、ここでも活躍します。一度返信したメールのIDをファイルに保存しておくことで、同じメールに何度も返信してしまう「無限返信ループ」を防ぎます。これは自動化ツールを作る上で非常に重要な考え方です。

自動返信を試した結果

他のアドレスからテストとして問い合わせメールを送信しておき、プログラムを実行すると、無事に自動でメールを返信することができました。

簡単な問い合わせ対応など、形が決まっているものであれば、これを利用するだけでかなり仕事を効率化できそうですね!

【STEP5】OpenAI API (ChatGPT) で賢いメール返信に挑戦

これまでのツールは、あらかじめ決められたテンプレートに基づいて返信するものでした。これはこれで便利ですが、もっと人間らしい、柔軟な返信ができたら最高ですよね?

これまでのツールの限界とAIへの期待

STEP4で作ったツールは、特定のキーワードに反応して定型文を返すだけ。でも、

  • 問い合わせ内容に応じて、少し文面を変えたい
  • 簡単な質問なら、その場で直接答えたい

といったニーズには応えられません。そこで、 ChatGPT (OpenAI API) の力を借りて、AIに返信文を考えてもらうことに挑戦します!

OpenAI API (ChatGPT)の使い方については、以下の記事で解説していますので合わせてそちらもご確認ください。

OpenAI API (ChatGPT)を使うための準備

まずは、openaiというライブラリをインストールしましょう。

openai:OpenAI APIをPythonから簡単に利用するための公式ライブラリ。

pip install openai

次に、プロジェクトのルートディレクトリに .env という名前のファイルを作成し(Gmailの認証情報で作成済みのはずです)、以下のようにAPIキーを追記します。

# .env ファイルの例 (追記)
GMAIL_USERNAME="your_email@gmail.com"
GMAIL_APP_PASSWORD="your_app_password"
OPENAI_API_KEY="sk-あなたのAPIキーをここに貼り付け"

.env ファイルは、Gitなどのバージョン管理システムには絶対に含めないように注意してください!
(.gitignore ファイルに .env を追加しましょう)

実践!ChatGPT APIを使ってメール返信文を生成する

受信したメールの件名と本文を基に、ChatGPT (gpt-4oモデル) に一次返信の文案を生成させるPythonコードの例です。

import openai
import os
from dotenv import load_dotenv

# .envファイルから環境変数を読み込む
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

if not openai.api_key:
    print("エラー: OPENAI_API_KEYが設定されていません。.envファイルを確認してください。")
    # exit() # APIキーがない場合は処理を中断するかどうかを決定

def generate_ai_reply(received_email_subject, received_email_body, sender_name="お客様"):
    """OpenAI APIを使って、受信メールに対する返信文案を生成する関数"""
    if not openai.api_key: # 関数内でもAPIキーの存在をチェック
        return f"申し訳ございません、{sender_name}様。AI返信システムのAPIキーが設定されていません。担当者が確認いたします。"

    prompt = f"""
あなたは、企業のカスタマーサポート担当者です。
以下の受信メールに対して、丁寧かつ簡潔な一次返信を作成してください。
差出人の名前は「{sender_name}様」としてください。
メールの内容に軽く触れつつ、担当者が内容を確認し、改めて連絡する旨を伝えてください。
返信は日本語で、プロフェッショナルなトーンでお願いします。

--- 受信メール ---
件名: {received_email_subject}

本文:
{received_email_body}
--- 受信メールここまで ---

AIによる返信文案:
"""

    try:
        response = openai.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "あなたは優秀で親切なメール返信アシスタントです。"},
                {"role": "user", "content": prompt}
            ],
            max_tokens=300, # 少し長めに設定
            temperature=0.7,
            n=1,
            stop=None
        )
        ai_reply_text = response.choices[0].message.content.strip()
        return ai_reply_text
    except openai.APIError as e:
        print(f"OpenAI APIエラーが発生しました: {e}")
        return f"申し訳ございません、{sender_name}様。現在AIによる返信生成システムに問題が発生しております。担当者が確認し、改めてご連絡いたします。"
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")
        return f"申し訳ございません、{sender_name}様。システムエラーにより、ただいま返信を自動生成できませんでした。担当者が確認いたします。"

# --- 使い方(STEP4の処理と組み合わせるイメージ) ---
if __name__ == "__main__":
    if not openai.api_key:
        print("OpenAI APIキーが設定されていないため、AI返信生成のデモをスキップします。")
    else:
        test_received_subject = "製品XYZについての質問"
        test_received_body = """こんにちは。
製品XYZの価格と納期について教えていただきたいです。
また、大量購入の場合の割引についても知りたいです。
よろしくお願いします。
田中一郎"""
        test_sender_name_from_email = "田中一郎"

        print("--- AIに返信文案の生成を依頼します ---")
        ai_generated_reply = generate_ai_reply(test_received_subject, test_received_body, test_sender_name_from_email)

        print("\n--- AIが生成した返信文案 ---")
        print(ai_generated_reply)

AIによる自動返信を試した結果

以下のように、文脈を読み取ってしっかりと返信用の文章を考えてくれました!

自分や自社の名前などを教えていないため、そこは後から入力できるようになっていますね。

今後の改良案
  • 自分や自社の名前、連絡先などをAIに教えておくことで、手直しの必要がない文章を作成できる。
  • 自動的な返信までは組み込んでいないため、最終的には【STEP4】と組み合わせることで完全な返信の自動化が可能となる。

ここまでくれば、実用的なメール自動返信ツールが完成しましたね!!

まとめ:自動メール返信ツール作成の挑戦から学んだこと

今回の自動メール返信ツール作りを通して、たくさんのことを学びました。
学んだ内容については、以下にまとめておきます。

今回学んだこと
  • Pythonでのメール操作(送受信)は、smtplibimaplibといった標準ライブラリを使えば、意外と手軽に始められる!
  • 認証情報(パスワードやAPIキー)は、コードに直接書かず、.envファイルと環境変数を使って管理するのが安全で推奨される方法であること。
  • テンプレートエンジン(Jinja2)は、定型業務の効率化に超有効。コピペ作業から解放される!
  • OpenAI API (ChatGPT) を使えば、これまでのルールベースでは難しかった、より人間らしい柔軟な文章生成も夢じゃない!ただし、プロンプトが鍵。
  • 自動化は便利だけど、エラー処理(ネットワークエラー、予期せぬデータ形式など)、セキュリティ(特にAPIキーやパスワードの管理)、誤作動防止(無限返信ループなど)の設計が超重要。

まだまだ改善の余地はたくさんありますが、まずは「動くもの」ができたことに満足しています。

今回の記事が、皆さんの「やってみよう!」という気持ちを少しでも後押しできたら、嬉しいです。プログラミングやAIは、最初は難しく感じるかもしれませんが、小さな成功体験を積み重ねることで、どんどん楽しくなっていくはずです。

良ければ、他の記事もぜひ御覧ください!

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

この記事を書いた人

非IT職のデスクワーカーです。
簡単な業務効率化やデータ分析にPythonをよく活用しています。
このブログを通してAI技術を身に着け、より業務効率化や新しいものを作りたいと考えています。

目次