Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 20.04.2021
Сообщений: 12

Отправка email через pubsub

22.04.2021, 00:07. Показов 1204. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет, нужна помощь в написании нового тригера для отправки только одного email на следующий день,после изменения статуса в orders на 'DELIVERED' , тоесть создать квери в триггере sendStatusEmails которая достает ордеры по статусу и id . Кто может помочь с данной проблемой или привести пример?



крона dailyEmails.js:
JavaScript
1
2
3
4
5
6
7
8
9
10
module.exports = functions.pubsub
  .schedule("0 0 12 * *")
  .timeZone("")
  .onRun(async () => {
    await checkUnsentOrders();
    await gameMailUnsentOrders();
    await sendStatusEmails();
 
    ]);
  });
пример триггера gameMailUnsentOrders.js:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
const processGamerStatusReminderEmail = async (gamerOrders: OrderData[]) => {
  const firstOrder = _.head(gamerOrders);
  const gamerName = firstOrder
    ? firstOrder.gamerName
      ? firstOrder.gamerName
      : ""
    : "";
  const gamerId = firstOrder
    ? firstGameOrder.gamerId
      ? firstGameOrder.gamerId
      : ""
    : "";
  const gamerData = await (await gamer.doc(gamerId).get()).data();
  const gamerReminderEmail = gamerData.reminderEmail;
  if (gamerReminderEmail === "" || !gamerReminderEmail) {
    console.log(
      ` ${gamerName} reminder email is not detected`
    );
    return;
  }
  let rows = gamerOrders
    .map(
      (doc: OrderData) =>
        `...`
    )
  let view = `<strong>Status: </strong> ${status}(
                `;
  return await sentGameHtmlEmail(
    gamerReminderEmail
  );
};
module.exports = async () => {
    const startDate = startOfDate();
    const endDate = endOfDate();
    const dateBefore = dateBeforeGameDay();
    const finalizedStatusDayBefore = [
      ...finalisedOrdersStatusIds,
             constants.DELIVERED.id,
 
    ];
    let listGameOrders = await getGameOrdersMailing(startDate, endDate);
    let ordersStatus = listGameOrders.filter((gameOrder) => {
      const gameDate = DateTime.fromJSDate(gameOrder.gamePDate)
      .toJSDate();
      if (dateBefore.getDay() === gameDate.getDay()) {
        return !finalizedStatusDayBefore.includes(gameOrder.gameStatus.id);
      }
      return !finalisedOrdersStatusIds.includes(gameOrder.gameStatus.id);
    });
    let orderedByGamerId = _.orderBy(
      ordersStatus.map((order) => order),
      "gamerId"
    );
    return await Promise.all(
      _.map(orderedByGamerId, (gameOrders: OrderData[]) => {
        return processGamerReminderEmail(gameOrders);
      })
    );
  };
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2021, 00:07
Ответы с готовыми решениями:

Отправка email в функции (nodemailer)
Привет, необходимо сделать функцию отправки email'ов на node.js, тестовое сообщение создается нормально, без ошибок, как переношу все в...

Отправка на email файла чреез ajax и Jquery
Всем привет. Есть ли тут люди, которые смогли реализовать &quot;отправку на email с присоединенным файлом&quot; через ajax и Jquery? Если...

Отправка Email через Pascal
Как отправить сообщение по почте? Напишите пример пожалуйста

5
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
22.04.2021, 12:53
вам не достаточно просто доставать по статусу, т.к. статус мог быть изменён позавчера или ещё ранее и мы уже отправляли ему эмайл..

тут нужно подумать как реализовать, что бы он выбирал только вчера изменённые статус..

как 1 из вариантов, добавить новую колонку с statusChangedDate и каждый раз когда обновляете статус - менять эту колонку тоже, куда записывать "когда" вы поменяли статус..

ну и тогда квери будет выглядеть что-то типо "

SQL
1
2
3
4
5
6
SELECT
  id
FROM mytable
WHERE
  STATUS = 'DELIVERED' AND
  statusChangedDate BETWEEN DATEADD(DAY, -2, SYSDATETIME()) AND CONVERT (DATE, SYSDATETIME())
(нужно уточнить точно как date query правильно оформить, но вроде как-то так)

ну и затем пишите вшу функцию, делаете квери, обрабатываете данные..
0
0 / 0 / 0
Регистрация: 20.04.2021
Сообщений: 12
25.04.2021, 00:38  [ТС]
muxahuk1214,


mailer.ts:
JavaScript
1
2
3
4
5
6
7
8
9
export const sendNewMail = async (html: string, emails: string[]) => {
  let smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: "...",
      pass: "...",
    },
  });
  };
triggerExample.ts:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
import { sendNewMail  } from "../../mail.ts";
 
const ordersExample = await getExample();
    ordersExample.forEach(async order => {
      const email = order.sentEmails.email
let html = ` ...
         <img src="cid:image" width="100%" />
 
`;
 
      await sendNewMail (html,[email]);

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  var mailOptions = {
    from: "@gmail.com",
    to: emails,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
  }],
  };
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${errors}`);
      }
    }
  );
Как можно корректно вставить через async/await вот этот mailOptions ↑ в exampleTriggers,а не в mail.ts ?
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
25.04.2021, 03:45
Цитата Сообщение от typicalsort Посмотреть сообщение
в exampleTriggers,а не в mail.ts ?
пришлите пример, как вы это видите, а то я не догоняю что вы хотите сделать...
0
0 / 0 / 0
Регистрация: 20.04.2021
Сообщений: 12
25.04.2021, 15:01  [ТС]
Ок,
есть mailer.ts, в котором параметры node mailer :
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
export const sendNewMail = async (html: string, emails: string[]) => {
  let smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: "...",
      pass: "...",
    },
  });
[B] var mailOptions = {. //нужно что бы этот блок был в triggerExample.ts ,а не в mailer.ts
    from: "@gmail.com",
    to: emails,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
  }],
  };
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${errors}`);
      }
    }
  );
  };[/B]
Тоесть что бы было так :

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { sendNewMail  } from "../../mail.ts";
 
const ordersExample = await getExample();
    ordersExample.forEach(async order => {
      const email = order.sentEmails.email
let html = ` ...
         <img src="cid:image" width="100%" />
 
`;
 
 [B]var mailOptions = {
    from: "@gmail.com",
    to: emails,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
  }],
  };
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${errors}`);
      }
    }
  );[/B]
      await sendNewMail (html,[email]);
 }) 
           
  
  };
Добавлено через 8 минут
Просто если я делаю так, то await sendNewMail (html,[email]); - unreachable code ;

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { sendNewMail  } from "../../mail.ts";
 
const ordersExample = await getExample();
    ordersExample.forEach(async order => {
      const email = order.sentEmails.email
let html = ` ...
         <img src="cid:image" width="100%" />
 
`;
 
 [B]var mailOptions = {
    from: "@gmail.com",
    to: emails,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
  }],
  };
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${errors}`);
      }
    }
  );[/B]
      await sendNewMail (html,[email]);
 }) 
           
  
  };
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
25.04.2021, 15:04
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// mailer.ts
export function createTransport() {
  return nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: "...",
      pass: "...",
    },
  });
}
 
// triggerExample.ts
import { createTransport } from "../../mail.ts";
 
const smtpTransport = createTransport();
 
const ordersExample = await getExample();
 
ordersExample.forEach(async order => {
  const email = order.sentEmails.email
  let html = ` ...
         <img src="cid:image" width="100%" />
 
  `;
 
  const mailOptions = {
    from: "@gmail.com",
    to: email,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
    }],
  };
 
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${email}`);
      }
    }
  );
});
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2021, 15:04
Помогаю со студенческими работами здесь

Отправка email через прокси
Подскажите пожайлуста... Есть процедурка отправки email private void Send() { //Авторизация на SMTP сервере ...

Отправка email через proxy
Ребят помогите пожалуйста, как можно отправить программно почту если стоит proxy. Ничего в голову не идёт)

Отправка email через Socks
Имеется рабочий код: Dim mailMsg As New MailMessage mailMsg.From = New System.Net.Mail.MailAddress(Server.Address) ..................

Отправка email через socket smtp
Прошу помочь в одном скрипте он отправляет email через smtp, не подскажите как внедрить анонимную отправку через Прокси? Примеры...

Отправка файлов на email через приложение
Прога: Из заданной папки собирает в себя файлы определенного типа следующим образом DirectoryInfo ThatDir = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru