Статьи

Сервер электронной почты, SMS и Push-уведомлений

Недавно я придумал очень удобный компонент —  likeastore / notifier . Notifier прост в настройке электронной почты, SMS и сервера push-уведомлений. Это был открытый источник несколько месяцев, очень специфичный для   потребностей Likeastore , но благодаря большому  вкладу  он стал очень общим и может использоваться в ваших проектах.

Как только вам нужно настроить инфраструктуру для уведомлений в вашем приложении, это будет действительно легко сделать. Он обеспечивает транспортировку   push-уведомлений MandrillTwilioAndroid  и  Apple .

Начинать

Проект уже имеет всеобъемлющий  README,  который объясняет начальные шаги. На данный момент сервер доступен в виде github-репозитория, который вам нужно клонировать и подготовить точку входа для него. Я думаю собрать вещи в один  npm модуль. Если вы видите, что это имеет смысл, пожалуйста, дайте мне знать.

Для начала вам нужно клонировать репо,

$ git clone https://github.com/likeastore/notifier.git

А потом создайте  app.js файл, там вся настройка  notifer проходит.

var notifier = require('./source/notifier');

// TODO: configuration

// start the server
notifier.start(process.env.PORT || 7000);

Давай перейдем прямо к  configuration части.

События, Акции и Исполнители

notifier Является HTTP — сервер, который принимает  event и повороты , что события в соответствующие  action. Одно событие может создать столько действий, сколько необходимо. Действия это то, что позже будет  executed.

Базовая настройка состоит из 3 частей: получение события, разрешение события и его выполнение.

notifier
    .receive('incoming-event', function (event, actions, callback) { /* ... */ })
    .resolve('created-action', function (action, actions, callback) { /* ... */ })
    .execute('created-action', function (action, transport, callback) { /* ... */ });

Скажем, у нас есть  user-registered событие, которое нам нужно отправить приветственное письмо,

notifier
  .receive('user-registered', function (e, actions, callback) {
      actions.create('send-welcome', {user: e.user}, callback);
  })
  .resolve('send-welcome', function (action, actions, callback) {
      db.users.findOne({email: action.user}, function (err, user) {
          if (err) {
              return callback(err);
          }

          if (!user) {
              return callback({message: 'user not found', email: action.email});
          }

          var data = {
              email: action.user,
              user: _.pick(user, userPick)
          };

          actions.resolved(action, data, callback);
      });
  })
  .execute('send-welcome', function (action, transport, callback) {
      var vars = [
          {name: 'USERID', content: action.data.user._id},
          {name: 'USER_NAME', content: action.data.user.displayName || action.data.user.name}
      ];

      transport.mandrill('/messages/send-template', {
          template_name: 'welcome-email',
          template_content: [],
          message: {
              auto_html: null,
              to: [{email: action.data.email}],
              global_merge_vars: vars,
              preserve_recipients: false
          }
      }, callback);
  });
  • recieve — получает событие извне и превращает событие в соответствующее действие.
  • resolve — шаг для расширения действия с дополнительными данными, адресом электронной почты, именем пользователя и т. Д.
  • execute — использует транспорт для передачи события

Транспорты

Mandrill обеспечивает поддержку из уведомлений по электронной почте,

.execute('send-welcome', function (action, transport, callback) {
  var vars = [
      {name: 'USERID', content: action.data.user._id},
      {name: 'USER_NAME', content: action.data.user.displayName || action.data.user.name}
  ];

  transport.mandrill('/messages/send-template', {
      template_name: 'welcome-email',
      template_content: [],
      message: {
          auto_html: null,
          to: [{email: action.data.email}],
          global_merge_vars: vars,
          preserve_recipients: false
      }
  }, callback);
});

Twilio используется из смс,

.execute('send-verify-sms', function (a, transport, callback) {
      transport.twilio.messages.create({
          to: a.data.phone,
          from: '+12282201270',
          body: 'Verification code: 1111',
      }, callback);
  });

Для Android push-уведомлений,

.execute('send-android-push-notification', function (a, transport, callback) {
  var tokens = [];
  tokens.push(a.data.token);

  transport.android.push({
      message: {key1: 'value1', key2: 'value2'},
      tokens: tokens,
      retries: 3
  }, callback);
});

Для Apple push-уведомлений,

.execute('send-ios-push-notification', function (a, transport, callback) {
  var tokens = [];
  tokens.push(a.data.token);

  transport.ios.push({
      production: false, // use specific gateway based on 'production' property.
      passphrase: 'secretPhrase',
      alert: { "body" : "Your turn!", "action-loc-key" : "Play" , "launch-image" : "mysplash.png"},
      badge: 1,
      tokens: tokens
  }, callback);
});

конфигурация

Перед запуском необходимо убедиться, что  notifier настроен правильно. Токены безопасности и строки подключения к MongoDB. Если вы используете Logentries, вы можете предоставить токен, и все журналы будут отправлены туда.

Это  accessToken общий секрет между сервером и клиентом для предотвращения несанкционированного доступа.

Конфигурации  используют переменную ENV по производству и абсолютных значения для разработки и постановки.

клиенты

notifier может использоваться любым HTTP-клиентом, в самом простом случае  curl,

$ echo '{"event": "incoming-event"}' | curl -H "Content-Type:application/json" -d @- http://notifier.likeastore.com/api/events?access_token=ACCESS_TOKEN

У нас уже есть Node.js-клиент  DemocracyOS / notifier-client  и мы планируем также иметь браузерный клиент. Но по сути это просто HTTP-сообщение с  event полезной нагрузкой и  access_token строкой запроса, поэтому в основном его можно использовать с любого языка и платформы.