■ 導入:きっかけは「現場の困った」から
NINJIN Mail制作記 第1回
Python×Excelでメール一括送信ツールを自作する|第1回:pandasでExcel名簿を読み込む
こんにちは、ニンジンです🥕
この記事は、Excelの名簿(氏名・アドレス・会社名)を読み込んで、Outlookから1件ずつ差し込んだメールを一括送信するツール「NINJIN Mail」を、全3回で自作していくシリーズの第1回です。今回は、ツールの設計方針を整理したうえで、pandas の read_excel() と df.iterrows() を使って、Excel名簿を1行ずつ読み込む基本処理を実装します。
プログラミングの経験が浅くても追えるよう、必要なライブラリの pip install 手順から、実行して分かった課題(次回以降で解決します)まで、順を追って解説します。
この記事で分かること
- Excel名簿→Outlook一括送信ツールの設計方針(機能要件・実装方針5点)
- 必要なライブラリ(
pandas/openpyxl/tkinter/pywin32)と、その役割 pip install pandas openpyxl pywin32のインストール手順(画面キャプチャ付き)pandas.read_excel()でExcelを読み込み、df.iterrows()で氏名・アドレス・会社名を1行ずつ取り出すサンプルコード- この段階で残る3つの課題(ファイルパスの制約・列名への依存・空行)
開発のきっかけ
「Pythonで便利なソフトを作ったら、どのくらい使ってもらえるだろうか」と考えていたとき、営業部から相談を受けました。
展示会のあとに、お礼メールを一人ずつ送るのがかなりの手間になっている
この作業はパターン化しやすく、Pythonでの自動化に向いています。これが、メール一括送信ソフト「NINJIN Mail」を作り始めたきっかけです。
開発の方向性を整理する|誰のための、どんなツールか
最初に、「誰に向けて」「何を実現するか」を整理しました。複雑な機能を詰め込むより、誰でも直感的に操作できることを優先しています。
機能要件
- 想定ユーザー:展示会のお礼メールや、セミナーの招待メールを送る営業担当者
- 名簿の読み込み:Excelファイルから氏名・アドレス・会社名を取得する
- 一括送信:読み込んだ情報を本文に差し込みながら送信する
- 送信記録:誰に送信したかをログとして残す
- 想定シーン:展示会のお礼メール、セミナーの招待メールなど
実装方針
要件を実現するための方針として、以下の5点を決めました。
必要なライブラリ|pandas・openpyxl・pywin32ほか
設計を実現するために必要なライブラリを整理すると、以下のようになります。
| 役割 | ライブラリ |
|---|---|
| Excelの読み書き | pandas / openpyxl |
| GUI(操作画面)の作成 | tkinter |
| Outlookの操作 | pywin32 |
| 設定ファイルの運用 | json |
| 送信日時の記録 | time |
補足:pywin32 は64bit版のWindows・Pythonでも問題なく動作します。ライブラリ側で自動調整されるため、利用する側で特別な対応は不要です。
ライブラリのインストール方法
インストールしていない場合は、コマンドプロンプトまたはWindows PowerShellで以下を実行してください。
まとめて入れる場合は pip install pandas openpyxl pywin32 の1行でも可能です。
インストール中にNumPyのWARNINGが出ることがありますが、最後に「Successfully installed」と表示されていれば問題ありません。
pandasでExcelの顧客データを読み込む【サンプルコード】
ここでは、pandas.read_excel() でExcelを読み込み、df.iterrows() で1行ずつデータを取り出す基本処理を実装します。
- 名簿用のExcelファイル名を
client_list.xlsxとします。 - この段階では、
client_list.xlsxをPythonコード(mail-soft-test01.py)と同じフォルダに置いてください。
サンプルコード:mail-soft-test01.py(※ VS Codeなどのエディターで実行してください)
import pandas as pd
def load_client_list(file_path):
try:
# Excelファイルを読み込む
df = pd.read_excel(file_path)
# 1行ずつ処理して読み込みを確認
for index, row in df.iterrows():
name = row['氏名']
email = row['アドレス']
company = row['会社名']
print(f"読み込み中: {company} {name} 様 ({email})")
except Exception as e:
print(f"エラーが発生しました: {e}")
# 実行(同じフォルダにExcelがある前提)
load_client_list('client_list.xlsx')実行結果と分かった課題
読み込みには成功しましたが、実用的なツールにするには、この段階で以下の課題が残っています。いずれも第2回以降で解決していきます。
| 課題 | 内容 |
|---|---|
| 1ファイルパスの制約 | Pythonファイルと同じフォルダにExcelを置かないと動作しない(→ 第2回で filedialog により解決) |
| 2列名(ヘッダー)への依存 | row['氏名'] のように列名を直接指定するため、Excel側の見出し行が一致しないと KeyError になる |
| 3空行への対応 | 名簿の途中に空行があると、その行の読み取りでエラーになるため改良が必要(dropna() など) |
まとめ|次回はファイル選択画面を実装する
第1回では、ツールの設計方針を整理し、pandas の read_excel() と df.iterrows() でExcel名簿を1行ずつ読み込む基本処理を実装しました。ただし現状はまだ「プログラム」の段階で、ツールとしての使いやすさには課題が残っています。
次回(第2回)は、Windowsで見慣れた「ファイルを開く」画面を tkinter の filedialog で実装し、さらに「直前に選んだフォルダを記憶する」仕組みを config.json で追加して、操作性を改善します。
PR
今回紹介したコードを含む開発の詳細は、noteでフルコード付きで販売しています。環境構築なしですぐ使えるパッケージ版もあります。コードに関心がある方も、コードは難しそうと感じる方も、内容だけでも覗いてみてください。
👉 noteでチェックする次に読む記事
よくある質問(pandas・read_excel・Excel名簿の読み込み)
Qimport pandas で ModuleNotFoundError: No module named ‘pandas’ になります
Apandas が未インストールです。コマンドプロンプトかWindows PowerShellで pip install pandas を実行してください。複数のPythonが入っている環境では、python -m pip install pandas のように実行中のPythonを明示すると確実です。
Qpd.read_excel() で「xlrd」や「openpyxl」が必要というエラーが出ます
A.xlsx ファイルの読み込みには openpyxl が必要です。pip install openpyxl を実行してください。古い .xls 形式の場合は xlrd が必要になります。
QExcelに複数シートがあります。特定のシートだけ読みたいです
Apd.read_excel(file_path, sheet_name=”名簿”) のように sheet_name にシート名(またはインデックス番号)を渡します。指定しないと先頭シートが読み込まれます。
Qrow[‘氏名’] で KeyError: ‘氏名’ になります
AExcelの見出し行(1行目)の列名と、コードで指定した文字列が完全に一致していないときに起きます。全角スペースや前後の空白、「氏 名」のような中黒・スペースの有無が原因になりがちです。print(df.columns.tolist()) で実際の列名を確認してください。
Q名簿の途中に空行があると処理が止まります
A空行があるとその行の値が NaN になり、後続の処理でエラーになることがあります。df = df.dropna(subset=[“アドレス”]) のように、必須列が空の行を事前に除外すると安全です。
Follow me on X
本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕
@ninjin_py_vba をフォローシリーズ記事一覧
電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。
-
FILE.01 — IoT
Raspberry Pi Pico W × GASラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
「外出中のペットの室温が心配…」そんな思いからスタートしたIoT自作プロジェクトの総集編。温湿度監視からエアコン遠隔操作まで、仕組みをゼロから作りたい方のための全5回の開発記録です。
シリーズを読む -
FILE.02 — CNC
Arduino × レーザー刻印CNCCNC自作シリーズ
高精度な加工を目指し、本格的な自作CNC製作に挑戦中。現在は基幹パーツであるオリエンタルモーターの納品を待つ「設計・準備編」を公開。ハードとソフトの両面から、理想のマシンを形にする過程をリアルタイムにお届けします。
シリーズを読む -
FILE.03 — XY軸制御
Raspberry Pi × ステッピングモーターXYテーブルシリーズ
Raspberry Piとステッパモーターを使い、ゼロから2軸制御に挑む記録。OS設定から回路設計、多軸制御のPythonコードまで、躓きやすいポイントを徹底図解。電子工作初心者が「動く感動」を味わうための実戦ガイドです。
シリーズを読む -
FILE.04 — 業務自動化
Python × Excel × CustomTkinter【Python開発記】NINJIN Mail制作記
PythonとExcelを連携させ、実務で即戦力となるメール送信ツールを開発。CustomTkinterによるUI構築や、ミスを防ぐテンプレート活用術など、現場の「痒い所に手が届く」自動化ノウハウを細部まで丁寧に解説します。
シリーズを読む -
FILE.05 — 業務自動化
Python × Excel × GUIアプリ化Invoice Maker(請求書・見積書自動作成)
手作業の請求書作成から卒業!PythonでExcelデータを読み込み一括PDF化する「Invoice_Maker」の作り方を全3回で解説。基本ロジックからGUIアプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む








コメント