Nodemailer发送邮件无正文内容问题求助
问题描述
使用Nodemailer、Angular和Firebase(Firestore存储邮件数据,Functions触发发送)搭建联系表单及邮件发送功能后,出现以下情况:
- 前端用户提交表单后,表单值正常填充,返回成功提示;
- Firestore模拟器中邮件数据字段完整;
- 邮件能成功送达收件箱,但仅包含发件人、收件人及主题,正文显示“此邮件无内容”。
需要在邮件正文中展示用户的firstName、lastName、phone、邮箱地址及消息内容,怀疑mailOptions配置有误,不确定是否需添加HTML标签、编码处理等。
相关代码
import * as functions from "firebase-functions"; const admin = require("firebase-admin"); const nodemailer = require("nodemailer"); admin.initializeApp(); require('dotenv').config(); exports.sendMail = functions.firestore.document("emails/{emailId}") .onCreate((snap: any, context: any) => { const email = snap.data(); functions.logger.log("Email Information: ", email); const mailTransport = nodemailer.createTransport({ host: "smtp.gmail.com", port: 465, secure: true, service: "gmail", auth: { user: "realEmailAddress@gmail.com", pass: "realPassword", }, }); const mailOptions = { from: email.email, to: "dave.smith@company.co.uk", firstName: email.firstName, lastName: email.lastName, phone: email.phone, subject: email.subject, message: email.message, }; return mailTransport.sendMail(mailOptions).then(() => { return console.log("Email sent"); }).catch((error: any) => { return console.log("Error sending email", error); }); });
Firebase日志
12:37:56 I function[us-central1-sendMail] { "firstName": "Homer ", "lastName": "Simpson", "seqNo": 1, "phone": "07788 44 55 66", "subject": "My subject is - Hi this is Homer ", "message": "Email Information: ", "email": "homer@simpson.com", "severity": "INFO" }
Firestore数据库数据

解决方案
问题出在mailOptions的配置上:Nodemailer并不识别你自定义的firstName、lastName、phone、message这些字段,邮件正文需要通过text(纯文本格式)或html(HTML格式)字段来定义。
修改mailOptions部分,根据需求选择纯文本或HTML格式:
纯文本格式示例
const mailOptions = { from: email.email, to: "dave.smith@company.co.uk", subject: email.subject, text: ` 发件人姓名:${email.firstName} ${email.lastName} 联系电话:${email.phone} 邮箱地址:${email.email} 消息内容:${email.message} ` };
HTML格式示例(更美观)
const mailOptions = { from: email.email, to: "dave.smith@company.co.uk", subject: email.subject, html: ` <h3>新的联系表单消息</h3> <p><strong>姓名:</strong>${email.firstName} ${email.lastName}</p> <p><strong>电话:</strong>${email.phone}</p> <p><strong>邮箱:</strong>${email.email}</p> <p><strong>内容:</strong>${email.message}</p> ` };
修改后重新部署Firebase Functions,邮件正文就能正确展示所有用户提交的信息了。
内容的提问来源于stack exchange,提问作者Robgit28
相关产品推荐
相关产品推荐

