iDempiere メールテンプレートの使い方|取引先管理 操作マニュアル・技術仕様
📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。
メールテンプレートは、督促状・請求書送付・リクエスト通知などで送信するメールの件名と本文を、変数付きの雛形として登録するマスタです。@Name@ のような変数が送信時に実データへ置換されます。
📌 ポイント: 変数の解決順序は ユーザー/担当者 → 取引先 → 業務オブジェクト(リクエスト・督促など) の3段階です。
@Name@はまずユーザー名として解決され、ユーザーが未設定なら取引先名、それも無ければ業務オブジェクトの名称になります。
メールテンプレートでできること
Section titled “メールテンプレートでできること”- メール件名(
件名)と本文(メール本文〜メール本文3)の雛形登録 @カラム名@形式の変数によるユーザー・取引先・業務オブジェクト情報の差し込み- HTML メールの作成(
HTMLフラグ) - 言語ごとの翻訳登録(取引先の言語設定に応じて自動切替)
- 送信済みメールの履歴確認(ユーザーメールタブ)
- 督促・資産納品・請求書印刷・リクエストなど、コア機能からの参照
メールテンプレートは3タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| メールテンプレート | R_MailText | 9項目 | 件名・本文・HTMLフラグ |
| 翻訳 | R_MailText_Trl | 11項目 | 言語ごとの件名・本文 |
| ユーザーメール | AD_UserMail | 7項目 | このテンプレートで送信した履歴 |
💡 ヒント: 本文が3つ(
メール本文/メール本文2/メール本文3)に分かれているのは、送信時に「本文2・本文3を含めるかどうか」を切り替えられるようにするためです。共通の署名や注意書きをメール本文3に置いておくと再利用しやすくなります。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>取引先管理 > メールテンプレート"] --> B["➕ 新規で名称を入力"]
B --> C["✉️ 件名を入力<br/>(変数を使用可)"]
C --> D["📝 メール本文を入力<br/>(必須)"]
D --> E{HTMLメールか}
E -->|はい| F["🔤 HTML にチェック<br/>本文にHTMLタグを記述"]
E -->|いいえ| G["プレーンテキストのまま"]
F --> H["➕ 必要なら<br/>メール本文2・3 を入力"]
G --> H
H --> I["💾 保存"]
I --> J{多言語運用か}
J -->|はい| K["🌐 翻訳タブで<br/>言語別の件名・本文を登録"]
J -->|いいえ| L["🔗 督促・リクエスト等から<br/>テンプレートを選択して送信"]
K --> L
L --> M["📜 ユーザーメールタブで<br/>送信結果を確認"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「取引先管理 > メールテンプレート」を開きます。
新規登録(必須項目ベースの手順)
Section titled “新規登録(必須項目ベースの手順)”- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 名称: テンプレート名(60文字以内、例:
督促状_初回) - メール本文: 本文(必須)
- HTML: HTML タグを含む場合にチェック
- 有効: 既定でチェック済み
- 名称: テンプレート名(60文字以内、例:
- 任意項目を入力:
- 件名: メールの Subject(2000文字以内)
- メール本文2 / メール本文3: 追加の本文パート(各2000文字以内)
- 「保存」をクリック
変数(差し込み)の書き方
Section titled “変数(差し込み)の書き方”本文・件名には @カラム名@ の形式で変数を埋め込みます。
| 記述例 | 解決される値 |
|---|---|
@Name@ | ユーザー名 → 取引先名 → 業務オブジェクトの名称(この優先順) |
@DocumentNo@ | 対象業務オブジェクトの伝票番号 |
@GrandTotal@ | 対象業務オブジェクトの総合計 |
⚠️ 注意: 変数は「送信時にどの業務オブジェクトが渡されるか」に依存します。督促なら取引先と督促エントリ、資産納品なら資産、請求書印刷なら取引先と請求書が渡されます。テンプレートを使う機能ごとに利用可能な変数が変わる点に注意してください。
- 「翻訳」タブに移動
- 対象の言語を選択し、名称・件名・メール本文を当該言語で入力
- 翻訳するにチェックを入れて保存
多言語システムでは、テンプレートは取引先の言語設定に基づいて自動的に翻訳版が選択されます。
項目リファレンス
Section titled “項目リファレンス”メールテンプレートタブ
Section titled “メールテンプレートタブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 名称 | 必須 | 文字列(60) | テンプレート名 |
| 有効 | 必須 | チェック | レコードが有効か(既定 Y) |
| 件名 | - | 文字列(2000) | メールの Subject |
| メール本文 | 必須 | テキスト | 本文(第1パート) |
| メール本文2 | - | テキスト(2000) | 本文(第2パート) |
| メール本文3 | - | テキスト(2000) | 本文(第3パート) |
| HTML | 必須 | チェック | 本文が HTML タグを含むか |
ユーザーメールタブ(送信履歴)
Section titled “ユーザーメールタブ(送信履歴)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| メールテンプレート | - | 選択 | 使用したテンプレート |
| ユーザー | 必須 | 検索 | 送信先ユーザー |
| メッセージID | - | 文字列 | メールの Message-ID |
| 送信確認 | - | 文字列 | 配信確認の結果文字列 |
| 送付済み | - | リスト | 配信状態(済み/未達/不明) |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. @Name@ が想定と違う名前に置換されます
Section titled “Q. @Name@ が想定と違う名前に置換されます”変数の解決順序が ユーザー/担当者 → 取引先 → 業務オブジェクト の順だからです。ユーザー(AD_User)が渡されている場面では、常にユーザー名が優先されます。取引先名を確実に出したい場合は取引先固有のカラム名を指定してください。
Q. HTML メールにしたのにタグがそのまま表示されます
Section titled “Q. HTML メールにしたのにタグがそのまま表示されます”HTML(IsHtml)フラグがオフのままだと、本文はプレーンテキストとして送信されます。HTML タグを使う場合は必ずチェックを入れてください。
Q. 「メール本文2」「メール本文3」は必ず送信されますか?
Section titled “Q. 「メール本文2」「メール本文3」は必ず送信されますか?”いいえ。MMailText.getMailText(boolean all) の all 引数で切り替わります。all=false なら第1パートのみ、all=true なら本文1〜3を結合したものが返されます。どちらで呼ばれるかは送信元の機能次第です。
Q. 送信したメールの履歴はどこで確認できますか?
Section titled “Q. 送信したメールの履歴はどこで確認できますか?”「ユーザーメール」タブに AD_UserMail のレコードとして残ります。メッセージID・送信確認・送付済み から配信状況を確認できます。MUserMail は isDelivered() / isDeliveredNo() / isDeliveredUnknown() の3状態を判定します。
Q. テンプレートを削除できますか?
Section titled “Q. テンプレートを削除できますか?”R_MailText は削除可(IsDeleteable=Y)ですが、リクエストや督促から参照されているテンプレートは外部キー制約で削除できません。運用終了したテンプレートは「有効」のチェックを外してください。
🛠 技術仕様(開発者向け)
メールテンプレートは R_MailText テーブル(アクセスレベル 7 = システム/クライアント/組織、削除可)に格納されます。モデルクラスは MMailText(508行)で、変数解析(parse)・翻訳解決・差し込み対象オブジェクトの保持を担います。送信履歴は AD_UserMail(MUserMail、188行、削除不可)に記録されます。翻訳は R_MailText_Trl(生成クラスのみ)で保持し、MMailText 内部の MMailTextTrl を CCache にキャッシュします。Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MMailText {
+getMailText(boolean all) String
+getMailText(boolean all, boolean parsed) String
+getMailHeader(boolean parsed) String
+setUser(MUser) void
+setBPartner(MBPartner) void
+setPO(PO po, boolean analyse) void
+setLanguage(String) void
-parse(String, PO, boolean) String
-parseVariable(String, PO, boolean) String
-translate() void
-getTranslation(String) MMailTextTrl
}
class X_R_MailText {
<<generated>>
}
class MUserMail {
+isDelivered() boolean
+isDeliveredNo() boolean
+isDeliveredUnknown() boolean
+setSenderAndRecipient(EMail) void
}
class X_AD_UserMail {
<<generated>>
}
class PO {
<<abstract>>
}
MMailText --|> X_R_MailText
X_R_MailText --|> PO
MUserMail --|> X_AD_UserMail
X_AD_UserMail --|> PO
MMailText --> MUserMail : logs delivery
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MMailText.java、MUserMail.java
関連DBテーブル
Section titled “関連DBテーブル”R_MailText(メールテンプレート)
Section titled “R_MailText(メールテンプレート)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| R_MailText_ID | ID | PK | テンプレートID | 主キー |
| R_MailText_UU | UUID(36) | N | UUID | |
| AD_Client_ID | Table Direct | Y | クライアント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定 @#AD_Org_ID@ |
| Name | String(60) | Y | 名称 | 識別子 |
| MailHeader | String(2000) | N | 件名 | 変数使用可 |
| MailText | Text | Y | メール本文 | 第1パート・必須 |
| MailText2 | Text(2000) | N | メール本文2 | 第2パート |
| MailText3 | Text(2000) | N | メール本文3 | 第3パート |
| IsHtml | Yes-No | Y | HTML | 本文が HTML か |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
AD_UserMail(ユーザーメール/送信履歴)
Section titled “AD_UserMail(ユーザーメール/送信履歴)”| カラム名 | 型 | 必須 | 説明 |
|---|---|---|---|
| AD_UserMail_ID | ID | PK | 送信履歴ID |
| R_MailText_ID | Table Direct | N | 使用テンプレート |
| AD_User_ID | Search | Y | 送信先ユーザー |
| MessageID | String | N | Message-ID |
| DeliveryConfirmation | String | N | 配信確認 |
| IsDelivered | List | N | 配信状態 |
📌 ポイント:
AD_UserMailはIsDeleteable=N(削除不可)のテーブルです。送信履歴を UI から消すことはできません。監査証跡として設計されています。
erDiagram
R_MailText ||--o{ R_MailText_Trl : "translations"
R_MailText ||--o{ AD_UserMail : "send log"
R_MailText ||--o{ R_Request : "used by request"
AD_UserMail }o--|| AD_User : "recipient"
ビジネスロジック
Section titled “ビジネスロジック”変数の解決順序
Section titled “変数の解決順序”MMailText は差し込み対象として ユーザー(MUser)/取引先(MBPartner)/任意の業務オブジェクト(PO) の3つを保持します。parse() が変数を検出すると、この順で値を探索します。
flowchart TD
A["本文中の @変数@ を検出"] --> B{"User が設定済み<br/>かつ該当カラムあり?"}
B -->|Yes| C["ユーザーの値を使用"]
B -->|No| D{"BPartner が設定済み<br/>かつ該当カラムあり?"}
D -->|Yes| E["取引先の値を使用"]
D -->|No| F{"業務オブジェクト PO に<br/>該当カラムあり?"}
F -->|Yes| G["業務オブジェクトの値を使用"]
F -->|No| H["置換せずに残す"]
対象オブジェクトの設定 API:
| メソッド | 用途 |
|---|---|
setUser(int) / setUser(MUser) | ユーザー/担当者を設定 |
setBPartner(int) / setBPartner(MBPartner) | 取引先を設定 |
setPO(PO) / setPO(PO, boolean analyse) | 業務オブジェクトを設定。analyse=true で関連ユーザー・取引先も自動抽出 |
setLanguage(String) | 使用言語を指定(翻訳解決に使用) |
| メソッド | 返却内容 |
|---|---|
getMailText() | 第1パートのみ |
getMailText(boolean all) | all=true で本文1〜3を結合 |
getMailText(boolean all, boolean parsed) | parsed=false で変数を未置換のまま取得 |
getMailText(boolean all, boolean parsed, boolean keepEscapeSequence) | エスケープシーケンスの保持を制御 |
getMailHeader() / getMailHeader(boolean parsed) | 件名の取得 |
translate() と getTranslation(String AD_Language) が R_MailText_Trl を参照します。翻訳結果は静的キャッシュ CCache<String,MMailTextTrl>(サイズ20)に保持されるため、同一言語の繰り返し参照は DB アクセスを伴いません。
⚠️ 注意: 翻訳がキャッシュされるため、
R_MailText_Trlを DB 直更新した場合は反映されないことがあります。UI から更新するか、キャッシュリセット(REST のDELETE /api/v1/cachesなど)を行ってください。
送信履歴の記録
Section titled “送信履歴の記録”MUserMail はテンプレート・ユーザー・EMail オブジェクトを受け取るコンストラクタ(MUserMail(MMailText parent, int AD_User_ID, EMail mail))を持ち、送信時に履歴を作成します。setSenderAndRecipient(EMail) が送信者・受信者を、getRecipientWithCommaSeparator(InternetAddress[]) が複数宛先をカンマ区切り文字列に整形します。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”Callout
Section titled “Callout”R_MailText / R_MailText_Trl / AD_UserMail のカラムには Callout の登録がありません。一方、リクエスト側の R_Request.R_MailText_ID には org.compiere.model.CalloutRequest.copyMail が登録されており、リクエストでテンプレートを選ぶと本文が複写されます。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomMailTextValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MMailText && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MMailText mt = (MMailText) po; // 例: HTML フラグ未設定なのにタグが含まれていたら警告 String text = mt.get_ValueAsString("MailText"); if (!mt.isHtml() && text != null && text.contains("<br")) { throw new AdempiereException("HTMLタグを使う場合は HTML にチェックしてください"); } } return null; }}独自変数の追加
Section titled “独自変数の追加”parseVariable() は protected メソッドのため、MMailText を継承したクラスでオーバーライドし、IModelFactory で差し替えることで独自変数(例: 自社の敬称ルールに沿った宛名)を追加できます。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”メールテンプレートは変数解決の仕組みを理解すれば、督促・受注確認・出荷通知などの定型連絡を大幅に自動化できます。独自変数の追加や送信フローの組み込みもご相談いただけます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。