Node-red でメールアドレスのクレンジングサービスを作ってみた

#メールアドレスをクレンジング

メーリングリストの管理をしていたり、名簿の整理をしていると、メールアドレスを管理したくなることありますよね。

で、これまでは、毎回シェルスクリプトで uniq, sort とかしてたのですが、前後のカッコを省いたり、コンマや改行を変えたりと、イヤーな感じでした。特にアドレスが重複してたりすると面倒。
また、アドレスを逆順にドメイン毎に整理したい（並べたい）ことってありますよね？

で、今回Node-red の勉強がてら、メールアドレスをクレンジングする Webサービスを作ってみました。

Node-red のサイトにデプロイして　"/MailClean" をアクセスすると，以下のフォームが出ます。
このテキストエリアに、適当なメールアドレスを入れます。CC に書いてあるようなのを直接ドカーンと入れるだけで動くはずです。

![MailClean.png](https://qiita-image-store.s3.amazonaws.com/0/28113/a9ede898-32af-0ab6-80ac-ead7d63d7fd5.png)

お試しあれ。個人的にはとっても便利！
（コードは非常に情けないので読まないデー。。。）


なおコードは、以下を Node-red にインポートしてもらえればＯＫです。

```js:node
[{"id":"2216a8b6.dde958","type":"http in","name":"MailClean","url":"/MailClean","method":"get","swaggerDoc":"","x":197.51483154296875,"y":253.5407485961914,"z":"f183c3c.f0e7c4","wires":[["63ba28e2.9c45d8"]]},{"id":"ad9bb4a0.526448","type":"http response","name":"","x":587.5148315429688,"y":307.5407485961914,"z":"f183c3c.f0e7c4","wires":[]},{"id":"63ba28e2.9c45d8","type":"template","name":"Form Template","field":"payload","format":"html","template":"<HTML>\n    <head>\n        <title> Mail Address Cleaning</title>\n    </head>\n    <body>\n        \n        Mail Address Cleaning\n        <form method=\"post\">\n            \n            <textarea cols=\"80\" rows=\"50\" name=\"addresses\" >\n                please put mail addresses\n            </textarea>\n            <br>\n            <input type=\"checkbox\" name=\"comma\" />\n            コンマで分割する？\n            <br>\n            <input type=\"checkbox\" name=\"ret\" checked=\"checked\"/>\n            改行する？\n            <br>\n            <input type=\"checkbox\" name=\"rev\" />\n            反転する？\n            <br>\n            <input type=\"checkbox\" name=\"sort\" />\n            ソートする？\n            <br>\n            <input type=\"checkbox\" name=\"uniq\" />\n            uniqする?\n            <br>\n            <button> Doit! </button>\n        </form>\n        \n\n    </body>\n    \n    \n    \n</HTML>","x":397.51483154296875,"y":274.5407485961914,"z":"f183c3c.f0e7c4","wires":[["ad9bb4a0.526448"]]},{"id":"f2cd30c8.0d32d","type":"http in","name":"MailClean POST","url":"/MailClean","method":"post","swaggerDoc":"","x":188.51483154296875,"y":428.5407485961914,"z":"f183c3c.f0e7c4","wires":[["8ff2665c.700d98"]]},{"id":"8ff2665c.700d98","type":"function","name":"Check Mail","func":"var ads = msg.payload.addresses;\nvar com = msg.payload.comma;　//コンマ\nvar ret = msg.payload.ret;// 改行\nvar rev = msg.payload.rev;// 反転\n\n//\"<\" \">\" で区切る\n\nvar splitter = /[<>\\r\\n\\t ]/;\n\nvar dds = ads.split(splitter);\n\n// ここかはフィルタ\n\nvar isMail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/;\n\nvar res = [];\n\nfor (var i = 0; i < dds.length; i++){\n    var match=isMail.exec(dds[i]);\n    if(match !== null){\n        res.push(match[0]);\n    }\n}\n\nif(msg.payload.sort ==\"on\"){// sort option!\n    res.sort();\n    //function(a,b){\n    //    if(a < b ) return -1;\n    //    if(b > a ) return 1;\n    //    return 0;\n    //});\n}\n\n\nvar res2=[];\nif(msg.payload.uniq == \"on\"){ // uniq option!\n    var last = \"\";\n    for(var i = 0; i < res.length; i++){\n        if(last != res[i]){\n            res2.push(res[i]);\n        }\n        last = res[i];\n    }\n    res = res2;\n}\n\n\nvar out = \"\";\n\n\n\nfor( var i = 0; i < res.length; i++){\n    if(rev==\"on\") {\n        out = out+res[i].split(\"\").reverse().join(\"\");// 反転文字列を追加\n    }else{\n        out = out+res[i];\n    }\n    if(com==\"on\") out = out +\",\";\n    if(ret==\"on\") out = out+\"\\n\";\n    \n}\n\nmsg.payload = out;\n\nreturn msg;","outputs":1,"noerr":0,"x":322.51483154296875,"y":531.5406875610352,"z":"f183c3c.f0e7c4","wires":[["28841218.d77bee"]]},{"id":"28841218.d77bee","type":"template","name":"Result","field":"payload","format":"html","template":"<HTML>\n    <BODY>\n        <pre>\n{{payload}}\n        </pre>\n    </BODY>\n\n</HTML>","x":376.51483154296875,"y":703.5407333374023,"z":"f183c3c.f0e7c4","wires":[["a8522596.57add8"]]},{"id":"a8522596.57add8","type":"http response","name":"","x":631.5148315429688,"y":716.5406875610352,"z":"f183c3c.f0e7c4","wires":[]}]
```