[转]emailjs-smtp-client
本文转自:https://github.com/emailjs/emailjs-smtp-client/blob/master/README.md
SMTP Client
SMTP Client allows you to connect to and stream data to a SMTP server in the browser.
StringEncoding API
This module requires TextEncoder and TextDecoder to exist as part of the StringEncoding API (see: MDN whatwg.org). Firefox 19+ is basically the only browser that supports this at the time of writing, while Chromium in canary, not stable. Luckily, there is a polyfill!
Depending on your browser, you might need this polyfill for ArrayBuffer #slice, e.g. phantomjs.
TCPSocket API
There is a shim that brings Mozilla-flavored version of the Raw Socket API to other platforms.
If you are on a platform that uses forge instead of a native TLS implementation (e.g. chrome.socket), you have to set the .oncert(pemEncodedCertificate) handler that passes the TLS certificate that the server presents. It can be used on a trust-on-first-use basis for subsequent connection.
If forge is used to handle TLS traffic, you may choose to handle the TLS-related load in a Web Worker. Please use tlsWorkerPath to point to tcp-socket-tls-worker.js!
Please take a look at the tcp-socket documentation for more information!
Installation
npm:
npm install --save emailjs-smtp-client
Quirks
STARTTLSis currently not supported- Only
PLAIN,USERandXOAUTH2authentication mechanisms are supported.XOAUTH2expects a ready to use access token, no tokens are generated automatically.
Usage
AMD
Require emailjs-smtp-client.js as emailjs-smtp-client
Global context
Include files emailjs-smtp-client-response-parser.js and emailjs-smtp-client.js on the page.
<script src="emailjs-smtp-client-response-parser.js"></script>
<script src="emailjs-smtp-client.js"></script>
This exposes global variable emailjs-smtp-client
API
Create SmtpClient object with:
var client = new SmtpClient(host, port, options)
where
- host is the hostname to connect to (defaults to "localhost")
- port is the port to connect to
- options is an optional options object (see below)
Connection options
The following connection options can be used with simplesmtp.connect:
- useSecureTransport Boolean Set to true, to use encrypted connection
- name String Client hostname for introducing itself to the server
- auth Object Authentication options. Depends on the preferred authentication method
- user is the username for the user (also applies to OAuth2)
- pass is the password for the user if plain auth is used
- xoauth2 is the OAuth2 access token to be used instead of password. If both password and xoauth2 token are set, the token is preferred.
- authMethod String Force specific authentication method (eg.
"PLAIN"for usingAUTH PLAINor"XOAUTH2"forAUTH XOAUTH2) - ca (optional) (only in conjunction with this TCPSocket shim) if you use TLS with forge, pin a PEM-encoded certificate as a string. Please refer to the tcp-socket documentation for more information!
- tlsWorkerPath (optional) (only in conjunction with this TCPSocket shim) if you use TLS with forge, this path indicates where the file for the TLS Web Worker is located. Please refer to the tcp-socket documentation for more information!
- disableEscaping Boolean If set to true, do not escape dots on the beginning of the lines
- logLength Number How many messages between the client and the server to log. Set to false to disable logging. Defaults to 6
- ignoreTLS – if set to true, do not issue STARTTLS even if the server supports it
- requireTLS – if set to true, always use STARTTLS before authentication even if the host does not advertise it. If STARTTLS fails, do not try to authenticate the user
- lmtp - if set to true use LMTP commands instead of SMTP commands
Default STARTTLS support is opportunistic – if the server advertises STARTTLS in EHLO response, the client tries to use it. If STARTTLS is not advertised, the clients sends passwords in the plain. You can use ignoreTLS and requireTLS to change this behavior by explicitly enabling or disabling STARTTLS usage.
XOAUTH2
To authenticate using XOAUTH2, use the following authentication config
var config = {
auth: {
user: 'username',
xoauth2: 'access_token'
}
};
See XOAUTH2 docs for more info.
Connection events
Once a connection is set up the following events can be listened to:
- onidle - the connection to the SMTP server has been successfully set up and the client is waiting for an envelope. NB! this event is emitted multiple times - if an e-mail has been sent and the client has nothing to do,
onidleis emitted again. - onready
(failedRecipients)- the envelope is passed successfully to the server and a message stream can be started. The argument is an array of e-mail addresses not accepted as recipients by the server. If none of the recipient addresses is accepted,onerroris emitted instead. - ondone
(success)- the message was sent - onerror
(err)- An error occurred. The connection will be closed shortly afterwards, so expect anoncloseevent as well - onclose
(isError)- connection to the client is closed. IfisErroris true, the connection is closed because of an error
Example:
client.onidle = function(){
console.log("Connection has been established");
// this event will be called again once a message has been sent
// so do not just initiate a new message here, as infinite loops might occur
}
Sending an envelope
When an onidle event is emitted, an envelope object can be sent to the server. This includes a string from and a single string or an array of strings for to property.
Envelope can be sent with client.useEnvelope(envelope)
// run only once as 'idle' is emitted again after message delivery
var alreadySending = false; client.onidle = function(){
if(alreadySending){
return;
}
alreadySending = true;
client.useEnvelope({
from: "me@example.com",
to: ["receiver1@example.com", "receiver2@example.com"]
});
}
The to part of the envelope must include all recipients from To:, Cc: and Bcc: fields.
If envelope setup up fails, an error is emitted. If only some (not all) recipients are not accepted, the mail can still be sent. An onready event is emitted when the server has accepted the from and at least one to address.
client.onready = function(failedRecipients){
if(failedRecipients.length){
console.log("The following addresses were rejected: ", failedRecipients);
}
// start transfering the e-mail
}
Sending a message
When onready event is emitted, it is possible to start sending mail. To do this you can send the message with client.sendcalls (you also need to call client.end() once the message is completed).
send method returns the state of the downstream buffer - if it returns true, it is safe to send more data, otherwise you should (but don't have to) wait for the ondrain event before you send more data.
NB! you do not have to escape the dots in the beginning of the lines by yourself (unless you specificly define so with disableEscaping option).
client.onready = function(){
client.send("Subject: test\r\n");
client.send("\r\n");
client.send("Message body");
client.end();
}
Once the message is delivered an ondone event is emitted. The event has an parameter which indicates if the message was accepted by the server (true) or not (false).
client.ondone = function(success){
if(success){
console.log("The message was transmitted successfully with "+response);
}
}
Logging
At any time you can access the traffic log between the client and the server from the client.log array.
client.ondone = function(success){
// show the last message
console.log(client.log.slice(-1));
}
Closing the connection
Once you have done sending messages and do not want to keep the connection open, you can gracefully close the connection with client.quit() or non-gracefully (if you just want to shut down the connection and do not care for the server) with client.close().
If you run quit or close in the ondone event, then the next onidle is never called.
Get your hands dirty
git clone git@github.com:whiteout-io/smtpclient.git
cd smtpclient
npm install && npm test
To run the integration tests against a local smtp server
grunt smtp
add the test folder as a chrome app (chrome settings -> extensions -> check 'developer mode' -> load unpacked extension)
[转]emailjs-smtp-client的更多相关文章
- 【RL-TCPnet网络教程】第34章 RL-TCPnet之SMTP客户端
第34章 RL-TCPnet之SMTP客户端 本章节为大家讲解RL-TCPnet的SMTP应用,学习本章节前,务必要优先学习第33章的SMTP基础知识.有了这些基础知识之后,再搞本章节会有事 ...
- .net SMTP 发送邮件
using System.Net.Mail; public static bool SendMail(string messTo,string messBody) { MailMessage mess ...
- C#发送电子邮件(SMTP)及outlook.com账号之概要
这是关于c#发送电子邮件(SMTP)的技术笔记,以”简报“形式呈现. 因为最后成功通过outlook.com发送了邮件,所以,我觉得还是有必要 记录一下其中的要点. 一.技术核心 .net Frame ...
- C#发送Outlook邮件(仅SMTP版本)
先表明Outlook的参数:网址:https://support.office.com/zh-cn/article/Outlook-com-%E7%9A%84-POP%E3%80%81IMAP-%E5 ...
- Go语言实战 - 使用SendCloud群发邮件
山坡网需要能够每周给注册用户发送一封名为"本周最热书籍"的邮件,而之前一直使用的腾讯企业邮箱罢工了,提示说发送请求太多太密集. 一番寻找之后发现了大家口碑不错的搜狐SendClou ...
- error-2016-1-18
SSL 连接出错 错误: "System.Net.Mail.SmtpException"类型的未经处理的异常在 System.dll 中发生 其他信息: SMTP 服务器要求安全连 ...
- shell脚本常规技巧
邮件相关 发送邮件: #!/usr/bin/python import sys; import smtplib; from email.MIMEText import MIMEText mail_ho ...
- SSIS Send Mail
在SSIS中Send Mail的方法主要有三种,使用Send Mail Task,使用Script Task和使用存储过程msdb.dbo.sp_send_dbmail. 一,使用Send Mail ...
- C#邮件发送问题(一)
邮件发送需考虑很多因素,包括发送邮件客户端(一般编码实现),发送和接收邮件服务器设置等.如果使用第三方邮件服务器作为发送服务器,就需要考虑该服务器的发送限制,(如发送邮件时间间隔,单位时间内发送邮件数 ...
随机推荐
- django 打印sql语句
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DE ...
- 耗时 2 年,用 8.5 万块乐高积木最牛复刻 Apple Park
简评:国外大佬复刻 Apple Park,看了一下细节,确实厉害!只有你想不到,没有乐高拼不起来的,有没有乐高大神挑战一下? 苹果公园以各种各样的方式鼓舞人心,让人感兴趣.从建筑.可持续性和成本,到像 ...
- navicat for oracle 创建表ID字段的自动递增
Oracle数据库创建表ID字段的自动递增 将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现) ----创建表 Create table t_user( Id numbe ...
- python自学之第一章 —— 变量
1.变量的命名(): (1).可以包含数字.字母.下划线‘_’,但只能以字母和下划线‘_’开头,不能以数字开头! (2).变量的命名不能包含空格. (3).不能将python中的关键字(reserve ...
- numpy 模块常用方法
Numpy是科学计算库,是一个强大的N维数组对象ndarray,是广播功能函数.其整合C/C++.fortran代码的工具 ,更是Scipy.Pandas等的基础 .ndim :维度 .shape : ...
- 总结day6 ---- set集合,基本类型的相互转化,编码,数据类型总结,循环时候不要动列表或者字典,深浅copy
python小数据池,代码块的最详细.深入剖析 一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id ...
- Linux之virtualbox中的ubuntu虚拟机linux系统共享文件夹
windows通过virtualbox软件与linux系统机型文件共享 1.第一步 在设置中找到共享文件夹选项,选择添加共享文件夹 2.第二步 选择需要与linux进行共享的文件夹,并选择固定分配 3 ...
- eclipse如何设置UTF-8
一.Eclipse设置utf-8编码包括两个方面,一方面可以设置workspace工作间编码,另一方面可以设置Android Project项目编码,设置步骤: 1)设置workspace工作间编码: ...
- Spring Boot 笔记汇总
使用IDEA搭建Spring Boot入门项目 从零开始完整搭建 Spring-Boot 项目开发框架的教程 IDEA通过Maven WebApp archetype 创建Spring boot项目骨 ...
- 解决织梦dedecms文档关键字(自动内链)php5.5以上失效的问题 urf-8版本的
找到include/arc.archives.class 在里面需要修改两次地方 在1230行 // 这里可能会有错误 if (version_compare(PHP_VERSION, '5.5.0' ...