プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

mailfilter を使ってサーバー側でのメール振り分け処理

こちらで書いた記事の続編です。

前回の作業から時間がたってしまいましたが、今回は、.mailfilter を書いて、サーバー側でのメールの振り分けを行おうと思います。 主にやりたいことは、条件に一致したら、特定のフォルダに移動させるというものになります。

From による振り分け

振り分けたいフォルダ名の 修正UTF-7 表記さえわかれば、Fromによる振り分けはさほど難しくありません。

if (/^From:(\s.*\r\n)*\s.*.+[@.]mori-soft\.com.*/:h)
{
  to "maildir/.&Yy8wilIGMFEwxjC5MMg-.company1/" # 振り分けテスト/company1
}

行の途中に # が出てくるとそれ以降はコメントになります。

この振り分けルールは、

xxx@mori-soft.com から来たメールを『振り分けテスト/company1』というフォルダに振り分ける

となります。

なお、メール振り分け時の正規表現(改行の扱い)は、下記サイトを参考にしました。

さくらインターネットで受信したメールをサーバサイドで.mailfilterを使ってフォルダへの仕分けに挑戦してみた - WebStudio

設置

これを ~/MailBox/メールアカウント名/.mailfilter の名前で保存し、パーミッションを 600 にしておきます。 設置が終わったら、テストします。

[user@wwwxxxx ~/MailBox/メールアカウント]$ maildrop -V 9 < /dev/null
maildrop: Changing to user's home
Message envelope sender=MAILER-DAEMON
Tokenized string: "SENDMAIL"
Tokenized =
Tokenized string: "/usr/local/libexec/sendmail-wrapper"
Tokenized ;
Tokenized eof
/etc/maildroprc(1): SENDMAIL="/usr/local/libexec/sendmail-wrapper"
maildrop: Attempting .mailfilter
[user@wwwxxxx ~/MailBox/メールアカウント]$ 

syntax error などと表示されなければOKです。

Subjectによる振り分け

日本語メールの Subject って確かいろいろと面倒なんだよな、ぐらいにしか知識がなかったので、せっかくなので、日本語メールについて改めて調べてみました。下記サイトなどがわかりやすかったです。

sendgrid.kke.co.jp

で、参考サイトに全部書いてありますが、せっかくなのでその結果わかったことも交えて書いていきます。

Subject に日本語が含まれている場合は、MIMEでエンコードされています。 なので、Subject で振り分けるには、一旦、デコードしてあげる必要があります。

Subject のMIMEエンコード方法は、

  • Base64
  • Quated-Printable

の2方式があります。

これを実際にデコードするには、 nkf を使うのが一番簡単なようです。

例えば、『日本語』というSubjectのメールがある場合、それぞれ Subject は

エンコード方式 UTF-8 ISO-2022-JP
B (Base64) =?UTF-8?B?5pel5pys6Kqe?= =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=
Q (quoted-printable =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E?= =?ISO-2022-JP?q?=1B=24BF=7CK=5C8l=1B=28B?=

となります。

これをデコードするためには、

nkf -m -w

(出力は UTF-8 を想定) をかけてあげればOKです。

まずはコンソールでテストします。

[user@wwwxxxx ~]$ echo =?UTF-8?B?5pel5pys6Kqe?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?ISO-2022-JP?q?=1B=24BF=7CK=5C8l=1B=28B?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ 

とどれも正しくデコードされているのがわかりますね。

(参考) * 時代工房の部活動 - さくらインターネットなどで .mailfilter(maildrop) をいじれるときのスパム受信を減らす設定 * https://hogem.hatenablog.com/entry/20100122/1264169093 * http://www.kipwmi.com/fm/tips/base64.htm

改行への対応

もう一つ確かめておきます。 Fromの際に参考にしたサイトにもありましたが、メールのヘッダは78文字で改行されるそうです。

tmtms.hatenablog.com

幸いSubjectをデコードする場合は、文字区切りまで意識しないでいいのですが、Subjectが複数行になった場合でもデコードできるか確認しておきます。

適当な長いSubjectのメールを実際に出してみて、エンコードされた結果をテキストファイルに貼り付けます。例えば、こんな感じですね。

非常に長いメールのサブジェクトをテストしてみるためのメールを一生懸命書いているけど、これって本当に意味あるだろうか?って思いながらもやっぱりテストは大事なので、頑張って長文を書いていますけど、さて何文字になったでしょうかね?

エンコード結果(メールの送受信は Becky! 2.74.01 でやりました)

[user@wwwxxxx ~]$ cat mail_long_subject 
Subject: =?ISO-2022-JP?B?GyRCSHM+byRLRDkkJCVhITwlayROJTUlVhsoQg==?=
 =?ISO-2022-JP?B?GyRCJTglJyUvJUgkciVGJTklSCQ3JEYkXxsoQg==?=
 =?ISO-2022-JP?B?GyRCJGskPyRhJE4lYSE8JWskcjBsQDg3fBsoQg==?=
 =?ISO-2022-JP?B?GyRCTD89cSQkJEYkJCRrJDEkSSEiJDMkbBsoQg==?=
 =?ISO-2022-JP?B?GyRCJEMkRktcRXYkSzBVTCMkIiRrJEAkbRsoQg==?=
 =?ISO-2022-JP?B?GyRCJCYkKyEpJEMkRjtXJCQkSiQsJGkkYhsoQg==?=
 =?ISO-2022-JP?B?GyRCJGQkQyRRJGolRiU5JUgkT0JnO3YkShsoQg==?=
 =?ISO-2022-JP?B?GyRCJE4kRyEiNGhEJSRDJEZEOUo4JHI9cRsoQg==?=
 =?ISO-2022-JP?B?GyRCJCQkRiQkJF4kOSQxJEkhIiQ1JEYyPxsoQg==?=
 =?ISO-2022-JP?B?GyRCSjg7eiRLJEokQyQ/JEckNyRnJCYkKxsoQg==?=
 =?ISO-2022-JP?B?GyRCJE0hKRsoQg==?=
[user@wwwxxxx ~]$ 

これをさきほどと同様にデコードしてみると

[user@wwwxxxx ~]$ nkf -m -w mail_long_subject 
Subject: 非常に長いメールのサブジェクトをテストしてみるためのメールを一生懸命書いているけど、これって本当に意味あるだろうか?って思いながらもやっぱりテストは大事なので、頑張って長文を書いていますけど、さて何文字になったでしょうかね?
[user@wwwxxxx ~]$ 

途中で改行が混ざることもなく、スペースが入ることもなく、問題なく元に戻っています。 これで、Subject のデコードも大丈夫そうですね。

振り分け

上記で調べたことを元に、振り分け処理を書いてみます。

[user@wwwxxxx ~]$ cat mailfilter.subject.sample 
SUBJECT=`cat | nkf -m -w | grep Subject`
if ( $SUBJECT =~ /.*振り分けテスト.*/ )
{
  to "maildir/.&Yy8wilIGMFEwxjC5MMg-.&Txp5Pv8S-/" # 振り分けテスト/会社2
}

[user@wwwxxxx ~]$ 

このルールの場合、

Subject に 『振り分けテスト』があれば、『振り分けテスト/会社2』のフォルダに移動する

となります。

これを .mailfilter として配置して、テストしてみます。
サンプルのメールを送ると正しく振り分けができていました。

f:id:junichim:20191004151734p:plain

参考

.mailfilter の資料

.mailfilter 自体の振り分けではもっといろいろなことができますので、下記の参考サイトなどを 参考に必要に応じて調べてみてください。

8bit MIME

メールの日本語対応の話を調べていたら、 Content-Transfer-Encoding に 8bit という指定があることがわかりました(8bit MIME)。 でも、メールは7bit とよくいうのに、なんでそんな規格で通せるのか?というのが下記のサイトで説明してありました。

しらないことだらけですね。

vim でのエンコードの指定方法

さくらインターネットはデフォルトの文字コードが ECU です。 でも、 vim を使えば、UTF-8のファイルも編集できます。その際の、vim でのエンコードの指定方法です。

LINE Developer アカウントと LINE 公式アカウントの関係

LINE ボットのテスト時にちょっとはまったので、メモ

問題に遭遇するまで

こちらの記事で書いたようにテスト用のLINE アカウントを使って、LINE Developer アカウントを設定しました。

次に、チュートリアルに従って、作成した LINE Developer アカウントで、プロバイダおよびチャンネルを作成します。 チャンネルの Webhook URL (API Gateway + Lambda で構成しました)を設定して、テストしてみると、ちゃんと動作しています。このあたりのことはたくさん例があるので、省略します。
にしても、いい感じですね。

さて、仕事用のテストのため、作成したチャンネルを別途用意した LINE 公式アカウント(ビジネスアカウントで管理)と連携させてみようと思います。 LINE Official Account Manager にログインして、公式アカウントの『設定』(歯車アイコン)をクリックして、『Messaging API』を選択します。

f:id:junichim:20191003112731p:plain

上記のような画面が出てくるので、『Messaging API を利用する』ボタンを押すと、

f:id:junichim:20191003113110p:plain

と、アカウントと連携するように求められます。 『アカウントと連携』ボタンを押すと、

f:id:junichim:20191003113219p:plain

と連携画面が出てくるので、『LINEアカウントと連携』をクリックします。

f:id:junichim:20191003113325p:plain

のようなログイン画面が出てくるので、LINE Developer のアカウントのメールアドレスとパスワードを入れて、連携します。
すると、

f:id:junichim:20191003113455p:plain

のように『すでに登録されているLINEアカウントです』と表示されて、連携できません。

どういうこと?
これを解決しようと思っていろいろと調べました。

原因

結論からすると、下記が原因でした。

  • LINE Developer アカウント上でチャンネルを作った際に、公式アカウント(および LINE Business ID)が自動的に作成される
  • LINE アカウントは1つの LINE Business ID としか連携できない

つまり、LINE Developer アカウント上でチャンネルを作ると、そのDeveloper アカウント(LINE アカウントですね)に紐づく LINE Business ID および公式アカウントが自動的に作成されて、そのうえ、チャンネル(Developer アカウント)と連携しているので、別の LINE Business ID とは連携できないよ、ということでした。

なんじゃそりゃ??という感じです。

前者については、よくよくチュートリアルを見ると、チャンネルを作成した際に公式アカウントが存在しているよ、と触れているところがありますね(こちらのページの『5.確認する』の最後当たりにあります)。
とはいえ、公式アカウントが作成されるときに一緒に LINE Business ID も作成されるというのは意外でした。

あと、LINE Developer 上で公式アカウントや LINE Business ID が作成されるのはいいとして、LINE アカウントと公式アカウントを管理する LINE Business ID が1対1でしか紐づけられないということが、ドキュメントからわからないのが気になるところです(LINE のサポートさんに問い合わせた際に教えていただきました) 。

これって、LINE の世界では当たり前なんでしょうかね?
だとすると、初心者にもこの辺の事情がもうちょっとわかるようにドキュメントを整備してもらえるとありがたいです。

対応策

まあ、今回はテストなので気にしなくてもいいっちゃいいんですが、例えば、会社さんがすでに公式アカウントを運用しており、その LINE Business ID に対して、ボット用の公式アカウントを追加しようとするとこのままじゃ追加できません。

なので、この状態を解消する方法を探ってみました。

手順1:アカウントの削除

上記を踏まえると、 LINE Developer 上でチャンネルを作成した際に、自動的に作られた LINE Business ID を削除すればいいのではないかと考えました。

早速やってみます。 最初に LINE Developer アカウントで作成済みのチャンネルをすべて消します。チャンネルの削除の際には、 LINE Official Account Manager で作業をするので、既にログインした状態になっていると思います。もし、未ログインなら、 LINE Developer アカウントのメールアドレスとパスワードでログインします。
そのうえで、『ユーザープロフィール』を表示させます。

f:id:junichim:20191003133647p:plain

ここで『アカウントの削除』を選択します。 無事に削除されたようなので、再度 LINE Official Account Manager に LINE Developer のメールアドレスとパスワードでログインしてログインできないことを確認してみます。

あれ?ログインできてしまいます。

実はここが盛大にはまったところなんです。
LINE アカウントで LINE Official Account Manager にログインすると、その時点で再度 LINE Business ID が作成されるそうです。

最初は『アカウントの削除』が機能していないのか?と疑ったんですが、そうではなくて、いったんアカウントは削除されているんだけど、ログインしたのでその時点で LINE Business ID が再作成される、という状態だったそうです(これもサポートさんに教えていただきました)。

自動で LINE Business ID が作成されるのって、ちょっとわかりにくいなー。

手順2:連携

まあ、ちょっと気持ち悪いですが、上記で『アカウントの削除』を行ったら、 LINE Developer アカウントに対応した LINE Business ID は消えていると信じて、別の LINE Business ID 上の公式アカウントから Messaging API の設定を行います。

最初に書いた手順で進めると、順調に LINE アカウントの連携を求められました。

ここで、LINE Developer のアカウント情報を入力します。

今度は怒られることなく、プロバイダを選択するか新規に作成するか求められました(さきほどチャンネルは削除したけど、プロバイダは残していたため)。

f:id:junichim:20191003134356p:plain

新規にプロバイダと作成するのを選んで進んでいくと

f:id:junichim:20191003134539p:plain

と確認が求められるので、OKとします。すると、問題なく連携できました!

f:id:junichim:20191003134826p:plain

LINE Developer のほうを確認すると、チャンネルの名前は、公式アカウントと同じ名前として作成されていることが確認できました。

f:id:junichim:20191003134956p:plain

いやー、難解ですね。

まとめると

上記の経緯からすると、既存の LINE 公式アカウントに対してボットを登録するには、下記の手順で進める必要があるようです。

  1. LINE アカウントを使って、LINE Developer アカウントを設定(試しにチャンネルを作らないように)
  2. ボットを設定したい公式アカウントを持つ LINE Business ID で LINE Official Account Manager にログイン
  3. Messaging API を開く
  4. LINE アカウントの連携を求められたら、最初に登録した LINE Developer アカウントを指定
  5. プロバイダが作成される
  6. 無事、設定される

LINE でボットやってる人には当たり前なんだろうか?

ちなみに、公式の手順などもありましたが、ちょっと簡略化されてる気がします。

www.linebiz.com

素朴な疑問

ここまでいろいろとやって、ふと

LINE Developer アカウントと LINE Business ID は1対1の連携なので、プロバイダを複数持てるけど、何かうれしいことあるのか?

というのが気になります。
もうちょっと具体的に開発者の立場からすると、LINEで仕事をする際には、

1つの LINE developer アカウントには1つの LINE Business ID しか連携できません。そうなると、複数の会社さんにボットを提供するような仕事をしていこうとすると、会社分だけ LINE Developer アカウントが必要になります。

ということになります。

もし、この Developer アカウントを開発側で持とうとすると、複数の電話番号が必要になるので、ちょっと面倒そうです(Twilio のようなIP電話の電話番号では LINE アカウントはとれないですしね)。
現実的には、LINE Developer アカウント(LINE アカウント)は会社さんから提供していただいて、開発に必要な権限を設定してもらう形にするのがいいのかもしれません。

個人的には、せっかくプロバイダとかあるんで、プロバイダ単位で、LINE Business ID と連携できるようになるといいなと思います。
どうですかね? > LINE さん

参考

LINE Developer のQ&Aでも関連しそうな質問がいくつかありました。ずばりのものはなかったのですが、一応参考までに載せておきます。

www.line-community.me

www.line-community.me

LINE Business ID について

上記で少し触れてますが、 LINE Business ID というのがあって、それを利用するためには、

  • LINE アカウントでログオン
  • LINE ビジネスアカウント(メールアドレスで登録)でログオン

という2種類があるようです。

help2.line.me

LINE ビジネスアカウントでの LINE Developer へのログイン

下記の質問にあるように、できないようです。

www.line-community.me

LINE ボット開発のための開発者アカウントの取得について

仕事の関係で LINE のボット開発をやることになりそうです。

で、調査がてら LINE の開発者登録をしようとしたら、少し戸惑ったので、気になったところをいろいろとメモっておきます。 なお、この内容は記事を書いた時点(2019/9/11)の情報なので、先々変わることがあると思いますがご了承ください。

開発者登録に必要なアカウント

下記の記事などや、

LINE の Messaging API の説明を見ると、書いてありますが、LINEの開発には、

  • LINE アカウント(開発者アカウントとして登録する)
  • LINE 公式アカウント(以前の LINE@アカウント)

の2つが必要になります。

さて、ここで、個人でボットを開発するのではなく、仕事としてボットを開発する場合を考えると、 開発者アカウントは LINE アカウントに紐づいているので、私の個人の LINE アカウントは使いたくありません (会社とかの組織の場合はどうしてるんですかね?)。

ボットで使う予定の機能は Messaging API なので、そのページを見ても、

f:id:junichim:20190911114618p:plain

とあり、LINEアカウントがなければ取得してくださいとあります。

PC版LINEアカウント

で、上記のリンクをたどり ダウンロードページ を見ると、PC版のLINEアプリがあります。 調べてみると、PC版のLINEアプリは、電話番号があれば、アカウントを登録できるようです。

ヘルプセンター | LINE (『PCで新規登録するには?』で検索)

昔からPC版のLINEアカウントってありましたっけ?てっきり、スマホがないとLINEアカウントって作れないと思い込んでいました。

ということで、個人の LINE アカウント(こっちはスマホとその電話番号に紐づいてる)とは別に、仕事用の電話番号を使ってLINEアカウントを作成し、 このLINEアカウントを開発者アカウントとして登録すれば、問題なさそうです。

やってみます。

PC版LINEのインストール

まず、ダウンロードページからPC版LINEのソフトをインストールします(Windows10 Pro, 1903 で作業してます)。 インストール後、起動すると画面下部に、『新規登録』のボタンがあるので、

f:id:junichim:20190911115627p:plain

ここをクリックします。次に、電話番号の入力を求める画面が表示されます。

f:id:junichim:20190911115721p:plain

前述したように、仕事用の電話番号を入力します。

電話番号を入力して、次に進むと、SMSで認証番号を送ったので、その番号を入力するように求められます。
今回は試していませんが、SMSが使えない場合は通話による認証もできるようです。

認証が問題なくできれば、いくつかの設定項目(友達への追加を許可するか否か、メールアドレスの登録をするか否か)を入力すると、アカウントが作成されます。

アカウント作成時にメールアドレスを登録していなければ、LINE の開発者アカウントとして登録する際に、メールアドレスによるログインが必要になるので、このPC版LINEアカウントにメールアドレスを登録しておきます。

PC版LINEを起動して、電話番号でログインして、設定画面を開きます。

f:id:junichim:20190911122016p:plain

メールのところをクリックして追加します(上記画面は追加後なのでリンクは表示されていません)。 入力したメールアドレスに対して、認証情報を含むメールが届くので、メール記載の認証情報を入力すれば、登録完了です。

開発者アカウントの登録

ここまでくれば開発者アカウントの登録はあと少しです。

LINE Developer のログインページを開いて、『LINEアカウントでログイン』を選択します。

f:id:junichim:20190911122932p:plain

メールアドレスとパスワードが求められるので、先ほど作成したPC版LINEアカウントのメールアドレスとパスワード(最初に電話番号でアカウントを作成したときのパスワードと同じです)を入力します。

問題がなければ、

f:id:junichim:20190911123151p:plain

こんな感じの開発者情報の入力画面が表示されます。なお、画面中央の『森ソフト』という名前は、PC版LINEアカウントの名前です。 開発者名とメールアドレスを入力すれば完了です。

これで、晴れてLINEの開発者アカウントとして登録することができました。 あとは、いろいろと試していきたいと思います。

(参考)PC版LINEの制限

PC版LINEはいろいろと制限があるようです。気づいた点だけでも書いておきます。詳しくは下記のヘルプページを参照してください。

ヘルプセンター | LINE

  • 『電話番号による友達への追加を許可する設定』これは新規登録時のみ設定可能で後から変更はできない
    (『友だち追加を拒否するには?』で検索)
  • メールアドレスの変更はできない
    (『登録メールアドレスをPC(パソコン)版で変更できますか?』で検索)