Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.12.2018, 18:26
Новичок на форуме
Отправить личное сообщение для mcBiba Посмотреть профиль Найти все сообщения от mcBiba
 
Регистрация: 11.12.2018
Сообщений: 9

Функция отправки email'ов nodemailer
Привет, необходимо сделать функцию отправки email'ов на node.js, если писать без функции то тестовое сообщение создается без ошибок, как переношу все в функцию, то выводит в консоли 'undefined'. Я так понял что надо асинхронно делать, приведу пример с попыткой реализации на асинхронности.

По возможности хотел получить только направление на решение, без готового кода, спасибо !

let express =require("express");
let app = express();
let server = app.listen(2800, ()=> console.log("Работа пошла"));
var nodemailer = require("nodemailer");
 
app.get('/',function(req,res){
  let userPassword = 1;
  let userEmail = 'ga@ya.ru';
  let result = 'Не вызывано';
  let main =  async (userEmail,userPassword) => {
    await nodemailer.createTestAccount(async (err, account) => {
      errortext = err;
      let transporter = nodemailer.createTransport({
        host: 'smtp.ethereal.email',
        port: 587,
        secure: false,
        auth: {
          user: account.user,
          pass: account.pass
        }
      });
      let mailOptions = {
        from: '"Heano" <games.1212@yandex.ru>',
        to: userEmail,
        subject: 'Регистрация вњ”',
        text: 'Твой пароль: '+userPassword,
        html: 'Твой пароль:<b> '+userPassword+'</b>'
      };
      await transporter.sendMail(mailOptions,(error, info) =>{
        if (error) {
          result = "Не отправлено";
        }
        else{
          result = "Отправлено";
        }
        return result;
      });
    });
  }
  main(userEmail,userPassword).then(result=>console.log(result));
});
Ответить с цитированием
  #2 (permalink)  
Старый 11.12.2018, 19:28
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

mcBiba,
вы хотите чтобы письмо отправлялось всякий раз когда кто-то заходит на главную?
Ответить с цитированием
  #3 (permalink)  
Старый 11.12.2018, 23:33
Новичок на форуме
Отправить личное сообщение для mcBiba Посмотреть профиль Найти все сообщения от mcBiba
 
Регистрация: 11.12.2018
Сообщений: 9

j0hnik,
Нет я вывел код в отдельный проект для отладки и что бы можно было поделиться проблемой. Так email отправляется при регистрации, восстановлении пароля и еще в нескольких местах (все это в другом проекте).
Ответить с цитированием
  #4 (permalink)  
Старый 12.12.2018, 06:19
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

1. Убери функцию за пределы обработчика запроса (так можно делать, ага).
2. Объяви обычную человеческую функцию и просто вставь в неё код из примера
function main(userEmail, userPassword) {
  ...
}

3. Перестань приписывать к готовому примеру с сайта эти async и await - всё равно не понимаешь, зачем они и как работают, при том что весь код в Нодемейлере синхронный (за исключением колбека с ответом от smtp-сервера о результате отправки).
4. Вызови функцию в обработчике
main(userEmail, userPassword);

5. Всё.

UPD
Ну и метод createTestAccount - он не для реальной жызни, в реальной жызни он не нужен.

Последний раз редактировалось Audaxviator, 12.12.2018 в 06:31.
Ответить с цитированием
  #5 (permalink)  
Старый 12.12.2018, 16:23
Новичок на форуме
Отправить личное сообщение для mcBiba Посмотреть профиль Найти все сообщения от mcBiba
 
Регистрация: 11.12.2018
Сообщений: 9

Audaxviator,
Если у меня недавно профиль появился тут не значит, что я ничего не понимаю. Я это все сюда вывел и в такой вид из за неудачи. Он как обычная функция возвращает undefined.
let express =require("express");
let app = express();
let server = app.listen(2800, ()=> console.log("Работа пошла"));
var nodemailer = require("nodemailer");

app.get('/',function(req,res){
  console.log(sendEmail('f@ya.ru','1'));
});


function sendEmail(email,password){
  nodemailer.createTestAccount((err, account) => {
    errortext = err;
    let transporter = nodemailer.createTransport({
      host: 'smtp.ethereal.email',
      port: 587,
      secure: false,
      auth: {
        user: account.user,
        pass: account.pass
      }
    });
    let mailOptions = {
      from: '"Heano" <games.1212@yandex.ru>',
      to: email,
      subject: 'Регистрация ✔',
      text: 'Твой пароль: '+password,
      html: 'Твой пароль:<b> '+password+'</b>'
    };
    transporter.sendMail(mailOptions,(error, info) =>{
      if (error) {
        return false;
      }
      else{
        return true;
      }
    });
  });
}



Консоль

[nodemon] 1.18.6
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node app.js`
Работа пошла
undefined

/Консоль

Зачем мне менять createTestAccount, если я функцию отправки не могу сделать?
Ответить с цитированием
  #6 (permalink)  
Старый 12.12.2018, 17:07
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Надо sendMail завернуть в Promise и в transporter.sendMail(mailOptions,(error, info) => вызывать для true resolve, для false reject

В данном случае, он и должен возвращать undefined, потому что sendMail ничего и не возвращает %)

И в роуте надо при resolve вызывать уже res.send и тп...
Ответить с цитированием
  #7 (permalink)  
Старый 12.12.2018, 17:18
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Примерно так, но надо проверять...
let express = require("express");
let app = express();
var nodemailer = require("nodemailer");

app.get('/', function (req, res) {
  sendEmail('f@ya.ru', '1').then(() => {
    console.log('sended')
    res.send('sended')
  }).catch((error) => {
    console.log(error)
    res.send('error')
    // res.send(error.message)
  })
  // console.log(sendEmail('f@ya.ru', '1'));
});

function sendEmail(email, password) {
  return new Promise((resolve, reject) => {
    nodemailer.createTestAccount((err, account) => {
      errortext = err;
      let transporter = nodemailer.createTransport({
        host: 'smtp.ethereal.email',
        port: 587,
        secure: false,
        auth: {
          user: account.user,
          pass: account.pass
        }
      });
      let mailOptions = {
        from: '"Heano" <games.1212@yandex.ru>',
        to: email,
        subject: 'Регистрация ✔',
        text: 'Твой пароль: ' + password,
        html: 'Твой пароль:<b> ' + password + '</b>'
      };
      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          reject(error)
          // return false;
        }
        else {
          resolve()
          // return true;
        }
      });
    });
  })
}

let server = app.listen(2800, () => console.log("Работа пошла"));
Ответить с цитированием
  #8 (permalink)  
Старый 12.12.2018, 17:23
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Рас
function foo(email, password) {

	return new Promise(function(resolve, reject) {

		nodemailer.createTestAccount(function(err, account) {
			var transporter = nodemailer.createTransport({
				//service: 'Gmail',
				host: 'smtp.ethereal.email',
				port: 587,
				secure: true, // use SSL
				auth: {
					user: account.user,
					pass: account.pass
				}
			});

			var message = {
				from: '"Heano" <games.1212@yandex.ru>',
				to: email,
				subject: 'Регистрация ✔',
				text: 'Твой пароль: '+ password,
				html: 'Твой пароль:<b> '+ password+'</b>'
			};

			transporter.sendMail(message, function (err, info) {
					if (err) {
							resolve('Error:', err.message);
							return;
					}
					resolve('Server responded with ' + info.response);
			});
		});
	});
}

Два
foo('f@ya.ru', '1')
	.then(function(info) {
		console.log(info);
	})
	.catch(function(err) {
		console.log(err);
	});
Ответить с цитированием
  #9 (permalink)  
Старый 12.12.2018, 17:27
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Audaxviator, в данном случае у тебя два раза resolve, так что catch не будет работать... надо для catch вызывать reject
Ответить с цитированием
  #10 (permalink)  
Старый 12.12.2018, 17:28
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Рас
function foo(email, password) {
	nodemailer.createTestAccount(function(err, account) {
		var transporter = nodemailer.createTransport({
			host: 'smtp.ethereal.email',
			port: 587,
			secure: true,
			auth: {
				user: account.user,
				pass: account.pass
			}
		});

		var message = {
			from: '"Heano" <games.1212@yandex.ru>',
			to: email,
			subject: 'Регистрация ✔',
			text: 'Твой пароль: '+ password,
			html: 'Твой пароль:<b> '+ password+'</b>'
		};

		transporter.sendMail(message, function (err, info) {
			if (err) {
				console.log('Error:' + err.message);
				return;
			}
			   console.log('Server responded with ' + info.response);
		});
	});
}

Два
foo('f@ya.ru', '1')

Последний раз редактировалось Audaxviator, 12.12.2018 в 17:44.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просмотрела исходик jQuery Откорректируйте где не верно taksebe jQuery 5 23.11.2018 22:42
Функция вызывается несколько раз KiberQ Общие вопросы Javascript 11 01.03.2017 15:45
функция отправки изображений как отправить и данные из селекта imedia Элементы интерфейса 1 25.08.2014 13:03
Как сделать disabled кнопки во время отправки формы? Bad Request Events/DOM/Window 7 16.04.2014 13:49
AJAX функция для новых html-элементов broadcast77 AJAX и COMET 25 03.03.2014 14:01