Nodejs发邮件组件Nodemailer

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-email-nodemailer/

nodejs-nodemailer

前言

电子邮件,是互联网应用最广泛使用的服务之一,通过电子邮件系统,我们可以与世界上任何一个角落的网络用户进行联系。

使用Nodejs收发电子邮件也非常简单,Nodemailer包就可以帮助快速实现发邮件的功能。

目录

  1. Nodemailer包介绍
  2. 使用Nodemailer发邮件
  3. 发邮件的高级使用

1. Nodemailer包介绍

Nodemailer是一个简单易用的Node.js邮件发送组件,Github项目地址为https://github.com/andris9/Nodemailer

Nodemailer的主要特点包括:

  • 支持Unicode编码
  • 支持Window系统环境
  • 支持HTML内容和普通文本内容
  • 支持附件(传送大附件)
  • 支持HTML内容中嵌入图片
  • 支持SSL/STARTTLS安全的邮件发送
  • 支持内置的transport方法和其他插件实现的transport方法
  • 支持自定义插件处理消息
  • 支持XOAUTH2登录验证
  • 以上的功能特点,已经覆盖了大部分的发邮件的需求了,接下来就让我们动手开始写程序吧。

    2. 使用Nodemailer发邮件

    我的系统环境

    • Win7 64bit
    • Node 0.10.5
    • NPM 1.2.19

    首先,创建项目目录。

    
    ~ D:\workspace\javascript>mkdir nodejs-nodemailer && cd nodejs-nodemailer
    

    新建Node项目配置文件:package.json

    
    ~ vi package.json
    
    {
      "name": "nodejs-nodemailer",
      "version": "0.0.1",
      "description": "nodejs-nodemailer",
      "keywords": [
        "email"
      ],
      "author": "Conan Zhang ",
      "dependencies": {
        "nodemailer": "^1.2.1"
      }
    }
    

    安装nodemailer包

    
    ~ npm install
    
    npm WARN package.json nodejs-nodemailer@0.0.1 No repository field.
    npm WARN package.json nodejs-nodemailer@0.0.1 No README data
    nodemailer@1.2.1 node_modules\nodemailer
    ├── hyperquest@0.3.0 (duplexer@0.1.1, through@2.2.7)
    ├── nodemailer-smtp-transport@0.1.12 (nodemailer-wellknown@0.1.2, smtp-connection@0.1.7)
    ├── buildmail@1.1.1 (addressparser@0.3.1, libbase64@0.1.0, libqp@0.1.1)
    ├── nodemailer-direct-transport@1.0.0 (smtp-connection@0.1.7)
    └── libmime@0.1.3 (libbase64@0.1.0, libqp@0.1.1, iconv-lite@0.4.4)
    

    使用官方提供的例子,通过Gmail邮箱发送邮件。设置发件邮箱 bsspirit@gmail.com,发送到xxxxx@163.com的邮箱。代码如下,使用时把xxxxx的内容替换为自己的内容即可。

    新建一个文件 email.js

    
    var nodemailer = require('nodemailer');
    
    var transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            user: 'bsspirit@gmail.com',
            pass: 'xxxxx'
        }
    });
    
    var mailOptions = {
        from: 'bsspirit ', // sender address
        to: 'xxxxx@163.com', // list of receivers
        subject: 'Hello ✔', // Subject line
        text: 'Hello world ✔', // plaintext body
        html: '<b>Hello world ✔</b>' // html body
    };
    
    transporter.sendMail(mailOptions, function(error, info){
        if(error){
            console.log(error);
        }else{
            console.log('Message sent: ' + info.response);
        }
    });
    

    运行程序

    
    ~ node email.js
    Message sent: 250 2.0.0 OK 1409797959 f1sm216864pdf.43 - gsmtp
    

    打我的163的邮箱,收到刚发的邮件。邮件服务并不是时时的,有的时候会稍微慢一点,可能会有几分钟的延迟。

    mail-163

    同时,我们在Gmail的发件箱中,也可以找到刚刚发出的邮件。

    mail-gmail

    我们这样就掌握了,发邮件基本的操作。接下来,继续介绍一些高级的功能。

    3. 发邮件的高级使用

    Nodemailer提供的,发邮件的高级功能包括:

    • CC和BCC
    • 发送附件
    • 发送HTML格式内容,并嵌入图片
    • 使用安全的SSL通道

    3.1 CC和BCC

    发邮件时选择收件人,有3个选项,TO,CC,BCC。

    • TO: 是收件人
    • CC: 是抄送,用于通知相关的人,收件人可以看到都邮件都抄送给谁了。一般回报工作或跨部门沟通时,都会CC给收件人的领导一份
    • BCC:是密送,也是用于通知相关的人,但是收件人是看不到邮件被密送给谁了。

    程序实现,修改email.js文件中的mailOptions 配置参数,发送给to@163.com,抄送给cc@163.com,密送给bcc@126.com。

    
    var mailOptions = {
        from: 'from@163.com>', // sender address
        to: 'to@163.com', // list of receivers
        cc: 'cc@163.com',
        bcc: 'bcc@126.com',
        subject: 'Hello ✔', // Subject line
        text: 'Hello world ✔', // plaintext body
        html: '<b>Hello world ✔</b>' // html body
    };
    

    3.2 发送附件

    发送附件也是邮件系统的常用功能,Nodemailer支持多种附件策略。接下来,我们测试发送两个文件做为附件。

    文件text0.txt,以字符串,做为文件正文内容。
    文件text1.txt,读取本地文件,做为文件正文内容。

    
    var mailOptions = {
        from: 'bsspirit ',
        to: 'xxxxx@163.com',
        subject: 'Hello ✔',
        text: 'Hello world ✔',
        html: '<b>Hello world ✔</b>' // html body
        attachments: [
            {
                filename: 'text0.txt',
                content: 'hello world!'
            },
            {
                filename: 'text1.txt',
                path: './attach/text1.txt'
            }
        ]
    };
    

    查看收件箱,2个附件都正确!

    mail-163-attach

    3.3 发HTML格式内容,并嵌入图片

    Nodemailer也为我们提供了在HTML的正文中嵌入图片的功能,程序中只要配置cid,作为图片的唯一引用地址就行了。上传本地图片./img/r-book1.png,设置cid为00000001,然后在html的正文中,img标签src属性指向00000001的cid就行了。

    代码如下:

    
    var mailOptions = {
        from: 'bsspirit ',
        to: 'xxxxx@163.com',
        subject: 'Embedded Image',
        html: '<b>Hello world ✔</b><br/>Embedded image: <img src="cid:00000001"/>',
        attachments: [{
            filename: '01.png',
            path: './img/r-book1.png',
            cid: '00000001'
        }]
    }
    

    打开收件箱,查看邮件正文内容,图片被嵌入到了邮件的正文中显示。

    mail-163-imge

    3.4 使用安全的SSL通道

    为了邮件正文内容的安全性,我们通常都会加密发送,防止邮件在网络传输过程中,明文被路由的中间服务器所截获。大部分的邮件服务商都支持SSL的加密通道。

    Gmail的SSL发邮件配置,我要新建一个Transport变量stransporter,配置端口为465,secureConnection属性设置为true,可以参考以下的代码:

    
    var stransporter = nodemailer.createTransport({
        service: 'Gmail',
        secureConnection: true, // use SSL
        port: 465, // port
        auth: {
            user: 'bsspirit@gmail.com',
            pass: 'xxxxxxxxx'
        }
    });
    
    function ssl(){
        var mailOptions = {
            from: 'bsspirit ',
            to: 'xxxx@163.com',
            subject: 'SSL Email',
            html: 'Hello world'
        }
        return mailOptions;
    }
    
    stransporter.sendMail(ssl(), function(error, info){
        if(error){
            console.log(error);
        }else{
            console.log('Message sent: ' + info.response);
        }
    });
    

    运行程序

    
    ~ node email.js
    Message sent: 250 2.0.0 OK 1409807603 zs5sm478150pbb.83 - gsmtp
    

    很简单的几行代码,就能完成功能。

    Nodemailer包给我们提供了一套非常简单的发邮件的API,让我们用几行代码就能完成发邮件的任务,大大简化了邮件协议的学习成本,提高了开发的效率。但对于一个完整的邮件系统来说,收邮件的部分才是最复杂的,发邮件只是给我们练练手。等我找到适合的收邮件的库,再进行详细的介绍。

    转载请注明出处:
    http://blog.fens.me/nodejs-email-nodemailer/

    打赏作者

    This entry was posted in Javascript语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

27 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
AbnerZheng

推荐的邮件库很棒,谢谢楼主

Conan Zhang

🙂

snowdream

密码被明文写在文件里,这样不会有安全隐患吗?

Conan Zhang

怎么保存密码和传输密码,是你自己的事情。

阿安

附件的path中如果带有中文路径,虽然发送成功了,但是我去收件箱一看,收件箱的附件是错误的,而且附件文件名页变成了类似下面这种:
tcmime.1174.1336.1552.bin (4.45M

Conan Zhang

我会尽量避免中文路径。

LL101SS

filename: ‘text0.txt’,
content: ‘hello world!’
文件名怎么变成 attachment-1.bin, 第二个正常?

LL101SS

发附件的时候,filename随便取了一个,但邮箱的附件中,文件的名字却是我上传的文件的名字?

Conan Zhang

具体细节查官方API吧

fice

请问博主有没有遇到过在Linux环境下提示getaddinfo错误的情况?我试过在windows环境下发送邮件都正常,但是挪到Linux下面后就报那个错

Gaylord Hsu

跪求在哪里可以download
Nodemailer 0.7.1

多谢博主

Conan Zhang

直接在npm的package.json配置成你要的版本就行了。

coolswitch

你好,我想收邮件,请问有什么库吗

Conan Zhang

最近太忙回复晚了,收邮件比较复杂。

imap, https://github.com/mscdex/node-imap
pop3, https://github.com/andris9/n3

zkaip

Google说不安全登录,拒绝登录了,SSL也不行…于是无法用Gmail发送邮件…

Conan Zhang

Google被墙了,用VPN再试试

sherry

发附件要中文名称,乱码怎么解决

Conan Zhang

node里面没有中文乱码问题吧?
我统一用UTF-8的。

sherry

attachments: [

{

//filename: new Buffer(‘测试’,’utf-8′),

//filename: locals.str,

filename: (new String(“测试”.getBytes(“UTF-8″),”ISO-8859-1”)),

//encoding: ‘base64’,

//filename: MimeUtility.encodeText(‘测试.doc’),

path: locals.attachPath

//path: ‘E:/baoming/trunk/www/public/upload/email_attach/565fe4ed1fa80.doc’

}

]

是附件是中文名,发到QQ邮箱,附件名是乱码

dogsmall

如果我要接收邮件该怎么办呢?如何能从抓到的邮件中把正文,附件分别提取出来还原成原本的格式内容?

Conan Zhang

抱歉回复晚了,收邮件是比较复杂的,需要用收邮件的包。

如:

imap, https://github.com/mscdex/node-imap
pop3, https://github.com/andris9/n3

dogsmall

恩,我用了imap和nodeparser基本上能解决了

smalike

如何避免重复发送邮件?

Conan Zhang

你如果怕发重了,你自己做个数据库,只要这个邮件地址发过了就不在发了,每次发之前检查一下。

杨俊林

请问楼主附件名称中文乱码是在哪里设置编码格式的?

Arvin

请问,我用163向qq邮箱发送邮件,携带附件和图片的时候,会报错Error: Message failed: 554 DT:SPM 163 smtp11;去掉附件就ok,请问这个该怎么解决

27
0
Would love your thoughts, please comment.x
()
x