Pythonでメール自動送信【コピペOK】業務で使える実装例3選と、パスワードを安全に扱う方法

「毎朝同じメールを手動で送るのが地味にしんどい」

日報、月末のリマインド、申請受付の通知——内容はほぼ同じなのに、毎回開いてコピペして送信して…。そのたびに「これ自動化できないかな」と思いますよね。

私も総務の仕事をしながら「プログラミングなんて無理」と思っていました。でもChatGPTに作ってもらったPythonでメール自動送信を試してみたら、普通にできたんです。

この記事では、コピペしてすぐ動く最短コードから、業務で実際に使える実装例3選まで、プログラミング初心者向けに解説します。

ChatGPTでカスタマイズする方法も紹介するので、コードを「書く」必要はありませんのでご安心を。


結論

Pythonでのメール自動送信は最短10行。
業務で使うには「パスワードの安全な管理」だけ押さえれば十分。

  • 最初の一歩: smtplibで10行コード → Gmailで送信確認
  • 業務で使う前に必須: パスワードを.envファイルに分離する
  • 応用: 日報・リマインド・申請通知の3パターンに展開

まず動かしてみる——最短10行で自動送信できる

Gmailで動かすための前準備

コードを書く前に、Gmail側の設定が1つだけ必要です。
「アプリパスワード」の取得です。

  1. Googleアカウントの「セキュリティ」ページを開く
  2. 「2段階認証プロセス」をオンにする(未設定の場合)
  3. アプリパスワード」を開く → アプリ「メール」・デバイス「その他」で生成
  4. 表示された16桁のパスワードをメモする(後で使います)

これだけです。所要時間は3〜5分。

最短コード(smtplib・10行)

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg['Subject'] = 'テスト送信'
msg['From'] = 'あなたのgmail@gmail.com'
msg['To'] = '送信先@example.com'
msg.set_content('Pythonからの自動送信テストです。')

with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
    smtp.login('あなたのgmail@gmail.com', 'アプリパスワード16桁')
    smtp.send_message(msg)

print('送信完了')

このコードをコピーして以下2点を書き換えて実行してください。

  • あなたのgmail@gmail.com
  • アプリパスワード16桁

「送信完了」と表示されれば成功です。

ただし、このままでは使わないでください。
次のセクションで説明する「パスワードの安全な管理」を先に設定してください。


絶対やってはいけない:パスワードの直書き問題と解決法

なぜパスワードをコードに書くと危険か

最初のサンプルコードでは、わかりやすさのためにパスワードを直書きしました。でも実際にはこれは絶対にやってはいけないことです。

理由はシンプルで、コードをGitHubや社内サーバーにアップロードしたとき、パスワードが丸見えになるからです。「社内だから大丈夫」と思っていても、誤って外部に公開してしまうリスクはゼロではありません。

しかし、その対策も難しくありません。

.envファイルで安全に管理する方法

つまり、パスワードを別ファイルに切り出す設定です。
プログラミング現場で使ってる本格的手法でもあります。

Step1:python-dotenvをインストール

pip install python-dotenv

Step2:.envファイルを作成

コードと同じフォルダに .env という名前のファイルを作り、以下を書きます。

GMAIL_ADDRESS=あなたのgmail@gmail.com
GMAIL_APP_PASSWORD=アプリパスワード16桁

Step3:.envをGit管理から除外

.gitignore ファイルに以下を追加します(Gitを使っている場合)。

.env

Step4:コードから読み込む

import os
from dotenv import load_dotenv

load_dotenv()

gmail_address = os.getenv('GMAIL_ADDRESS')
gmail_password = os.getenv('GMAIL_APP_PASSWORD')

これだけでパスワードをコードから切り離せます。
.envファイルは自分のパソコンにだけ置いておけばOKです。


業務で使える実装例3選

実装例①:毎朝9時に日報フォーマットを自動送信

ユースケース: 自分が書いた日報を、毎朝9時に自動でチームに送る

import smtplib
from email.message import EmailMessage
from datetime import date
import os
from dotenv import load_dotenv

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

today = date.today().strftime('%Y年%m月%d日')

msg = EmailMessage()
msg['Subject'] = f'【日報】{today}'
msg['From'] = os.getenv('GMAIL_ADDRESS')
msg['To'] = 'チームのアドレス@example.com'
msg.set_content(f"""
{today} 日報

■ 本日の作業内容
(ここに日報内容を書く)

■ 明日の予定
(ここに予定を書く)
""")

with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
    smtp.login(os.getenv('GMAIL_ADDRESS'), os.getenv('GMAIL_APP_PASSWORD'))
    smtp.send_message(msg)

このスクリプトをWindowsのタスクスケジューラ(またはMacのcron)に登録すれば、毎朝9時に自動実行されます。


実装例②:月末リマインドメールを定期送信

ユースケース: 経費精算・勤怠確認などの月次締め切りリマインドを自動送信

import smtplib
from email.message import EmailMessage
from datetime import date, timedelta
import os
from dotenv import load_dotenv

load_dotenv()

# 月末5日前になったらリマインドを送る
today = date.today()
# 翌月1日 - 5日 = 月末5日前
import calendar
last_day = calendar.monthrange(today.year, today.month)[1]
month_end = date(today.year, today.month, last_day)
days_until_end = (month_end - today).days

if days_until_end <= 5:
    msg = EmailMessage()
    msg['Subject'] = f'【リマインド】経費精算の締め切りまで残り{days_until_end}日です'
    msg['From'] = os.getenv('GMAIL_ADDRESS')
    msg['To'] = '全社員@example.com'
    msg.set_content(f"""
今月の経費精算の締め切りは {month_end.strftime('%m月%d日')} です。

まだ提出されていない方は期限内にご提出をお願いします。
    """)

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
        smtp.login(os.getenv('GMAIL_ADDRESS'), os.getenv('GMAIL_APP_PASSWORD'))
        smtp.send_message(msg)
    print('リマインド送信完了')
else:
    print('送信不要')

このスクリプトを毎日1回実行する設定にしておけば、月末5日前になった日だけ自動でリマインドが飛びます。


実装例③:CSVの宛先リストに一括送信

ユースケース: 社員リストや取引先リストに対して、個人名を入れたメールを一括送信

import smtplib
from email.message import EmailMessage
import csv
import os
from dotenv import load_dotenv

load_dotenv()

# recipients.csv の形式: name,email
# 例: 山田太郎,yamada@example.com

with open('recipients.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        msg = EmailMessage()
        msg['Subject'] = '【社内通知】重要なお知らせ'
        msg['From'] = os.getenv('GMAIL_ADDRESS')
        msg['To'] = row['email']
        msg.set_content(f"""
{row['name']} さん

この度は重要なお知らせがあります。
(本文をここに書く)
        """)

        with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
            smtp.login(os.getenv('GMAIL_ADDRESS'), os.getenv('GMAIL_APP_PASSWORD'))
            smtp.send_message(msg)

        print(f"{row['name']} ({row['email']}) に送信しました")

CSVファイルに名前とメールアドレスを並べておけば、個人名入りのメールを1件ずつ自動送信できます。



エラーが出たときの対処法——よくある3つのケース

エラー①:SMTPAuthenticationError(認証エラー)

smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted.')

原因: アプリパスワードが間違っている、または2段階認証が有効になっていない

解決:
1. Googleアカウントの「セキュリティ」→「2段階認証プロセス」がオンか確認
2. アプリパスワードを再生成して貼り直す
3. スペース・改行が混入していないか確認(16桁がそのまま入っているか)

エラー②:UnicodeEncodeError(文字化け)

UnicodeEncodeError: 'ascii' codec can't encode characters

原因: 日本語の件名・本文がASCII文字列として処理されている

解決: EmailMessageemail.messageモジュール)を使っている場合は自動的に対応されます。古いMIMETextを使っている場合は以下のように書きます。

from email.mime.text import MIMEText
msg = MIMEText(body, 'plain', 'utf-8')  # 第3引数に 'utf-8' を指定

エラー③:送信できているのに届かない

原因: 迷惑メール(スパム)判定されている

確認事項:
– 受信側の迷惑メールフォルダを確認
– 件名に「テスト」「無料」「緊急」等のスパム判定されやすいワードが入っていないか確認
– 短時間に大量送信するとブロックされるため、一括送信時は送信間隔をtime.sleep(1)で1秒空ける


ChatGPTで自分の業務に合わせてカスタマイズする方法

コードを一から書けなくても大丈夫です。

今のコードをChatGPTに貼り付けて、以下のように伝えるだけで業務に合わせたカスタマイズができます。

プロンプト例:

以下のPythonコードを修正してください。

【変更したいこと】
- 送信先を複数に変更したい(To: A, B, C)
- 件名に今日の日付を自動で入れたい
- 本文の内容を以下のフォーマットに変えてほしい
  (フォーマットをここに貼り付ける)

【現在のコード】
(コードをここに貼り付ける)

ChatGPTは「やりたいことを日本語で伝えてコードを修正してもらう」という使い方をすれば、プログラミング知識ゼロでもカスタマイズできます。


よくある質問

Q. GmailのアカウントではなくOutlookを使っています。使えますか?

使えます。OutlookのSMTPサーバー設定に変えるだけです。

# Outlookの場合
with smtplib.SMTP('smtp.office365.com', 587) as smtp:
    smtp.starttls()
    smtp.login(your_email, your_password)

Q. Pythonはどこからインストールすればいいですか?

python.orgから無料でダウンロードできます。
以下リンクで詳しく解説しています。

総務初心者がPythonを始める方法|来週月曜から使えるようになる手順

Q. 会社のメール(独自ドメイン)でも使えますか?

使えます。SMTPサーバーのアドレス・ポート番号を社内のIT担当者に確認してください。それをsmtp.gmail.com465の部分に置き換えれば動きます。

Q. 一日何通まで送れますか?

Gmailの無料プランは1日500通まで。業務で大量送信が必要な場合は、SendGridやAmazon SES等の専用メール送信サービスの利用を検討してください(少量なら無料枠で十分)。


Pythonが使えるとキャリアはどう変わるか

「メール自動送信のコードを動かした」という経験は、キャリアの文脈でも使えます。

「業務自動化ができる事務職・総務担当者」は転職市場でかなり希少です。「Pythonを少し書ける」「スプレッドシートの自動化ができる」というだけで、同じ総務・バックオフィス職の中で際立った存在になれます。

「プログラミングを本格的に学びたい」とまで思わなくても、「業務効率化のためにツールを使いこなせる」という実績の積み上げが、気づくとキャリアの選択肢を広げています。


まとめ

  • 最短コード: smtplib + EmailMessage で10行。Gmailのアプリパスワードを設定するだけで動く
  • 業務実装: 日報・月末リマインド・CSV一括送信の3パターンが典型的なユースケース
  • セキュリティ必須: パスワードは.envファイルに分離。コードに直書きしない
  • エラー対処: 認証エラー・文字化け・迷惑メール判定の3つを覚えておけばほぼ対応できる
  • カスタマイズ: ChatGPTに「このコードを◯◯に変えてください」と投げればプログラミング知識ゼロでもOK

まずコピペして動かしてみてください。「動いた」という体験が次の一歩を生みます。


もっと、効率化できる業務を考える

Pythonを使った業務自動化は、一度できるようになると「もっとこれも自動化できないか」とどんどん広がります。

業務効率化・自動化のスキルを積み上げていきたい方は、こちらも参考にしてみてください。

関連記事:情シスなしでやった総務の自動化事例と失敗談
関連記事:総務の業務改善アイデア10選
Pythonスキルを転職でどう活かすか考えている方はこちら


この記事は、総務部での実務経験をもとに執筆しています。プログラミング独学でPythonを業務に活用してきた経験から、実際に動くコードをお届けしています。