我写在这里是因为这是我解决问题的最后希望,我已经多次与mailgun支持联系。
我有一个集成了 GoogleOAuth、Stripe 和 mailgun 的 node+express 应用程序。应将带有调查的自动电子邮件发送给客户。
无论我做什么,我总是从 mailgun 服务器收到 401 错误。
mailgunMailer 类看起来像这样(mailgun 支持也推荐,例如使用 formData):
const { Error } = require("mongoose");
const keys = require("../config/keys");
const formData = require("form-data");
const Mailgun = require("mailgun.js");
const mailgun = new Mailgun(formData);
const mg = mailgun.client({
username: "api",
key: process.env.mailgunKey || "key-yourkeyhere",
url: "https://api.mailgun.net",
});
class MailgunMailer {
constructor({ subject, recipients }, content) {
this.data = {
from: "no-reply@YOUR_ADDRESS.com",
to: this.formatAddresses(recipients),
subject: subject,
html: content,
};
}
formatAddresses(recipients) {
return recipients.map(({ email }) => email).join(",");
}
async send() {
try {
const resp = await mg.messages.create(
process.env.MailgunDomain,
this.data
);
return resp;
} catch (err) {
console.log(err);
}
}
}
module.exports = MailgunMailer;
现在我有一个名为surveyRoutes.js 的文件,我在其中实例化了一个MailgunMailer 对象并执行mailer.send():
const mongoose = require("mongoose");
const requireLogin = require("../middelwares/requireLogin");
const requireCredits = require("../middelwares/requireCredits");
const MailgunMailer = require("../services/MailgunMailer");
const surveyTemplate = require("../services/emailTemplates/surveyTemplate");
const Survey = mongoose.model("surveys");
module.exports = (app) => {
app.post("/api/surveys", requireLogin, requireCredits, (req, res) => {
const { title, subject, body, recipients } = req.body;
const survey = new Survey({
title,
subject,
body,
recipients: recipients
.split(",")
.map((email) => ({ email: email.trim() })),
_user: req.user.id,
dateSent: Date.now(),
});
const mailer = new MailgunMailer(survey, surveyTemplate(survey));
mailer.send();
});
};
我现在手动访问 mailgun。我将 axios 集成到 index.js 并通过控制台执行它。
index.js
import axios from "axios";
window.axios = axios;
安慰:
const survey = { title:'mytitle', subject: 'my subject', recipients:
'myAccount@gmail.com', body: 'here is the body of the email'}
axios.post('/api/surveys', survey);
现在,我收到了一个未决的承诺,并在终端上显示了一个错误:
[Error: UNAUTHORIZED] { status: 401, details: 'Forbidden' }
就这样!mailgun 支持总是声称我应该检查私钥(process.env.mailgunKey)是否正确。所以到目前为止,我已经这样做了 20 或 30 次。应该是正确的。
谢谢!