はじめに
今回はLightningでレコードに紐づけたファイルをApexで送信するメールに添付する方法をご紹介します。
実装
コードの全体像はこのようになっています・
public with sharing class EmailManager {
public static void sendMail(String recordId) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setToAddresses(new List<String> { 'target_mail@example.com' });
mail.setSubject('Subject');
mail.setPlainTextBody('Body');
ContentDocumentLink ContentDocumentLink = [SELECT ContentDocumentId, Id FROM ContentDocumentLink WHERE LinkedEntityId =: recordId];
String ContentDocumentLinkId = ContentDocumentLink.ContentDocumentId;
List<ContentVersion> cVer = [SELECT Id, Title, FileExtension, FileType, VersionData, ContentDocumentId FROM ContentVersion WHERE ContentDocumentId =: ContentDocumentLinkId AND IsLatest = true];
List<Messaging.EmailfileAttachment> fas = new List<Messaging.EmailfileAttachment>();
Messaging.EmailfileAttachment fa = new Messaging.EmailfileAttachment();
fa.setFileName(cVer[0].Title + '.' + cVer[0].FileExtension);
fa.setBody(cVer[0].VersionData);
fa.setInline(true);
fas.add(fa);
mail.setFileAttachments(fas);
Messaging.sendEmail(new List<Messaging.Email> { mail });
}
}
送信するメールの作成
メール送信するにあたってSingleEmailMessageを使用していきます。Emailクラスでもメールを送信することはできますが、後ほどファイルを添付する際に使用するEmailfileAttachmentメソッドはSingleEmailMessageにしかないため、こちらのクラスを使用して送信するメールを作成します。
target_mail@example.com
にはご自身のメールアドレスを入れることで、メールが送信されることを確認できます。
public with sharing class EmailManager {
public static void sendMail(String recordId) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setToAddresses(new List<String> { 'target_mail@example.com' });
mail.setSubject('Subject');
mail.setPlainTextBody('Body');
}
}
添付するファイルの取得
レコードに紐づけたファイルのデータ自体はContentDocumentオブジェクトに格納されますが、どのレコードと紐づいているかはContentDocumentLinkで管理されています。そのため親となるレコードIDを使って紐づいているファイルを取得するにはContentDocumentLinkレコードを取得します。
※ContentDocumentのオブジェクト関係については下記の記事を参考にさせていただきました。
https://qiita.com/panxl/items/c8a4d5ffe7fe92f6a3ab
ContentDocumentLink ContentDocumentLink = [SELECT ContentDocumentId, Id FROM ContentDocumentLink WHERE LinkedEntityId =: recordId];
String ContentDocumentLinkId = ContentDocumentLink.ContentDocumentId;
List<ContentVersion> cVer = [SELECT Id, Title, FileExtension, FileType, VersionData, ContentDocumentId FROM ContentVersion WHERE ContentDocumentId =: ContentDocumentLinkId AND IsLatest = true];
ContentDocumentLinkレコードが取得できたら、そのIDを使ってContentVersionレコードを取得していきます。メールにレコードを添付する際にはContentVersionレコードの内容が必要になります。
String ContentDocumentLinkId = ContentDocumentLink.ContentDocumentId;
List<ContentVersion> cVer = [SELECT Id, Title, FileExtension, FileType, VersionData, ContentDocumentId FROM ContentVersion WHERE ContentDocumentId =: ContentDocumentLinkId AND IsLatest = true];
これでレコードに紐づくファイル情報を取得することができました。最後にこの情報をもとにメールにファイルを添付します。
メールにファイルを添付する
添付するファイルデータはMessaging.EmailfileAttachmentをインスタンス化してオブジェクトにsetしていきます。
setした後は Listに対して追加します。
そして最終的にList型に収められたファイルデータを最初に作成した送信メールであるmailのsetFileAttachmentsメソッドを使用して添付します。
List<Messaging.EmailfileAttachment> fas = new List<Messaging.EmailfileAttachment>();
Messaging.EmailfileAttachment fa = new Messaging.EmailfileAttachment();
fa.setFileName(cVer[0].Title + '.' + cVer[0].FileExtension);
fa.setBody(cVer[0].VersionData);
fa.setInline(true);
fas.add(fa);
mail.setFileAttachments(fas);
最後にsendEmailメソッドで送信処理を行います。
Messaging.sendEmail(new List<Messaging.Email> { mail });
メールを送ってみる
開発者コンソールにてEmailManager.sendMail('yourTargetRecordId);
を実行すればメールが送られてくるはずです。
まとめ
以上が「レコードに紐づく添付ファイルをApexで送信するメールに添付する方法」の解説となります。この記事が少しでも参考になった方は「いいね」ボタンを押していただけると嬉しいです!
最後まで読んでいただきありがとうございました!