Apex

Apexでメールの差出人を組織のアドレスにする実装

Apexから送るメールの差出人は、初期状態では実行ユーザー個人のメールアドレスになります。組織のメールアドレスを登録し、差出人として設定する実装を説明します。

2025.07.17

なぜ差出人を組織のアドレスにするのか

Messaging.SingleEmailMessageは、差出人を指定しなければ実行ユーザーのメールアドレスから送信します。自動化で送るメールの差出人が担当者ごとにバラバラでは、受け取る側が混乱します。「〇〇システムからの通知」のように差出人を統一したいときは、組織のメールアドレス(Organization-Wide Email Address)を登録し、そこから送信します。

組織のメールアドレスを登録する

  1. 組織のメールアドレスの設定を開く

    設定から「組織のメールアドレス」を開きます。

  2. 追加ボタンを押す

    「表示名」と「メールアドレス」を入力します。表示名は、受信者に「差出人」として表示される文字列です。

  3. プロファイルの利用範囲を選ぶ

    すべてのプロファイルで使うか、特定のプロファイルだけに絞るかを選びます。

  4. 保存して検証メールを確認する

    保存すると、登録したメールアドレス宛に確認メールが届きます。このメールで検証を済ませるまで、そのアドレスは差出人として使えません。

設定の組織のメールアドレス画面。追加ボタンが赤枠で囲まれ、アドレスは未登録
設定の「組織のメールアドレス」です。赤枠の追加ボタンから登録をはじめます。
組織のメールアドレスの編集画面。表示名とメールアドレスの欄が赤枠で囲まれている
赤枠の表示名が、受信者に差出人として表示される文字列です。下でプロファイルの利用範囲を選びます。

Apexで組織のメールアドレスを取得する

差出人IDを直接コードに書くと、Sandboxと本番で値が変わり、環境をまたいだときに動かなくなります。表示名をバインド変数にしたSOQLで検索してから使うほうが、環境をまたいでも動きます。

public with sharing class OrgWideEmailSender {
    public static void sendNotice(String orgWideDisplayName) {
        List<OrgWideEmailAddress> addresses = [
            SELECT Id
            FROM OrgWideEmailAddress
            WHERE DisplayName = :orgWideDisplayName
            LIMIT 1
        ];
        if (addresses.isEmpty()) {
            throw new NoDataFoundException('組織のメールアドレスが見つかりません: ' + orgWideDisplayName);
        }

        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        mail.setToAddresses(new List<String>{ 'xxxxxxxx@example.com' });
        mail.setOrgWideEmailAddressId(addresses[0].Id);
        mail.setReplyTo('xxxxxxxx@example.com');
        mail.setSubject('sample title');
        mail.setPlainTextBody('sample text');
        Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{ mail });
    }

    public class NoDataFoundException extends Exception {}
}

表示名で組織のメールアドレスを検索し、差出人として設定します。

setOrgWideEmailAddressId()には、直接IDの文字列(0D2XXXXXXXXXXXXのような形です)を渡すこともできます。ただし前述のとおり、環境ごとに値が変わるため、検索して取得する形をおすすめします。

受信したメール。差出人が「組織のアドレス」と表示され、本文はsample text
受信側の画面です。赤枠の差出人が、登録した表示名になっていることを確認します。

クイックアクションに置く

このメール送信をレコード詳細のボタンから呼びたい場合、旧来の「カスタムボタン」よりクイックアクションとして配置するほうが安定します。公式ヘルプには「Some URL custom buttons open links in the same tab, even if the button behavior is set to open in a new window(URLカスタムボタンの一部は、新規ウィンドウで開く設定でも同じタブで開きます)」という記載があり、カスタムボタンの挙動はLightning Experienceで設定どおりにならないことがあります。

Visualforceページをそのまま使うなら、対象オブジェクトの「ボタン、リンク、アクション」から新規アクションを作成し、アクションの種類に「Visualforce」を選んでページを指定します。カスタムボタンとして置くより、レイアウトのアクション領域に組み込みやすくなります。

開いたVisualforceページ。中央にメール送信ボタンだけが表示されている
ボタンから開いたVisualforceページです。赤枠のメール送信を押すと送信が走ります。

送信数の上限を確認する

上限数値
1トランザクションあたりのsendEmail呼び出し10回
1通あたりのTo・Cc・Bccの合計宛先数150件
1日あたりの送信先数5,000人(トライアル組織は15人)

この上限は、組織のメールアドレスを使っても変わりません。差出人をどれに設定しても、Apexからの送信としてカウントされます。

ここで間違えやすい

間違い何が起きるか
検証前の組織のメールアドレスを指定する差出人として使えず、送信が失敗します
差出人IDを文字列でコードに直書きするSandboxと本番でIDが違い、環境をまたぐと動きません
表示名の検索結果が0件のときの処理を書かない例外が発生し、原因が追いにくくなります
カスタムボタンの「新規ウィンドウで開く」設定を過信するLightning Experienceでは同じタブで開くことがあります

確認した環境

  • 2026年9月 / Salesforce Summer '26(APIバージョン 67.0)時点の公式ドキュメントで、setOrgWideEmailAddressIdの仕様と送信数の上限を確認しています

まとめ

  • 差出人を指定しなければ、メールは実行ユーザー個人のアドレスから送信されます
  • 組織のメールアドレスは、登録後にメール検証を済ませるまで差出人として使えません
  • 差出人IDは直書きせず、表示名をバインド変数にしたSOQLで検索して取得します
  • レコード詳細に置くなら、カスタムボタンよりクイックアクションのほうが挙動が安定します
  • 送信数の上限は差出人を変えても同じで、1トランザクション10回・1通150宛先・1日5,000人です

参考:当時の画面

記事を最初に書いた当時の画面です。いまの手順と違うところは、各画像の説明に書いています。

取引先のカスタムボタン詳細画面。呼び出すVisualforceページ名が赤枠で囲まれている
カスタムボタンとして作った場合の詳細です。赤枠で呼び出すVisualforceページを指定します。
取引先のページレイアウト編集画面。カスタムボタンの枠に配置したボタンが赤枠で囲まれている
ページレイアウトのカスタムボタン欄です。ここに置いて初めてレコード画面に出ます。
取引先テスト001の詳細画面。ボタン行に追加したボタンが赤枠で囲まれている
レコード詳細に出たボタンです。赤枠の位置にボタンが並びます。

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。