在本地服务器 nodemailer 发送所有邮件,但在生产中 抛出控制台错误: 请求的资源上不存在“Access-Control-Allow-Origin”标头。
节点后端部署在 heroku 上 + netlify 上的 react 应用
//react app axios post method for sending user data
const sendMail = async() => {
await axios
.post("https://xxxxxxx.herokuapp.com/email", {
username: username,
senderemail: email,
subject: subject,
message: message,
})
.then((res) => {
res.status === 200 ? alert("Message sent!") : alert("Try again!");
})
.catch((err) => console.error(err));
};
表达 app.js 文件 这些是我的快速后端代码片段
nodemailer 代码段模块:
const nodemailer = require("nodemailer");
require("dotenv").config();
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.G_USER,
pass: process.env.G_PASS,
},
});
module.exports = transporter;
快速代码片段:
const express = require("express");
const cors = require("cors");
const app = express();
const transporter = require("./mail");
const PORT = process.env.PORT || 5000;
app.use(
cors({
origin: "https://xxxxxx.netlify.app",
optionsSuccessStatus: 200,
})
);
app.use(express.json());
app.get("/", (req, res) => {
res.send("node is up!");
});
app.post("/email", async (req, res) => {
const username = req.body.username;
const senderemail = req.body.senderemail;
const subject = req.body.subject;
const message = req.body.message;
const mailOptions = {
from: username,
to: "xxxxxxx@gmail.com",
subject: subject,
html: `
<p>${message}</p>
<address>By: ${username} <br/> ${senderemail}<address/>
`,
};
await transporter.sendMail(mailOptions, (err, info) => {
if (err) {
console.error(err.message);
} else {
res.json(info.response);
}
});
});
app.listen(PORT, () => {
console.log(`Server is up!`);
});
答案 0 :(得分:0)
我建议您首先尝试通过执行 cors() 来使其正常工作,然后将域列入白名单。如果您仍然无法使其工作,则可以使用以下解决方案。但请不要忘记将域正确列入白名单。
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Request-Method', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.setHeader('Access-Control-Expose-Headers', 'Content-Type');
if(req.method === 'OPTIONS') {
res.writeHead(200);
return res.end();
} else {
return next();
}
});
答案 1 :(得分:0)
https://accounts.google.com/DisplayUnlockCaptcha
嘿伙计们,如果您正在使用 nodemailer Gmail 服务并遇到同样的问题,请单击上面的链接以解锁 CAPTCHA.... 因为 gmail 阻止第三方应用程序发送电子邮件...... 通过允许访问我的代码工作正常!!!