はじめに
早速ですが、「ファイルをメールに自動的に添付して送信したい」と、言う要望を聞いたことがあります。
面白そうな課題でしたので、自分なりに解決方法を考えてみました。
その要望の詳細としては、「取引先ごとに送信したいファイルが違うので、取引先ごとに個別のファイルを用意して、それをメールに自動添付して送信したい」と、言う内容でした。
確かに、これを人の手で一通ずつファイルを添付して送信するのは、とても大変ですし、もし添付するファイルを間違えてしまうと、もう大変ですね。。。
今回の要望が、皆さまの業務にそのまま当てはまる可能性は低いかもしれませんが、関連するレコードを自動的に紐づけたいなど他の要望にも応用できるのかなと思い記事を書いてみました。
実装案
大まかな操作の流れ- 取引先責任者に設けた、メール送信用のスイッチを入れる
- 指定されたメールテンプレートにファイルを自動添付して、メールが自動送信される
基本な操作- メールの送信対象の取引先責任者の画面で、「メールステータス」を”送信予定”に変更すると自動的にメールが送信される
- 送信されるメールは、取引先責任者に登録した「メールテンプレート名」のメールテンプレートにファイルが添付されて、メールが自動送信されます。

応用的な操作
- データローダまたはインポートウィザード、リストビュー、画面フローなどで、取引先責任者のメール送信に必要な項目(「メールステータス」”送信予定”、「メールテンプレート名」、「メール添付ファイルあり」)に値を入れることで、複数の取引先責任者へ一括でメール送信を行うことができます。
(データローダまたはインポートウィザードの場合)

(リストビューの場合)

(画面フローの場合)
設定内容(自動送信用のメールテンプレートを用意)- 自動でメール送信する際に利用するメールテンプレートを、メールテンプレート名で検索する想定のため、メールテンプレート名はユニークにする必要があります。
メールテンプレート名の例)好きな食べ物アンケート2024
(取引先ごとに用意したファイルをsalesforceにアップロード)- salesforceのファイルから、複数のファイルをアップロードすることが可能です。

- それぞれの取引先に紐づけてファイルを大量にアップロードしたい場合は、データローダまたはインポートウィザードでファイルをアップロードします。
- アップロードするファイルのファイル名には、「メールテンプレート名」と、「取引先名(または取引先id)」を、つなげた名前を付けます。
- ファイル名をユニークにすることで、メールの自動送信時にファイルを自動添付することができます。
- ファイル名の例)好きな食べ物アンケート2024_AAA社
(項目の作成)- メールステータス 選択リスト(送信予定、エラー、送信済み)
- メール送信予定日 日時
- メールテンプレート名 テキスト
- メール添付ファイルあり チェックボックス
- メール送信アラート ロングテキスト
- メールを自動送信ができなかった場合に、エラーのメッセージを表示するための項目です。
(フローの作成) 取引先責任者メール送信とファイル自動貼付- 開始条件
- レコードフロートリガー 取引先責任者 レコードが作成または更新された
- 「メールステータス」が”送信予定”になった時
- 即時実行
- 「メールステータス」が”送信予定”になるとフローが実行される
- 入力された情報に間違いが無いかチェックする
- 取引先責任者の「メールテンプレート名」に入力があるか
- 「メールテンプレート」レコードが存在するのか
- 添付ファイルは必要なのか
- 指定したファイルは存在するのか
- ファイルは、「コンテンツドキュメント」レコードを検索します。
- 「2.」でエラーと判定された場合は、取引先責任者レコードの、「メールステータス」を”エラー”として処理を終了する
- 「2.」でエラーではない場合は、「メール送信予定日」が空白、または過の場合に、「メール送信予定日」に現在の日時を自動設定する
- スケジュール済みパス
・「メール送信予定日」の1分後に実行する- 即時実行の「2.入力された情報に間違いが無いかチェックする」を実行する
- 「1.」でエラーと判定された場合は、「取引先責任者」レコードの、「メールステータス」を”エラー”として処理を終了する
- 「1.」でエラーではない場合は、ファイル名が”メールテンプレート名_取引先名(または取引先id)”を検索し、そのファイルをメールテンプレートに紐づける
- そのメールテンプレートを利用して、取引先責任者宛にメールを自動送信する
- メールテンプレートに紐づけたファイルを削除する
- メール送信がエラーの場合は、取引先責任者の「メールステータス」を”エラー”として処理を終了する
- メール送信が成功した場合は、取引先責任者の「メールステータス」を”送信済み”として処理を終了する
- 備考
- なぜ、メールテンプレートにファイルを添付したり削除したりしているのかですが、フローの「メール送信」アクションには、ファイルを添付するオプションが無いからです。
そのため、メールを送信する時に、対象のファイルをメールテンプレートに添付して、送信処理が終わったらその添付したファイルを削除する処理を行っています。 - 同じメールテンプレートに添付ファイルを紐づけて、メール送信を1通ずつ行いたいので、スケジュール済みパスを利用して1件ずつ(バッチサイズ 1)の処理を行います。
なお、即時実行で、その処理を行うと、違う取引先用のファイルもメールに添付されてしまうのでNGです。 - メールテンプレートにファイルを添付するためには、「コンテンツドキュメントリンク」レコードを作成します。
「添付するファイルのid」と「添付されるレコードid」を、指定したレコードを作成します。
フロー図のイメージメインフロー:レコードトリガーフロー

おわりに
今回は、メール送信時に添付ファイルを自動で紐付ける、実装案を説明しました。
シンプルな説明にしたかったので、取引先責任者にメール送信のための項目を作成しましたが、自動送信用のオブジェクトを用意してそこで管理するのも良いのかなとも思いました。
また、フローの「メールアクション」で、添付ファイルを指定できないと言う、衝撃的な事実を知ることになりました。(私が知らなかっただけですけど。。。)
あと、当たり前の話かもしれませんが、エラー処理も大切だなと、設定していてつくづく思いました。
なぜエラーになったのかを、確認しやすい所に残しておくのは大事です。
それと、この記事には載せていませんが、今回工夫した点は、「入力された情報に間違いが無いかチェックする」をサブフロー化して、「即時実行」の時と、「スケジュール済みパス実行」の時にも、チェックを掛けられるようにしたところです。
始めのうちは、サブフロー化せずにスケジュール済みパスにだけ、チェックを掛けていたのですが、動作テストを行っている時に、1〜2分後にエラーだったことが分かるのは、違うなと思ったので、即時実行でも同じチェックを掛けられるようにサブフロー化しようと思いました。
ご参考:
サブフローって、どんな時に作るんですか?皆さまの、何かの気付きになれば幸いです。
ご活用ください。
{{i18n("articles.view.premium")}}