custom sender name with gmail smtp in nodemailer
最近在寫 firebase cloud functions,其中寫個送信的功能,用 nodemailer 遇到寄信者名字無法更改的問題,想說我 library 文件應該沒看錯,應該就像是下面這樣帶入就好
const mailOptions = {
from: "your name <[email protected]>",
to: email,
subject,
html: body, // Use HTML for formatting
};
結果沒有用,看了網路上文章也有人遇到問題,最後看了看發現官網有說到如果是用 google smtp 的服務的話! 是無法更改寄件者的名字的。。。 詳情可以看這邊 https://nodemailer.com/usage/using-gmail/。 其實如果直接用第三方服務像是 sendgrid 之類的,會方便很多,但是我在申請個人戶的帳號的時候被拒絕,我看 reddit 上面也有人討論 sendgrid 從某個時候開始,個人戶申請基本上會被拒絕。。 所以我才轉成用 nodemailer 加 gmail smtp,但是後來就是遇到上面這個問題,這次就來看看怎麼解決~ 找不到的話,就是頂多不要用 gmail smtp 而已換一家 lol
開始找方法
其實 email routing 是在偶然的狀況下看到的,剛好 cloudflare 有這個功能 https://developers.cloudflare.com/email-routing/。 感覺上就類似一個 proxy,只是是對於 email 的 proxy,所以如果沒錯的話,可以隱藏你背後真實的收發者。
在 cloudflare 的 email 這邊可以加入你的 domain 來設定,同時他也會檢查你目前相關設定是不是會衝突,比如,你可能已經有加過其他 MX Record的設定,那你就必須兩個取其一了! 無法兩個都使用。
設定完後,可以把你剛剛設定好的 email routing 帳號,填入到 gmail 的設定中,像下面這個頁面
send mail as 這邊可以多增加其他 email 地址,就是在這邊加入,加入後,下一步是需要你幫剛剛加入的帳號,設定其 smtp server 還有帳密,這邊就是填上你原本gmail smtp跟帳號密碼。
最後會需要收確認信完成跟確認設定,這邊因爲前面 cloudflare 已經設定 routing 了,所以你在原本的 gmail 就可以收到信件了!
測試是否生效
經過上面設定後~ 回到程式碼的部分
const transporter = nodemailer.createTransport({
service: "gmail", // or "smtp.example.com" for custom SMTP
auth: {
user: GMAIL_USER.value(),
pass: GMAIL_PASSWORD.value(),
},
from: "xxxx <[email protected]>",
});
// Email sending function
async function sendEmail(email: string, subject: string, body: string) {
const mailOptions = {
from: "xxxx <[email protected]>",
to: email,
subject,
html: body, // Use HTML for formatting
};
try {
await transporter.sendMail(mailOptions);
console.log(`Email sent to ${email}`);
} catch (error) {
console.error("Error sending email:", error);
throw new Error("Email could not be sent");
}
}
把這邊的 from 改成你前面設定的 username 跟 email, 你應該就會發現有生效了! 對方收到的信件寄送者不會再是你的gmail帳號了~
其實如果申請第三方email 服務,個人戶不會被拒絕就好了~ 就不用搞得這麼麻煩,我猜是因爲被濫用後,個人戶的申請就變得極其困難了吧, lol