我想通过单击按钮

时间:2018-07-19 23:05:15

标签: node.js reactjs express nodemailer

这是很新的内容,因此,如果您以前曾问过这个问题,我深表歉意。我被要求创建一个网站,该网站显示公司员工针对问题开出的一系列票证。问题是,无论何时有人打开票证,更新票证的状态或对其进行注释,或者票证发生更改,票证的创建者都会收到一封电子邮件,而票证分配给的任何人也会收到一封电子邮件。

我的工作是创建一个网站,供员工访问并查看所有票证,当管理员对票证进行更改时,他/她将选择向订阅该网站的用户发送通知。< / p>

我正在使用React app,express,nodejs和所有这些好东西来完成此任务。我最近发现有关Nodemailer的信息,并在程序中使用了它,效果很好,但是每次运行程序时,它都会发送一封电子邮件。我希望每当我单击“通知”按钮并且选择票证时发生这种情况。这是我的按钮代码:

import React, { Component } from "react";
import { Button } from "reactstrap";
import axios from "axios";

class Submit extends Component {
  constructor(props){
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log("Notification sent!");
  }
 render() {
    return (
      <Button onClick={this.handleClick} color="danger" style={{ position: 
"absolute", bottom: "1px" }}>
        Send Notification
      </Button>
    );
  }
}

export default Submit;

这是我的电子邮件的发送来源:

var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
         user: 'email@gmail.com',
         pass: 'password'
     }
 });

let mailOptions = {
  from: '"FirstLastname" email@gmail.com', // sender address
    to: 'email@yahoo.com', // list of receivers
      subject: 'hey there', // Subject line
      text: 'Email notification sending', // plain text body
      html: '<b>Notification!</b>' // html body
  };

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      return console.log(error);
    }
      console.log('Message sent: %s', info.messageId);
      console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info))
});

module.exports = router;

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您在初始化类时调用transporter.sendMail ...

您需要将其包装在一个函数内,然后在Submit组件的handleClick函数内对其进行调用。

我将通过这样的“帮助”类来实现此目的(注意:未经测试的代码示例!

import nodemailer from 'nodemailer';

class NodemailerHelper {

    constructor() {

        this.transporter = nodemailer.createTransport({
            service: 'gmail',
            auth: {
                user: 'email@gmail.com',
                pass: 'password'
            }
        });

    }

    sendMail(from, to, subject, html) {

        this.mailOptions = {
            from: from,
            to: to,
            subject: subject,
            html: html
        };

        this.transporter.sendMail(mailOptions, (error, info) => {

            console.log('Message sent: %s', info.messageId);
            console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info))

            if (error) {
                return console.log(error);
            }else {
                return true;
            }

        });

    }

}

const nodemailerHelper = new NodemailerHelper();

export default nodemailerHelper;

因此,现在您需要将nodemailerHelper导入到Submit组件中,只需从nodemailerHelper.sendMail(from, to, subject, html)函数中调用handleClick