[转]How To Send Transactional Email In A NodeJS App Using The Mailgun API
https://www.npmjs.com/package/mailgun-js
本文转自:https://www.mailgun.com/blog/how-to-send-transactional-email-in-a-nodejs-app-using-the-mailgun-api
Sending transactional emails nowadays is very important for establishing a healthy customer base. Not only you can get powerful re-engagement based on triggers, actions, and patterns you can also communicate important information and most importantly, automatically between your platform and a customer. It’s highly likely that during your life as a developer you’ll have to send automated transactional emails, if you haven’t already, like:
- Confirmation emails
- Password reminders
…and many other kinds of notifications. In this tutorial, we’re going to learn how to send transactional emails using the Mailgun API using a NodeJS helper library.
We will cover different scenarios:
- Sending a single transactional email
- Sending a newsletter to an email list
- Adding email addresses to a list
- Sending an invoice to a single email address
Getting started
We will assume you have installed and know how to operate within the NodeJS environment. The first need we’re going to do is generate a package.json file in a new directory (/mailgun_nodetut in my case). This file contains details such as the project name and required dependencies.
- {
- "name": "mailgun-node-tutorial",
- "version": "0.0.1",
- "private": true,
- "scripts": {
- "start": "node app.js"
- },
- "dependencies": {
- "express": "4",
- "jade": "*",
- "mailgun-js":"0.5"
- }
- }
As you can see, we’re going to use expressjs for our web-app scaffolding, with jade as a templating language and finally a community-contributed library for node by bojand In the same folder where you’ve created the package.json file create two additional folders:
- views/
- js/
You’re set – now sign in to Mailgun, it’s free if you haven’t done it yet and get your API key (first page in the control panel).
Setup a simple ExpressJS app
Save the code below as app.js in the root directory of your app (where package.json is located)
- //We're using the express framework and the mailgun-js wrapper
- var express = require('express');
- var Mailgun = require('mailgun-js');
- //init express
- var app = express();
- //Your api key, from Mailgun’s Control Panel
- var api_key = 'MAILGUN-API-KEY';
- //Your domain, from the Mailgun Control Panel
- var domain = 'YOUR-DOMAIN.com';
- //Your sending email address
- var from_who = 'your@email.com';
- //Tell express to fetch files from the /js directory
- app.use(express.static(__dirname + '/js'));
- //We're using the Jade templating language because it's fast and neat
- app.set('view engine', 'jade')
- //Do something when you're landing on the first page
- app.get('/', function(req, res) {
- //render the index.jade file - input forms for humans
- res.render('index', function(err, html) {
- if (err) {
- // log any error to the console for debug
- console.log(err);
- }
- else {
- //no error, so send the html to the browser
- res.send(html)
- };
- });
- });
- // Send a message to the specified email address when you navigate to /submit/someaddr@email.com
- // The index redirects here
- app.get('/submit/:mail', function(req,res) {
- //We pass the api_key and domain to the wrapper, or it won't be able to identify + send emails
- var mailgun = new Mailgun({apiKey: api_key, domain: domain});
- var data = {
- //Specify email data
- from: from_who,
- //The email to contact
- to: req.params.mail,
- //Subject and text data
- subject: 'Hello from Mailgun',
- html: 'Hello, This is not a plain-text email, I wanted to test some spicy Mailgun sauce in NodeJS! <a href="http://0.0.0.0:3030/validate?' + req.params.mail + '">Click here to add your email address to a mailing list</a>'
- }
- //Invokes the method to send emails given the above data with the helper library
- mailgun.messages().send(data, function (err, body) {
- //If there is an error, render the error page
- if (err) {
- res.render('error', { error : err});
- console.log("got an error: ", err);
- }
- //Else we can greet and leave
- else {
- //Here "submitted.jade" is the view file for this landing page
- //We pass the variable "email" from the url parameter in an object rendered by Jade
- res.render('submitted', { email : req.params.mail });
- console.log(body);
- }
- });
- });
- app.get('/validate/:mail', function(req,res) {
- var mailgun = new Mailgun({apiKey: api_key, domain: domain});
- var members = [
- {
- address: req.params.mail
- }
- ];
- //For the sake of this tutorial you need to create a mailing list on Mailgun.com/cp/lists and put its address below
- mailgun.lists('NAME@MAILINGLIST.COM').members().add({ members: members, subscribed: true }, function (err, body) {
- console.log(body);
- if (err) {
- res.send("Error - check console");
- }
- else {
- res.send("Added to mailing list");
- }
- });
- })
- app.get('/invoice/:mail', function(req,res){
- //Which file to send? I made an empty invoice.txt file in the root directory
- //We required the path module here..to find the full path to attach the file!
- var path = require("path");
- var fp = path.join(__dirname, 'invoice.txt');
- //Settings
- var mailgun = new Mailgun({apiKey: api_key, domain: domain});
- var data = {
- from: from_who,
- to: req.params.mail,
- subject: 'An invoice from your friendly hackers',
- text: 'A fake invoice should be attached, it is just an empty text file after all',
- attachment: fp
- };
- //Sending the email with attachment
- mailgun.messages().send(data, function (error, body) {
- if (error) {
- res.render('error', {error: error});
- }
- else {
- res.send("Attachment is on its way");
- console.log("attachment sent", fp);
- }
- });
- })
- app.listen(3030);
How it works
This above is a simple express app that will run on your local machine on port 3030. We have defined it to use expressjs and the mailgun-js wrapper. These are pretty well-known libraries that will help us quickly set up a small website that will allow users to trigger the sending of email addresses to their address.
First things first
We’ve defined 4 endpoints.
//submit/:mail/validate/:mail/invoice/:mail
Where :mail is your valid email address. When navigating to an endpoint, Express will send to the browser a different view. In the background, Express will take the input provided by the browser and process it with the help of the mailgun-js library. In the first case, we will navigate to the root that is localhost:3030/ You can see there’s an input box requesting your email address. By doing this, you send yourself a nice transactional email. This is because expressjs takes your email address from the URL parameter and by using your API key and domain does an API call to the endpoint to send emails. Each endpoint will invoke a different layout, I’ve added the code of basic layouts below, feel free to add and remove stuff from it.
Layouts
Save the code below as index.jade within the /views directory
- doctype html
- html
- head
- title Mailgun Transactional demo in NodeJS
- body
- p Welcome to a Mailgun form
- form(id="mgform")
- label(for="mail") Email
- input(type="text" id="mail" placeholder="Youremail@address.com")
- button(value="bulk" onclick="mgform.hid=this.value") Send transactional
- button(value="list" onclick="mgform.hid=this.value") Add to list
- button(value="inv" onclick="mgform.hid=this.value") Send invoice
- script(type="text/javascript" src="main.js")
Save the code below as submitted.jade within the /views directory
- doctype html
- html
- head
- title Mailgun Transactional
- body
- p thanks #{email} !
Save the code below as error.jade within the /views directory
- doctype html
- html
- head
- title Mailgun Transactional
- body
- p Well that's awkward: #{error}
Javascript
This code allows the browser to call a URL from the first form field with your specified email address appended to it. This way we can simply parse the email address from the URL with express’ parametered route syntax. Save the code below as main.js within the /js directory
- var vForm = document.getElementById('mgform');
- var vInput = document.getElementById('mail');
- vForm.onsubmit = function() {
- if (this.hid == "bulk") {
- location = "/submit/" + encodeURIComponent(vInput.value);
- }
- if (this.hid == "list") {
- location = "/validate/" + encodeURIComponent(vInput.value);
- }
- if (this.hid == "inv") {
- location = "/invoice/" + encodeURIComponent(vInput.value);
- }
- return false;
- }
Finally, create an empty invoice.txt file in your root folder. This file will be sent as an attachment. Now run npm install (or sudo npm install in some cases depending on your installation) to download dependencies, including Express. Once that’s done run node app.js Navigate with your browser to localhost:3030 (or 0.0.0.0:3030) And that’s how you get started sending transactional email on demand! In our example, we’ve seen how you can send a transactional email automatically when the user triggers a specific action, in our specific case, submitting the form. There are thousands of applications that you could adapt this scenario to. Sending emails can be used for:
- Registering an account on a site and Hello message email
- Resetting a password
- Confirming purchases or critical actions (deleting an account)
- Two-factor authentication with multiple email addresses
[转]How To Send Transactional Email In A NodeJS App Using The Mailgun API的更多相关文章
- Send an email with format which is stored in a word document
1. Add a dll reference: Microsoft.Office.Interop.Word.dll 2. Add the following usings using Word = M ...
- How to Send an Email Using UTL_SMTP with Authenticated Mail Server. (文档 ID 885522.1)
APPLIES TO: PL/SQL - Version 9.2.0.1 to 12.1.0.1 [Release 9.2 to 12.1]Information in this document a ...
- How to Send an Email Using UTL_SMTP with Authenticated Mail Server
In this Document Goal Solution References APPLIES TO: PL/SQL - Version 9.2.0.1 to 12.1.0.1 [Re ...
- 【译】在Flask中使用Celery
为了在后台运行任务,我们可以使用线程(或者进程). 使用线程(或者进程)的好处是保持处理逻辑简洁.但是,在需要可扩展的生产环境中,我们也可以考虑使用Celery代替线程. Celery是什么? C ...
- Send email alert from Performance Monitor using PowerShell script (检测windows服务器的cpu 硬盘 服务等性能,发email的方法) -摘自网络
I have created an alert in Performance Monitor (Windows Server 2008 R2) that should be triggered whe ...
- 5 Ways to Send Email From Linux Command Line
https://tecadmin.net/ways-to-send-email-from-linux-command-line/ We all know the importance of email ...
- Sending e-mail
E-mail functionality uses the Apache Commons Email library under the hood. You can use theplay.libs. ...
- 在Salesforce中处理Email的发送
在Salesforce中可以用自带的 Messaging 的 sendEmail 方法去处理Email的发送 请看如下一段简单代码: public boolean TextFormat {get;se ...
- magento email模板设置相关
magento后台 可以设置各种各样的邮件,当客户注册.下单.修改密码.邀请好友等等一系列行为时,会有相关信息邮件发出. 进入magento后台,System > Transactional E ...
随机推荐
- 在 npm 中使用 ES6 module
node 从 v8.5.0起 支持了 ES6 module. 只需保存文件名为 .mjs ,并通过一个option 可以开启执行,如 node --experimental-modules index ...
- 打造自己Django博客日记
本教程使用的开发环境 本教程写作时开发环境的系统平台为 Windows 10 (64 位),Python 版本为 3.5.2 (64 位),Django 版本为 1.10.6. 建议尽可能地与教程的开 ...
- 团队-Forward团队-团队一阶段互评
团队名称:Forward团队 学号:2015035107105 得分:7 原因:知识欠缺,能够一边学一边做 学号:2015035107109 得分:6 原因:对我有很多帮助 学号:2015035107 ...
- Apache Tomcat Eclipse Integration
An Illustrated Quick Start Guide Apache Tomcat makes hosting your applications easy. The Eclipse IDE ...
- Centos7 网络报错Job for iptables.service failed because the control process exited with error code.
今天在进行项目联系的时候,启动在待机的虚拟机,发现虚拟机的网络设置又出现了问题. 我以为像往常一样重启网卡服务就能成功,但是它却报了Job for iptables.service failed be ...
- Delphi XE7试用记录1
Delphi XE7试用记录1 在网上看到XE7的一些新特征,觉得完整Unicode支持.扩展Pascal语法.更多功能的库都很吸引人,决定试试XE7. XE7官方安装程序很大,因此选择了lite版, ...
- Nginx 教程(3):SSL 设置
SSL 和 TLS SSL(Socket Secure Layer 缩写)是一种通过 HTTP 提供安全连接的协议. SSL 1.0 由 Netscape 开发,但由于严重的安全漏洞从未公开发布过.S ...
- Redis和memcached缓存技术
缓存的定义:缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去 内容中读取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度 ...
- SSAS 后端数据库访问模块中存在错误。 为绑定指定的大小太小,导致一个或多个列值被截断。
在处理AS的过程中报错如上,经排查发现原因为数据库 “工号” 字段长度过长导致. 因为我的字段内容基本是人名加工号:张三/1001 不曾想有用户录入非正常数据 :张三/100/1001 这样导致我截取 ...
- 2017年全国大学生物联网设计竞赛(TI杯)华东分赛区决赛总结
全国大学生物联网设计竞赛(TI杯)是由教育部高等学校计算机类教学指导委员会主办.上海交通大学电子信息与电气工程学院承办.德州仪器半导体技术公司(TI)协办的赛事,自2014年设立以来,一直是物联网领域 ...