0

我写在这里是因为这是我解决问题的最后希望,我已经多次与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 次。应该是正确的。

谢谢!

4

0 回答 0