node.jsでメール送信

node.jsがサーバーサイドのjsならメールも送れるんじゃね。
ということで調べてみました。

環境

メールサーバー:postfixのSMTP AUTH

nodeのフレームワークのexpressで環境を作る

$ npm install express
npm http GET https://registry.npmjs.org/express
npm http 304 https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/mkdirp/0.3.0
npm http GET https://registry.npmjs.org/qs
npm http GET https://registry.npmjs.org/mime/1.2.4
npm http GET https://registry.npmjs.org/connect
npm http 304 https://registry.npmjs.org/qs
npm http 304 https://registry.npmjs.org/mkdirp/0.3.0
npm http 200 https://registry.npmjs.org/mime/1.2.4
npm http GET https://registry.npmjs.org/mime/-/mime-1.2.4.tgz
npm http 304 https://registry.npmjs.org/connect
npm http 200 https://registry.npmjs.org/mime/-/mime-1.2.4.tgz
npm http GET https://registry.npmjs.org/formidable
npm http 200 https://registry.npmjs.org/formidable
npm http GET https://registry.npmjs.org/formidable/-/formidable-1.0.9.tgz
npm http 200 https://registry.npmjs.org/formidable/-/formidable-1.0.9.tgz
express@2.5.8 ./node_modules/express
tqq qs@0.4.2
tqq mime@1.2.4
tqq mkdirp@0.3.0
mqq connect@1.8.5

テンプレートエンジンはejsにしてmail_testディレクトリに雛形を作る

$ express -s -t ejs mail_test
   create : mail_test
   create : mail_test/package.json
   create : mail_test/app.js
   create : mail_test/public
   create : mail_test/public/javascripts
   create : mail_test/public/images
   create : mail_test/public/stylesheets
   create : mail_test/public/stylesheets/style.css
   create : mail_test/routes
   create : mail_test/routes/index.js
   create : mail_test/views
   create : mail_test/views/layout.ejs
   create : mail_test/views/index.ejs
   dont forget to install dependencies:

node.jsのmailパッケージをインストール

$ npm install mail
npm http GET https://registry.npmjs.org/mail
npm http 200 https://registry.npmjs.org/mail
npm http GET https://registry.npmjs.org/mail/-/mail-0.2.3.tgz
npm http 200 https://registry.npmjs.org/mail/-/mail-0.2.3.tgz
npm http GET https://registry.npmjs.org/reparse
npm http 200 https://registry.npmjs.org/reparse
npm http GET https://registry.npmjs.org/reparse/-/reparse-0.1.2.tgz
npm http 200 https://registry.npmjs.org/reparse/-/reparse-0.1.2.tgz
mail@0.2.3 ./node_modules/mail
mqq reparse@0.1.2

インストールできたのでapp.jsを編集する

app.js

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
var express = require('express')
  , routes = require('./routes');
 
var mail = require('mail').Mail({
  host: 'example.com',
  username: 'info@example.com',
  password: '**pass**'
});
 
mail.message({
  from: 'sender@example.net',
  to: ['info@example.com'],
  subject: 'Hello from Node.JS'
})
.body('Node speaks SMTP!')
.send(function(err) {
  if (err) throw err;
  console.log('Sent!');
});
 
var app = module.exports = express.createServer();
 
// Configuration
 
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({ secret: 'your secret here' }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});
 
app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
 
app.configure('production', function(){
  app.use(express.errorHandler());
});
 
// Routes
 
app.get('/', routes.index);
 
app.listen(3001);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

実行してみる

$ node app.js
 
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
ReferenceError: self is not defined
    at Client.smtpAUTH (/home/f1gp/models/node/mail_test/node_modules/mail/lib/smtp.js:252:5)
    at Array.extend (/home/f1gp/models/node/mail_test/node_modules/mail/lib/smtp.js:195:21)
    at Array.each [as 0] (/home/f1gp/models/node/mail_test/node_modules/mail/lib/util.js:158:10)
    at EventEmitter._tickCallback (node.js:192:40)

エラー:ReferenceError: self is not defined

lib/smtp.js:252行目の5文字目を見ると、selfをthisに変更したら動きそうだった。

lib/smtp.js

245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
Client.prototype.smtpAUTH = function(next, mechanisms) {
  var names = mechanisms.toUpperCase().split(/\s+/),
      method;
 
  if (!this.username)
    next();
  else if (!this.secure && !this.options.insecureAuth)
    // self → thisに勝手に修正してみる
    // self.emit('error', new Error('AUTH: stream is not secure (use `insecureAuth: true` to override).'));
    this.emit('error', new Error('AUTH: stream is not secure (use `insecureAuth: true` to override).'));
  else
    for (var i = 0, l = names.length; i < l; i++) {
      method = this['auth' + names[i]];
      if (method) {
        method.call(this, this.username, this.password, next);
        break;
      }
    }
};

もっかい実行する

$ node app.js
 
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: AUTH: stream is not secure (use `insecureAuth: true` to override).
    at Client.smtpAUTH (/home/f1gp/models/node/mail_test/node_modules/mail/lib/smtp.js:252:24)
    at Array.extend (/home/f1gp/models/node/mail_test/node_modules/mail/lib/smtp.js:195:21)
    at Array.each [as 0] (/home/f1gp/models/node/mail_test/node_modules/mail/lib/util.js:158:10)
    at EventEmitter._tickCallback (node.js:192:40)

エラー:Error: AUTH: stream is not secure (use `insecureAuth: true` to override)

use `insecureAuth: true` to overrideってことで`insecureAuth: true`を追加してみる。

app.js

4
5
6
7
8
9
var mail = require('mail').Mail({
  host: 'example.com',
  username: 'info@example.com',
  password: '**pass**',
  insecureAuth: true //←追加した
});

もっかい実行する

$ node app.js
Express server listening on port 3001 in development mode
Sent!

送信できた!!

参考

weaver / node-mail

node.js覚書

node.jsのsocketのデバッグメッセージを表示しないオプション

サーバー側
var express = require('express');
var app = module.exports = express.createServer();
app.listen(3000);
var socketIO = require('socket.io');
var io = socketIO.listen(app);
 
// デフォルトがtrueなのでfalseにする
io.settings.log = false;

jQuery Mobile でajaxを無効にする

スマホサイト作ってますか!?

最近jQuery Mobile を使ってみたりしています。
jQuery Mobile って長いですね。略して「JQM」でいいんじゃないかと思います。

JQMは読込むだけで、自動的にそれなりのスマホサイトになってすごい!
静的なHTMLだけのサイトならすぐできそうですね。

PHPなど使った動的なサイトならどうなんでしょう。
勝手にajaxされるのがちょっと煩わしい・・・。
ということでajaxを無効にする方法を探してみました。

phpjsのjavascriptのエラー”16 進数を指定して下さい。”

先日のエントリー(ずいぶん前…)でphpjsのphp.full.min.jsを使ったjavascriptを書いてましたが、
IE6以下で使用するとjavascriptのエラーがでてたようでした。

Line: 1678
Char: 127
Error: 16 進数を指定して下さい。
Code: 0

解決方法は簡単!
phpjsを新しいバージョンにするだけ!

現在のバージョンは3.16です。
php.full.min.jsの3.16

IE6のユーザーもまだいるようですし、JSの配列の要素の最後に”,”はNGですね。

でも最近ではIE6以下を完全に無視する開発者もいるので、
無視するのも一つの手です。

うらやましい。

jQueryとphpjsでフォームの入力チェック

最近jQueryとphpjsを使ってます。
「phpjs・・・?」
http://phpjs.org/

jQueryのようにphpjsのフルパッケージを読み込むだけでPHPライクなJavascriptが書けるようになります。
PHP書く人なら直観的に使えて便利かもです。

これでフォームの文字が全部整数かどうかチェックしてみます。

フォームの整数入力のチェック

文字を入力!
 


コード