📧

React Emailを使った多言語HTMLメールをスクリプトから送る方法

2024/05/24に公開

はじめに

React Emailは、Reactコンポーネントを使ってHTMLメールをデザインできる便利なツールです。スタイルにtailwindが使えたり、HTMLメールに対応できていないメールクライアント用に自動的にPlain Text化してくれるなど、システムから送るメールを管理しやすくしてくれます。スクリプトからReact Emailを使ってメールを送る際にいくつか設定が必要なので、その方法を共有します。

課題

  • TypeScriptの制約
    Reactコンポーネントを扱う必要があるため、tsファイルではエラーが発生します。

  • i18nの設定
    メールの文面の多言語対応をしている場合、i18n関連の設定が必要です。

解決方法

  • スクリプトの拡張子をtsxに変更

tsxコマンドであればtsxファイルの実行が可能です

npm exec tsx ./scripts/send-mail.tsx
  • i18nの設定
    i18next & react-i18nextを設定し、I18nextProviderでReactコンポーネントをラップしてレンダリングします。

具体的なコード例

import path, { join } from 'path'
import { fileURLToPath } from 'url'
import i18next from 'i18next'
import Backend from 'i18next-fs-backend'
import { I18nextProvider } from 'react-i18next'
import { renderAsync } from '@react-email/components'
import EmailComponent from './EmailComponent'

const lang = 'en'
const namespaces = ['common', 'mail']
const __dirname = path.dirname(fileURLToPath(import.meta.url)) // 現在のディレクトリ

await i18next.use(Backend).init({
  ns: namespaces,
  lng: lang,
  backend: {
    loadPath: join(__dirname, '../public/locales/{{lng}}/{{ns}}.json'), // localeファイルパス
  },
})

const t = i18next.t // t関数として利用できる

const { html, text } = await renderReactEmail(
  <I18nextProvider i18n={i18next}>
    <EmailComponent />
  </I18nextProvider>
)

async function renderReactEmail(react: ReactElement) {
  const [html, text] = await Promise.all([
    renderAsync(react),
    renderAsync(react, { plainText: true }),
  ])
  return { html, text }
}

// html, textを利用して送信...

まとめ

スクリプトから多言語対応のReactメールを送信する方法を紹介しました。

Discussion