使用 Nodemailer 和 Webpack 时无法解析 dns 和 child_process
Can't resolve dns and child_process when using Nodemailer and Webpack
我正在尝试使用 nodemailer 发送一封简单的电子邮件,但遇到了以下问题。问题似乎出在 webpack 上。我已经包括了错误和有问题的代码。谢谢!
控制台日志:
ERROR in ./~/nodemailer/lib/mailer/index.js
Module not found: Error: Can't resolve 'dns' in
'/Users//Users/user/Projects/world-domination/project-folder/node_modules/nodemailer/lib/mailer'
@ ./~/nodemailer/lib/mailer/index.js 14:12-26
@ ./~/nodemailer/lib/nodemailer.js
@ ./src/app/components/contact/contact.component.ts
@ ./src/app/app.module.ts
@ ./src/main.ts
@ multi webpack-dev-server/client?http://localhost:4200 ./src/main.ts
ERROR in ./~/nodemailer/lib/sendmail-transport/index.js
Module not found: Error: Can't resolve 'child_process' in
'/Users/user/Projects/world-domination/project-folder/node_modules/nodemailer/lib/sendmail-transport'
@ ./~/nodemailer/lib/sendmail-transport/index.js 3:14-38
@ ./~/nodemailer/lib/nodemailer.js
@ ./src/app/components/contact/contact.component.ts
@ ./src/app/app.module.ts
@ ./src/main.ts
@ multi webpack-dev-server/client?http://localhost:4200 ./src/main.ts
有问题的代码:
import { Component, OnInit } from '@angular/core';
import * as nodemailer from 'nodemailer';
@Component({
selector: 'app-contact',
templateUrl: './contact.component.html',
styleUrls: ['./contact.component.scss']
})
export class ContactComponent implements OnInit {
public sendMessage(): void {
let transporter = nodemailer.createTransport({
host: 'smtp.example.com',
port: 465,
secure: true,
auth: {
user: 'sampleAddress@gmail.com',
pass: 'samplePassword'
}
});
let mailOptions = {
from: '"Mr. Sender" <sampleAddress@gmail.com>',
to: 'sampleRecipient@gmail.com',
subject: 'Test email subject',
text: 'Test email body'
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Message %s sent: %s', info.messageId, info.response);
})
}
}
您根本无法在前端安装 nodemailer。 Nodemailer 和其他依赖于它的项目(即 gmail-send)是为在后端使用 nodejs 而制作的。
相反,您应该考虑使用像 AWS-SES 这样的第三方 smtp 服务,或者通过在后端使用 nodemailer 创建您自己的服务,前端将通过 https 请求之类的方式调用它。
@Abdullah Adeeb 是正确的。我最终只使用了 AWS-SES 并从前端调用它。
修复的组件代码:
/// <reference types="aws-sdk" />
import { Component } from '@angular/core';
import * as aws from 'aws-sdk';
import { SES } from 'aws-sdk'
import { AwsConfig } from '../../../awsConfig';
@Component({
selector: 'app-contact',
templateUrl: './contact.component.html',
styleUrls: ['./contact.component.scss']
})
export class ContactComponent {
private _ses: SES;
constructor() {
this.configureSES();
}
public sendMessage(): void {
let params;
params = {
Destination: {
ToAddresses: [ 'recipient@sample.com' ]
},
Message: {
Body: {
Html: {
Charset: 'UTF-8',
Data: '<h1>HTML needed inside of your email</h1>'
},
Text: {
Charset: 'UTF-8',
Data: 'Or you can use plain text'
}
},
Subject: {
Charset: 'UTF-8',
Data: 'Sample message subject'
}
},
Source: 'sender@sample.com' // Must be registered with AWS
};
this.sendEmail(params);
}
}
private configureSES(): void {
aws.config.credentials = {
accessKeyId: AwsConfig.accessKeyId,
secretAccessKey: AwsConfig.secretAccessKey
};
aws.config.update({
region: AwsConfig.region
});
this._ses = new SES({
apiVersion: '2010-12-01'
});
}
private sendEmail(params): void {
this._ses.sendEmail(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
});
}
}
我正在尝试使用 nodemailer 发送一封简单的电子邮件,但遇到了以下问题。问题似乎出在 webpack 上。我已经包括了错误和有问题的代码。谢谢!
控制台日志:
ERROR in ./~/nodemailer/lib/mailer/index.js
Module not found: Error: Can't resolve 'dns' in
'/Users//Users/user/Projects/world-domination/project-folder/node_modules/nodemailer/lib/mailer'
@ ./~/nodemailer/lib/mailer/index.js 14:12-26
@ ./~/nodemailer/lib/nodemailer.js
@ ./src/app/components/contact/contact.component.ts
@ ./src/app/app.module.ts
@ ./src/main.ts
@ multi webpack-dev-server/client?http://localhost:4200 ./src/main.ts
ERROR in ./~/nodemailer/lib/sendmail-transport/index.js
Module not found: Error: Can't resolve 'child_process' in
'/Users/user/Projects/world-domination/project-folder/node_modules/nodemailer/lib/sendmail-transport'
@ ./~/nodemailer/lib/sendmail-transport/index.js 3:14-38
@ ./~/nodemailer/lib/nodemailer.js
@ ./src/app/components/contact/contact.component.ts
@ ./src/app/app.module.ts
@ ./src/main.ts
@ multi webpack-dev-server/client?http://localhost:4200 ./src/main.ts
有问题的代码:
import { Component, OnInit } from '@angular/core';
import * as nodemailer from 'nodemailer';
@Component({
selector: 'app-contact',
templateUrl: './contact.component.html',
styleUrls: ['./contact.component.scss']
})
export class ContactComponent implements OnInit {
public sendMessage(): void {
let transporter = nodemailer.createTransport({
host: 'smtp.example.com',
port: 465,
secure: true,
auth: {
user: 'sampleAddress@gmail.com',
pass: 'samplePassword'
}
});
let mailOptions = {
from: '"Mr. Sender" <sampleAddress@gmail.com>',
to: 'sampleRecipient@gmail.com',
subject: 'Test email subject',
text: 'Test email body'
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Message %s sent: %s', info.messageId, info.response);
})
}
}
您根本无法在前端安装 nodemailer。 Nodemailer 和其他依赖于它的项目(即 gmail-send)是为在后端使用 nodejs 而制作的。
相反,您应该考虑使用像 AWS-SES 这样的第三方 smtp 服务,或者通过在后端使用 nodemailer 创建您自己的服务,前端将通过 https 请求之类的方式调用它。
@Abdullah Adeeb 是正确的。我最终只使用了 AWS-SES 并从前端调用它。
修复的组件代码:
/// <reference types="aws-sdk" />
import { Component } from '@angular/core';
import * as aws from 'aws-sdk';
import { SES } from 'aws-sdk'
import { AwsConfig } from '../../../awsConfig';
@Component({
selector: 'app-contact',
templateUrl: './contact.component.html',
styleUrls: ['./contact.component.scss']
})
export class ContactComponent {
private _ses: SES;
constructor() {
this.configureSES();
}
public sendMessage(): void {
let params;
params = {
Destination: {
ToAddresses: [ 'recipient@sample.com' ]
},
Message: {
Body: {
Html: {
Charset: 'UTF-8',
Data: '<h1>HTML needed inside of your email</h1>'
},
Text: {
Charset: 'UTF-8',
Data: 'Or you can use plain text'
}
},
Subject: {
Charset: 'UTF-8',
Data: 'Sample message subject'
}
},
Source: 'sender@sample.com' // Must be registered with AWS
};
this.sendEmail(params);
}
}
private configureSES(): void {
aws.config.credentials = {
accessKeyId: AwsConfig.accessKeyId,
secretAccessKey: AwsConfig.secretAccessKey
};
aws.config.update({
region: AwsConfig.region
});
this._ses = new SES({
apiVersion: '2010-12-01'
});
}
private sendEmail(params): void {
this._ses.sendEmail(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
});
}
}