レコードに紐づく添付ファイルをApexで送信するメールに添付する方法

# はじめに
今回はLightningでレコードに紐づけたファイルをApexで送信するメールに添付する方法をご紹介します。

# 実装
コードの全体像はこのようになっています・
```EmailManager.cls
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`にはご自身のメールアドレスを入れることで、メールが送信されることを確認できます。

```EmailManager.cls
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

```EmailManager.cls
    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レコードの内容が必要になります。
```EmailManager.cls
    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<Messaging.EmailfileAttachment>に対して追加します。

そして最終的にList型に収められたファイルデータを最初に作成した送信メールであるmailのsetFileAttachmentsメソッドを使用して添付します。
```EmailManager.cls
    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メソッドで送信処理を行います。

```EmailManager.cls
    Messaging.sendEmail(new List<Messaging.Email> { mail });
```


# メールを送ってみる
開発者コンソールにて`EmailManager.sendMail('yourTargetRecordId）;`を実行すればメールが送られてくるはずです。

# まとめ
以上が「レコードに紐づく添付ファイルをApexで送信するメールに添付する方法」の解説となります。この記事が少しでも参考になった方は「いいね」ボタンを押していただけると嬉しいです！

最後まで読んでいただきありがとうございました！

# 参考サイト
- [[Apex]添付ファイルつきメール送信のサンプル](https://gist.github.com/zaki-yama/fe561acd1e5d8a57900e "[Apex]添付ファイルつきメール送信のサンプル")
- [Apex入門](https://trailhead.salesforce.com/ja/content/learn/modules/apex_database/apex_database_intro "Apex入門")