Nodemailer - 动态传输器

Nodemailer - dynamic transporter

我正在我的应用程序上创建一个 nodemailer,我想从用户将填写的输入字段动态发送电子邮件。例如。如果用户在表单输入电子邮件值上写:'test@test.com' 我想从 'test@test.com' 发送这封电子邮件,以便稍后我可以回复这个人并拥有所有历史记录电子邮件。

编辑

第 1 步:

使用您的个人数据填写网站上的表格。例如。我想给公司发邮件(姓名:josh,姓氏:murp,邮箱:josh22@domain.com)

第 2 步:

使用 fetch 将此 json 对象发送到 '/contactus/' 并使用 req.body 在控制台中记录 我得到这个对象:{ name: 'josh', surname: 'murp', email: 'josh22@domain.com' }

第 3 步:

我想以这种方式设置 Nodemailer:

let mailOptions = {
        from: `${req.body.firstName} ${req.body.surname} <${req.body.email}>`, // sender address
        to: "mymail@gmail.com", // list of receivers
        subject: "hi", // Subject line
        text: "Hello world", // plain text body
        html: "<b>NodeJS Email Tutorial</b>" // html body
      };

意思是。我想从 req.body.email 获取电子邮件,在现实生活中我想从 josh22@domain.com 获取电子邮件,但 Nodemailer 使用 TRANSPORTER 发送电子邮件。这意味着我正在从 在 transporter 中配置的电子邮件接收电子邮件 但我想从 JOSH

获取电子邮件

这个结果给我带来了一个问题。

当我从我的帐户(运输者)收到电子邮件时我无法回复这封邮件我需要找到谁在给我写信 会话历史记录 我没有通过我的网站发送的此会话的第一 电子邮件。

这里有个大问题:

如何设置动态转运器? 或者如何在 Node/express

中实现
let transporter = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: {
      user: keys.username, // generated ethereal user
      pass: keys.password // generated ethereal password
    }
  });

我整天都在网上寻找这个答案,但没有结果。

因此您可以简单地将 input field value 分配给 global 对象。

例如,global.email = req.body.email

并且可以在您的 nodemailer 配置中使用。

let transporter = nodeMailer.createTransport({
 host: "smtp.gmail.com",
 port: 465,
 secure: true,
 auth: {
   user: global.email || "myadress@gmail.com",
   pass: "mypassword"
 }
});

您想知道如何发送电子邮件吗?

您将无法使用他们的电子邮件地址创建 transporter,因为您将无法以他们的身份登录。

let transporter = nodeMailer.createTransport({
    host: "smtp.gmail.com",
    port: 465,
    secure: true,
    auth: {
        user: "myadress@gmail.com",
        pass: "mypassword"
    }
});
let mailOptions = {
    from: `${req.body.firstName} ${req.body.surname} <${req.body.email}>`, // sender address
    to: "mymail@gmail.com", // list of receivers
    subject: "hi", // Subject line
    text: "Hello world", // plain text body
    html: "<b>NodeJS Email Tutorial</b>" // html body
};

transporter.sendMail(mailOptions, function (err, info) {
    if (err) {
        throw err
    }
    console.log(info)
})

回答你关于

的问题

how to implement this in Node/express

即使您将他的密码传递给 req.body.password,在您的平台上注册的用户也可能很难收到他自己的电子邮件,因为 he/she 必须转 Less secure app access 这是一个 gmail 帐户,我什至不知道其他电子邮件服务是如何做的。

但我会建议您设置一个电子邮件,您希望注册用户从您或任何管理员(创建的电子邮件的所有者)那里收到电子邮件,然后您可以设置帐户并提供登录凭据(电子邮件和密码)在你的

auth: {
        user: 'mymail@gmail.com',
        pass: 'password_you_created'
    }

之后您必须 开启 您的 Less secure app access,否则您的电子邮件将无法通过。

您可以试试下面的例子:

{
    let transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: 'mymail@gmail.com',
            pass: 'password_you_created'
        }
    });

    let mailOptions = {
        from: 'mymail@gmail.com',
        to: req.body.email,
        subject: "hi", // Subject line
        text: "Hello world", // plain text body

        html: "<b>NodeJS Email Tutorial</b>" // html body
    };

        transporter.sendMail(mailOptions, (error, info)=>{
            if (error) {
                console.log(error);
            } else {
                console.log('Email sent');
            }
        }); 
    res.json({success: 'whatever message you plan on writing'});
}

希望对您有所帮助。

通过阅读你的问题和所有回复我了解到,你想从用户的电子邮件地址向你的帐户发送一封电子邮件,方法是仅询问用户,他的用户名,你不想询问 his/her 密码,使用 nodemailer,从用户帐户发送电子邮件的目的是,您希望收到通过您的网站发送的对话的第一封电子邮件。

所以,@Freestyle09,你不能使用 nodemailer 从任何电子邮件帐户发送电子邮件,除非你提供了该电子邮件帐户的 usernamepassword,并且你不会有用户的 password 正如你所说,你不想询问用户的密码。

所以,我建议您的替代解决方案是用这种方式解决您的问题

var mailData = {
    from: 'another.your.email@company.com',
    to: 'mymail@gmail.com',
    cc:`${req.body.firstName} ${req.body.surname} <${req.body.email}>`//josh22@domain.com
    subject: 'Message title',
    text: 'This request has been generated on behalf of josh ...... all other 
    text here',
    html: 'HTML version of the message'
};

cc 列表中添加用户名后,您将在对话中包含该用户,否则无法使用 nodemailer 从具有密码的电子邮件地址发送电子邮件。你需要寻找一些替代解决方案

提示:(问题作者)

一个提示,我已经用 gmail 提供商测试了这个,但是当我有两个不同的提供商(来自:我的电子邮件,抄送:其他电子邮件)时,回复消息会转到我的电子邮件,但是当我有来自和抄送完全相同的提供者 它有效!我收到消息,客户也收到消息,我可以回复客户并拥有所有对话历史记录。