Отправка электронной почты через Node.js с помощью nodemailer не работает
Я установил базовый сервер NodeJS (используя модуль nodemailer) локально (http://localhost:8080
) только для того, чтобы проверить, действительно ли сервер может отправлять электронные письма.
Если я правильно понял параметр SMTP (пожалуйста, поправьте меня, если я ошибаюсь), я могу либо попытаться отправить электронное письмо с моего сервера кому-то прямо на адрес электронной почты, или. Я могу отправить электронной почты, по-прежнему используя Node.js, но через реальную учетную запись электронной почты (в данном случае мою личную учетную запись Gmail), то есть используя SMTP. Этот параметр требует, чтобы я заходил в эту учетную запись удаленно через NodeJS.
Итак, на сервере ниже я фактически пытаюсь использовать NodeJs для отправки электронной почты с моей личной учетной записи электронной почты на мою личную учетную запись электронной почты.
Здесь мой простой сервер:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport("SMTP", {
service: 'Gmail',
auth: {
user: '*my personal Gmail address*',
pass: '*my personal Gmail password*'
}
});
var http = require('http');
var httpServer = http.createServer(function (request, response)
{
transporter.sendMail({
from: '*my personal Gmail address*',
to: '*my personal Gmail address*',
subject: 'hello world!',
text: 'hello world!'
});
}).listen(8080);
Однако он не работает. Я получил электронное письмо от Google:
Учетная запись Google: попытка входа в аккаунт заблокирована Если это ты Вы можете переключиться на приложение Google, такое как Gmail, для доступа к вашей учетной записи (рекомендуется) или изменения ваши настройки в https://www.google.com/settings/security/lesssecureapps, чтобы ваша учетная запись не была более долгое время защищенными современными стандартами безопасности.
Я не мог найти решение этой проблемы на странице nodemailer GitHub. Кто-нибудь имеет решение/предложение?
Спасибо!: -)
Ответы
Ответ 1
Ответ в сообщении от Google.
Для второй части проблемы и в ответ на
На самом деле я просто выполняю шаги с страницы github nodemailer, поэтому в моем коде нет ошибок.
Я отсылаю вас к странице github nodemailer, и этот фрагмент кода:
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: '[email protected]',
pass: 'userpass'
}
});
Он немного отличается от вашего кода, в том, что у вас есть: nodemailer.createTransport("SMTP"
.
Удалите параметр SMTP, и он работает (только что протестирован). Кроме того, зачем инкапсулировать его на http-сервере? следующие работы:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'xxx',
pass: 'xxx'
}
});
console.log('created');
transporter.sendMail({
from: '[email protected]',
to: '[email protected]',
subject: 'hello world!',
text: 'hello world!'
});
Ответ 2
Для тех, кто на самом деле хочет использовать OAuth2/не хотите, чтобы приложение было "менее безопасным", вы можете достичь этого с помощью
Таким образом, вы можете использовать аутентификацию OAuth2 следующим образом
let transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
type: 'OAuth2',
user: '[email protected]',
clientId: '000000000000-xxx0.apps.googleusercontent.com',
clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
expires: 1484314697598
}
});
вместо сохранения пароля gmail в текстовом виде и понижения безопасности в вашей учетной записи.
Ответ 3
Я просто установил свой домен на: smtp.gmail.com, и он работает. Я использую VPS Vultr.
код:
const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs = require('fs');
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: '[email protected]',
pass: 'xxx'
}
});
let mailOptions = {
from: '"xxx" <[email protected]>',
to: '[email protected]',
subject: 'Teste Templete ✔',
html: ejs.render( fs.readFileSync('e-mail.ejs', 'utf-8') , {mensagem: 'olá, funciona'})
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Message %s sent: %s', info.messageId, info.response);
});
мой шаблон ejs (e-mail.ejs):
<html>
<body>
<span>Esse é um templete teste</span>
<p> gerando com o EJS - <%=mensagem%> </p>
</body>
</html>
Удостовериться:
хорошего дня ;)
Ответ 4
Для цели отладки удобно реализовать функцию обратного вызова (они никогда не делают на странице gigub nodemailer), которая показывает сообщение об ошибке (если таковая имеется).
transporter.sendMail({
from: from,
to: to,
subject: subject,
html: text
}, function(err){
if(err)
console.log(err);
})
Это помогло мне решить мою проблему... Оказывает, что более новые версии работают неправильно:
"Похоже, у nodemailer 1.0 есть нарушения, поэтому вместо этого следует использовать 0,7: http://www.nodemailer.com/
Сообщение отправлено на nodemailer по состоянию на 12/17/15:
Не обновляйте Nodemailer от 0.7 или ниже до 1.0, так как есть нарушения. Вы можете продолжать использовать ветвь 0,7, если хотите. См. Документацию для 0.7 здесь.
Я нашел этот ответ здесь
Ответ 5
Вам нужен только пароль для приложения для google auth, а затем замените свой пароль Google в коде.
перейдите сюда https://myaccount.google.com/apppasswords
пример кода:
const nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: "Gmail",
auth: {
user: '[email protected]',
pass: 'app password here'
}
});
transporter.sendMail(option, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
![screenshot]()
Ответ 6
В то время как вышеприведенные ответы действительно работают, я хотел бы указать, что вы можете снизить уровень безопасности из Gmail с помощью следующих шагов TWOstrong > .
ШАГ № 1
Учетная запись Google: попытка входа в систему заблокирована Если это вы, вы можете переключиться на приложение Google, такое как Gmail, для доступа к вашей учетной записи (рекомендуется) или изменить свои настройки на https://www.google.com/settings/security/lesssecureapps, чтобы ваша учетная запись больше не защищалась современными стандартами безопасности.
ШАГ № 2
В дополнение к включению Разрешить менее безопасные приложения вам также может потребоваться перейти на https://accounts.google.com/DisplayUnlockCaptcha и продолжить.
Ответ 7
попробуйте этот код для меня.
var http = require('http');
var nodemailer = require('nodemailer');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
var fromEmail = '[email protected]';
var toEmail = '[email protected]';
var transporter = nodemailer.createTransport({
host: 'domain',
port: 587,
secure: false, // use SSL
debug: true,
auth: {
user: '[email protected]',
pass: 'userpassword'
}
});
transporter.sendMail({
from: fromEmail,
to: toEmail,
subject: 'Regarding forget password request',
text: 'This is forget password response from your app',
html: '<p>Your password is <b>sample</b></p>'
}, function(error, response){
if(error){
console.log('Failed in sending mail');
console.dir({success: false, existing: false, sendError: true});
console.dir(error);
res.end('Failed in sending mail');
}else{
console.log('Successful in sending email');
console.dir({success: true, existing: false, sendError: false});
console.dir(response);
res.end('Successful in sending email');
}
});
}).listen(8000);
console.log('Server listening on port 8000');
ответ:
Successful in sending email
{ success: true, existing: false, sendError: false }
{ accepted: [ '[email protected]' ],
rejected: [],
response: '250 2.0.0 uAMACW39058154 Message accepted for delivery',
envelope:
{ from: '[email protected]',
to: [ '[email protected]' ] },
messageId: '[email protected]' }
Ответ 8
И установите модуль smtp в качестве зависимости:
npm install smtp
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
type: "SMTP",
host: "smtp.gmail.com",
secure: true,
auth: {
user: '[email protected]',
pass: 'YourGmailPassword'
}
});
var mailOptions = {
from: '[email protected]',
to: '[email protected]',
subject: 'Sending Email to test Node.js nodemailer',
text: 'That was easy to test!'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent');
}
});
Перейти к https://myaccount.google.com/lesssecureapps и изменить его, потому что некоторые приложения и устройства используют менее безопасный знак в технологию, что делает Ваш счет более уязвимым. Вы можете отключить доступ к этим приложениям, которые мы рекомендуем, или включить доступ, если вы хотите использовать их, несмотря на риски.
Ответ 9
Это связано с nodemailer.
Я установил последнюю версию nodemailer и версию 8.1.1, установленную в моей системе. В systemjs.config.js я настроил nodemailer как "nodemailer": "npm: nodemailer/lib/nodemailer.js", даже я получаю ошибку.
как включить nodemailer в systemjs.config.js