Nodemailer-动态传输器

时间:2018-10-26 14:06:11

标签: javascript node.js nodemailer

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

修改

第1步:

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

第2步:

通过获取将该json对象发送到'/contactus/',并使用req.body将其登录到控制台 我得到这个obj:{ 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发送电子邮件。这意味着我从在传输器中配置的电子邮件中获取电子邮件 但我想从 JOSH

获得EMAIL

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

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

这里有一个大问题:

如何设置动态运输商?或如何在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
    }
  });

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

5 个答案:

答案 0 :(得分:2)

您是否想发送电子邮件?

您将无法使用他们的电子邮件地址创建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)
})

答案 1 :(得分:2)

针对您的问题

  

如何在Node / express中实现

即使您已将密码传递给req.body.password,在您平台上注册的用户也可能难以从他自己那里收到电子邮件,因为他/她必须必须打开 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'});
}

我希望这对您有所帮助。

答案 2 :(得分:2)

电子邮件始终是指某人实际发送该电子邮件的真实性。通过在网站上提交表单,以其名字发送电子邮件并不直观。

想象一个可能的世界。您只需注册一个邮件服务,然后从一个名人帐户向自己发送一封电子邮件!名人甚至都不知道。

如果您真的希望电子邮件来自某人,则需要进行身份验证,就像之前指出的那样。

如果您只想维护网站上提交的内容的主题,建议您查看documentation中的“更高级的字段”部分。

senderreplyToinReplyTo应该可以帮助您启动电子邮件线程,并且您的回复将发送给预期的收件人。

答案 3 :(得分:1)

因此您可以简单地将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"
 }
});

答案 4 :(得分:1)

通过阅读您的问题和所有答复,我了解到,您想通过询问用户(仅用户名)来从用户的电子邮件地址向您的帐户发送电子邮件,而您不想询问他/她密码,使用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 provider进行了测试,但是当我有两个不同的provider(来自:my-email,cc:other-email)时,回复消息转到了my-email,但是当我来自from和cc时,相同的提供者有效!我也收到客户的消息,我可以回复客户并拥有所有对话历史记录。