コンテンツにスキップ

iDempiere メールテンプレートの使い方|取引先管理 操作マニュアル・技術仕様

📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。

メールテンプレートは、督促状・請求書送付・リクエスト通知などで送信するメールの件名と本文を、変数付きの雛形として登録するマスタです。@Name@ のような変数が送信時に実データへ置換されます。

📌 ポイント: 変数の解決順序は ユーザー/担当者 → 取引先 → 業務オブジェクト(リクエスト・督促など) の3段階です。@Name@ はまずユーザー名として解決され、ユーザーが未設定なら取引先名、それも無ければ業務オブジェクトの名称になります。

メールテンプレートでできること

Section titled “メールテンプレートでできること”
  • メール件名(件名)と本文(メール本文メール本文3)の雛形登録
  • @カラム名@ 形式の変数によるユーザー・取引先・業務オブジェクト情報の差し込み
  • HTML メールの作成(HTML フラグ)
  • 言語ごとの翻訳登録(取引先の言語設定に応じて自動切替)
  • 送信済みメールの履歴確認(ユーザーメールタブ)
  • 督促・資産納品・請求書印刷・リクエストなど、コア機能からの参照

メールテンプレートは3タブ構成です。

タブ名テーブル項目数役割
メールテンプレートR_MailText9項目件名・本文・HTMLフラグ
翻訳R_MailText_Trl11項目言語ごとの件名・本文
ユーザーメールAD_UserMail7項目このテンプレートで送信した履歴

💡 ヒント: 本文が3つ(メール本文メール本文2メール本文3)に分かれているのは、送信時に「本文2・本文3を含めるかどうか」を切り替えられるようにするためです。共通の署名や注意書きを メール本文3 に置いておくと再利用しやすくなります。

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/>送信結果を確認"]

メニューから開く 取引先管理 > メールテンプレート 新規で名称を入力 件名を入力 (変数を使用可) メール本文を入力 (必須) HTML にチェック 本文にHTMLタグを記述 プレーンテキストのまま 必要なら メール本文2・3 を入力 保存 翻訳タブで 言語別の件名・本文を登録 督促・リクエスト等から テンプレートを選択して送信 ユーザーメールタブで 送信結果を確認 HTMLメールか 多言語運用か はい いいえ

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

メニューから「取引先管理 > メールテンプレート」を開きます。

新規登録(必須項目ベースの手順)

Section titled “新規登録(必須項目ベースの手順)”
  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 名称: テンプレート名(60文字以内、例: 督促状_初回
    • メール本文: 本文(必須)
    • HTML: HTML タグを含む場合にチェック
    • 有効: 既定でチェック済み
  3. 任意項目を入力:
    • 件名: メールの Subject(2000文字以内)
    • メール本文2 / メール本文3: 追加の本文パート(各2000文字以内)
  4. 保存」をクリック

本文・件名には @カラム名@ の形式で変数を埋め込みます。

記述例解決される値
@Name@ユーザー名 → 取引先名 → 業務オブジェクトの名称(この優先順)
@DocumentNo@対象業務オブジェクトの伝票番号
@GrandTotal@対象業務オブジェクトの総合計

⚠️ 注意: 変数は「送信時にどの業務オブジェクトが渡されるか」に依存します。督促なら取引先と督促エントリ、資産納品なら資産、請求書印刷なら取引先と請求書が渡されます。テンプレートを使う機能ごとに利用可能な変数が変わる点に注意してください。

  1. 翻訳」タブに移動
  2. 対象の言語を選択し、名称件名メール本文を当該言語で入力
  3. 翻訳するにチェックを入れて保存

多言語システムでは、テンプレートは取引先の言語設定に基づいて自動的に翻訳版が選択されます。

項目名必須説明
クライアント必須選択テナント
組織必須選択組織
名称必須文字列(60)テンプレート名
有効必須チェックレコードが有効か(既定 Y)
件名-文字列(2000)メールの Subject
メール本文必須テキスト本文(第1パート)
メール本文2-テキスト(2000)本文(第2パート)
メール本文3-テキスト(2000)本文(第3パート)
HTML必須チェック本文が HTML タグを含むか

ユーザーメールタブ(送信履歴)

Section titled “ユーザーメールタブ(送信履歴)”
項目名必須説明
メールテンプレート-選択使用したテンプレート
ユーザー必須検索送信先ユーザー
メッセージID-文字列メールの Message-ID
送信確認-文字列配信確認の結果文字列
送付済み-リスト配信状態(済み/未達/不明)

全項目一覧はリファレンス参照

Q. @Name@ が想定と違う名前に置換されます

Section titled “Q. @Name@ が想定と違う名前に置換されます”

変数の解決順序が ユーザー/担当者 → 取引先 → 業務オブジェクト の順だからです。ユーザー(AD_User)が渡されている場面では、常にユーザー名が優先されます。取引先名を確実に出したい場合は取引先固有のカラム名を指定してください。

Q. HTML メールにしたのにタグがそのまま表示されます

Section titled “Q. HTML メールにしたのにタグがそのまま表示されます”

HTMLIsHtml)フラグがオフのままだと、本文はプレーンテキストとして送信されます。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送信確認送付済み から配信状況を確認できます。MUserMailisDelivered() / isDeliveredNo() / isDeliveredUnknown() の3状態を判定します。

Q. テンプレートを削除できますか?

Section titled “Q. テンプレートを削除できますか?”

R_MailText は削除可(IsDeleteable=Y)ですが、リクエストや督促から参照されているテンプレートは外部キー制約で削除できません。運用終了したテンプレートは「有効」のチェックを外してください。

🛠 技術仕様(開発者向け)

メールテンプレートは R_MailText テーブル(アクセスレベル 7 = システム/クライアント/組織、削除可)に格納されます。モデルクラスは MMailText(508行)で、変数解析(parse)・翻訳解決・差し込み対象オブジェクトの保持を担います。送信履歴は AD_UserMailMUserMail、188行、削除不可)に記録されます。翻訳は R_MailText_Trl(生成クラスのみ)で保持し、MMailText 内部の MMailTextTrlCCache にキャッシュします。Document 型ではありません。

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

+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 <> +isDelivered() boolean +isDeliveredNo() boolean +isDeliveredUnknown() boolean +setSenderAndRecipient(EMail) void <> > X_R_MailText X_R_MailText -- > X_AD_UserMail X_AD_UserMail --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MMailText.javaMUserMail.java

R_MailText(メールテンプレート)

Section titled “R_MailText(メールテンプレート)”
カラム名必須説明備考
R_MailText_IDIDPKテンプレートID主キー
R_MailText_UUUUID(36)NUUID
AD_Client_IDTable DirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
NameString(60)Y名称識別子
MailHeaderString(2000)N件名変数使用可
MailTextTextYメール本文第1パート・必須
MailText2Text(2000)Nメール本文2第2パート
MailText3Text(2000)Nメール本文3第3パート
IsHtmlYes-NoYHTML本文が HTML か
IsActiveYes-NoY有効既定 Y

AD_UserMail(ユーザーメール/送信履歴)

Section titled “AD_UserMail(ユーザーメール/送信履歴)”
カラム名必須説明
AD_UserMail_IDIDPK送信履歴ID
R_MailText_IDTable DirectN使用テンプレート
AD_User_IDSearchY送信先ユーザー
MessageIDStringNMessage-ID
DeliveryConfirmationStringN配信確認
IsDeliveredListN配信状態

📌 ポイント: AD_UserMailIsDeleteable=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"

send log used by request

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["置換せずに残す"]

本文中の @変数@ を検出 User が設定済み かつ該当カラムあり? ユーザーの値を使用 BPartner が設定済み かつ該当カラムあり? 取引先の値を使用 業務オブジェクト PO に 該当カラムあり? 業務オブジェクトの値を使用 置換せずに残す

対象オブジェクトの設定 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 など)を行ってください。

MUserMail はテンプレート・ユーザー・EMail オブジェクトを受け取るコンストラクタ(MUserMail(MMailText parent, int AD_User_ID, EMail mail))を持ち、送信時に履歴を作成します。setSenderAndRecipient(EMail) が送信者・受信者を、getRecipientWithCommaSeparator(InternetAddress[]) が複数宛先をカンマ区切り文字列に整形します。

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”

R_MailText / R_MailText_Trl / AD_UserMail のカラムには Callout の登録がありません。一方、リクエスト側の R_Request.R_MailText_ID には org.compiere.model.CalloutRequest.copyMail が登録されており、リクエストでテンプレートを選ぶと本文が複写されます。

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;
}
}

parseVariable()protected メソッドのため、MMailText を継承したクラスでオーバーライドし、IModelFactory で差し替えることで独自変数(例: 自社の敬称ルールに沿った宛名)を追加できます。


メールテンプレートは変数解決の仕組みを理解すれば、督促・受注確認・出荷通知などの定型連絡を大幅に自動化できます。独自変数の追加や送信フローの組み込みもご相談いただけます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら