node.js - 如何使用 react.js 前端发送电子邮件?
问题描述
我已经创建了一个网站并在我的网站上部署了它(使用 react js),有一个联系表格,可以将客户消息发送到我的工作电子邮件(myname@comany.com)。我知道我不能用 react js 发送电子邮件,因为 rereact 只处理前端,所以我正在寻找使用 nodemailer 或其他解决方案的解决方案!我怎样才能做到这一点 ?
我尝试使用以下教程将 react 与 express 联系起来:[https://medium.com/@maison.moa/setting-up-an-express-backend-server-for-create-react-app-bc7620b20a61][1]
我制作了一个快速应用程序进行测试:文件夹结构:
client ( created with create-react app )
node_modules
config.js
package.json
package_lock.json
server.js
在前端:client/src app.js 代码:
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Form from './Form.js';
class App extends Component {
state = {
data: null
};
componentDidMount() {
// Call our fetch function below once the component mounts
this.callBackendAPI()
.then(res => this.setState({ data: res.express }))
.catch(err => console.log(err));
}
// Fetches our GET route from the Express server. (Note the route we are fetching matches the GET route from server.js
callBackendAPI = async () => {
const response = await fetch('/express_backend');
const body = await response.json();
if (response.status !== 200) {
throw Error(body.message)
}
return body;
};
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<Form/>
<p className="App-intro">{this.state.data}</p>
</div>
);
}
}
export default App;
电子邮件.js 代码:
import React from 'react';
import { Email, Item, A} from 'react-html-email';
export default function InlineLink({name, children}) {
return (
<Email title='link'>
<Item>
Hello {name}
<p>helooo</p>
</Item>
<Item>
{children}
</Item>
</Email>
)};
Form.js 代码:
import MyEmail from './Email'
import { renderEmail } from 'react-html-email'
import axios from 'axios';
import React, { Component } from 'react';
class Form extends Component {
resetForm(){
this.setState({feedback: ''});
}
constructor(props) {
super(props);
this.state = { feedback: '', name: 'Name', email: 'email@example.com' };
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
render() {
return (
<form className="test-mailing">
<h1>Let's see if it works</h1>
<div>
<textarea
id="test-mailing"
name="test-mailing"
onChange={this.handleChange}
placeholder="Post some lorem ipsum here"
required
value={this.state.feedback}
style={{width: '100%', height: '150px'}}
/>
</div>
<input type="button" value="Submit" className="btn btn--submit" onClick={this.handleSubmit} />
</form>
);
}
handleChange(event) {
this.setState({feedback: event.target.value})
};
handleSubmit(event){
const messageHtml = renderEmail(
<MyEmail name={this.state.name}> {this.state.feedback}</MyEmail>
);
axios({
method: "POST",
url:"http://localhost:3000/send",
data: {
name: this.state.name,
email: this.state.email,
messageHtml: messageHtml
}
}).then((response)=>{
if (response.data.msg === 'success'){
alert("Email sent, awesome!");
this.resetForm()
}else if(response.data.msg === 'fail'){
alert("Oops, something went wrong. Try again")
}
})
}
}
export default Form;
在后端 server.js 代码中:
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
// create a GET route
app.get('/express_backend', (req, res) => {
res.send({ express: 'YOUR EXPRESS BACKEND IS CONNECTED TO REACT' });
});
const nodemailer = require('nodemailer');
const creds = require('./config');
var transport = {
host: 'smtp.gmail.com', // e.g. smtp.gmail.com
auth: {
user: creds.USER,
pass: creds.PASS
}
}
var transporter = nodemailer.createTransport(transport)
transporter.verify((error, success) => {
if (error) {
console.log(error);
} else {
console.log('All works fine, congratz!');
}
});
app.use(express.json()); app.post('/send', (req, res, next) => {
const name = req.body.name
const email = req.body.email
const message = req.body.messageHtml
var mail = {
from: name,
to: 'mellitir11@gmail.com',
subject: 'Contact form request',
html: message
}
transporter.sendMail(mail, (err, data) => {
if (err) {
res.json({
msg: 'fail'
})
} else {
res.json({
msg: 'success'
})
}
})
})
config.js 代码:
module.exports = {
USER: 'mellitir11@gmail.com',
PASS: 'my_email_password',
}
即使它显示错误消息“糟糕,出了点问题。再试一次”[1]:https ://medium.com/@maison.moa/setting-up-an-express-backend-server-for-创建反应应用程序 bc7620b20a61
解决方案
Nodemailer 可能会为您解决问题,本质上您将需要一个支持 smtp、node v6 或更高版本的电子邮件帐户和支持 ssl、Oauth 身份验证和 DKIM 的Nodemailer 文档(有一个示例)。根据您的具体需要,还有其他选项,如 mailgun 和 mailchimp,它们提供 API 或后端 PHP 或 Java
推荐阅读
- robotframework - 为什么 Robot Framework、Selenium2Library、Element Text Should Be 关键字无法正确验证输入元素文本?
- amazon-web-services - 使用 lambda 函数删除关联的 cloudformation 堆栈时 EMR 集群未终止
- typescript - Deno:访问控制器中的查询参数
- vue.js - 如何将 v-text-field 标签向右对齐?
- flutter - 用于 2 路连接的 Flutter 提供程序
- python - 对于字符串列表,如何遍历字符串字符的每个位置?
- java - SeachView 不使用全宽
- kubernetes - Kuberenetes 调度:如何实现深度优先调度行为?
- javascript - 向对象添加一个简单的嵌套字段
- scala - 我有一个问题。关于 envn 索引的 scala 列表分区