この記事は、【 可茂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('送信に失敗!')
})
最後に
いろいろと情報収集して、この形になりました。参考にしたサイトは、下に貼ってあります。たいへん助かりました。
もし、間違っているところやよりよい方法をご存知の方がいれば、ご指摘いただけると助かります。
参考