3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Node.js] Nodemailerで2通以上同時にメールを送信する

Last updated at Posted at 2021-12-12

この記事は、【 可茂IT塾 Advent Calendar 2021 】の17日目の記事です。

Webの作成で実装したことを記事にしました。
誰かのお役に立てれば、幸いです。

お問い合わせフォームに入力した内容を入力者と企業に2通同時に確認メールを送るAPIを作成しました。
そこでnodemailerを使用したので、まとめて記事にしました。

Nodemailerでメールを送信する。

Nodemailerをインストールします。

npm i nodemailer

フォーム側

  const [fieldValues, setFieldValues] = useState<FieldValues>({
    // 各フォームの初期値
  })

  const onSubmit = async () => {
    const url = `/api/contact` //apiを作成したディレクトリ
    await axios.post(url, fieldValues) //axiosを使って送信
  }

数行ですが、Typescriptで書いてます。
今回の記事はAPIについてなので、フォームについては必要な部分のみとさせていただきます。

API側

const nodemailer = require('nodemailer')

// SMTPサーバの設定
const mailer = nodemailer.createTransport({
  host: 'mail.example.com', // ホスト名
  port: 465, //ポート
  secure: true,
  auth: {
    user: process.env.MAIL_AUTH_USER, // 環境変数(ユーザ名)
    pass: process.env.MAIL_AUTH_PASS, // 環境変数(パスワード)
  },
})

export default async (req, res) => {
  const {
    // フォームから送信された情報
  } = req.body

  const senderEmailAddress = 'from_test@example.com'
  const receiverEmailAddress = 'to_test@example.com'

  // メールの内容
  const mailOptions = {
    from: `送信元名 <${senderEmailAddress}>`, // 送信元メールアドレス
    to: receiverEmailAddress, // 送信先メールアドレス
    subject: '{件名}',
    text: '{本文}',
  }

  // メール送信
  mailer.sendMail(mailOptions, function (error, success) {
    if (error) {
      console.log(error)
      res.status(500).send('送信に失敗!')
    } else {
      console.log(success)
      res.status(200).send('送信に成功!')
    }
  })
}

メールを2通以上同時に送る場合

同じ内容のメールを複数の人に送る場合

この場合は、送信先を配列にするだけです。

const receiverEmailAddressList = ['to_test1@example.com','to_test2@example.com','to_test3@example.com']

  // メールの内容
  const mailOptions = {
    from: `送信元名 <${senderEmailAddress}>`, // 送信元メールアドレス
    to: receiverEmailAddressList, // 送信先メールアドレスリスト
    subject: '{件名}',
    text: '{本文}',
  }

違う内容のメールを複数の人に送る場合

下記では、Promise.allを使ってmailer.sendMailをそれぞれ実行させています。

  const senderEmailAddress = 'from_test@example.com'
  const testMailAddress_1 = 'to_test1@example.com'
  const testMailAddress_2 = 'to_test2@example.com'

  // メールの内容
  const mailOptions1 = {
    from: `送信元名 <${senderEmailAddress}>`, // 送信元メールアドレス
    to: testMailAddress_1, // 送信先メールアドレス
    subject: '{件名}',
    text: '{本文_1}',
  }

  const mailOptions2 = {
    from: `送信元名 <${senderEmailAddress}>`, // 送信元メールアドレス
    to: testMailAddress_2, // 送信先メールアドレス
    subject: '{件名}',
    text: '{本文_2}',
  }

  // メール送信
   Promise.all([mailer.sendMail(mailOptions1), mailer.sendMail(mailOptions2)])
    .then((respose) => {
      console.log(respose)
      res.status(200).send('送信に成功!')
    })
    .catch((error) => {
      console.log(error)
      res.status(500).send('送信に失敗!')
    })

最後に

いろいろと情報収集して、この形になりました。参考にしたサイトは、下に貼ってあります。たいへん助かりました。
もし、間違っているところやよりよい方法をご存知の方がいれば、ご指摘いただけると助かります。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?