GMailで受信したメールを翻訳して転送

GMail
05 /09 2015
Google Apps Scriptというものを使えば、GMailをいろいろ操作できることが最近分かった。
詳しくは「初心者のためのGoogle Apps Scriptプログラミング入門」などを参照。

さて、最近RWatchというApple WatchのAndroid版かつ劣化版を買ったのだが、さすが安物、中国製なのに漢字が表示できない。
いろいろ試してみたが、どうやらRWatch自体が、(ごく一部の記号を除いて)マルチバイト文字を持っていないようだ。
「カタカナは表示できる」とか「漢字の一部が文字化けするがそこそこ表示できる」という情報もあったが、私のRWatchは運悪く、ほとんどの全角文字が表示できない。
これだと、せっかくRWatchがメール着信をお知らせしてくれても、送り主も件名も全く読めない。
そこで、RWatchで日本語を表示するのは諦め、メールを日英翻訳して、RWatchに英語メールをお知らせしてもらうようにすればいいと考えた。

流れとしては以下の通り。
1. GMailがメールを受信する。
2. あらかじめGMail側でフィルタを作っておき、特定の発信者からのメール(または特定のキーワードを含むメール)には、ラベル「R」が付くようにしておく。
3. スクリプトが作動し、ラベル「R」が着いているメールに対して、以下の処理を行う。
(1) 件名と本文を日英翻訳。
(2) 翻訳結果を別のメールアドレスに転送。
(3) ラベル「R」を剥がす。(無限ループ回避のため)
4. スマホ上のメール受信アプリ(GMailではないもの。私はK-9Mailというアプリを使用した)にて、別アドレスのメールを受信する。
5. スマホ上のRWatch用アプリにて、予め「Notification app」の設定をしておく。
これはつまり、スマホのステータスバーに表示されるメッセージの内、どれをRWatchに転送するかを選択するもの。
「GMail」の転送をOFFにして、その代わりに「K-9Mail」の転送をONにしておく。
これによって、K-9Mailで受信したメールが、スマホのステータスバーに表示されると同時に、RWatchにも表示される。

ということで、Google Apps Scriptで、3.の機能を実装できればOKという事になる。
以下がそのスクリプト。


function Gmail_translate(){
// 転送先アドレス
var fw_addr = 'hoge@hoge.jp';
// ラベル"R"
var labelR = GmailApp.getUserLabelByName("R");
// ラベル"R"が付いたメールスレッド
var threads = labelR.getThreads();
//Logger.log("threads.length = " + threads.length);
for (var i in threads) {
// スレッド表示がONになっているかもしれないので、スレッド毎に各メールを取得する
var messages = threads[i].getMessages();
for (var j in messages) {
var message = messages[j];
// 既読メッセージに対しては何もしない
if (!message.isUnread())
continue;
// 発信者, 件名, 本文, 送信日時を得る
var from = message.getFrom();
var subject = message.getSubject();
var body = message.getPlainBody().replace(/\r/g, "").replace(/\n\n/g, "\n").replace(/\n\n/g, "\n");

// 日英変換
var from_en = LanguageApp.translate(from, 'ja', 'en');
var subject_en = LanguageApp.translate(subject, 'ja', 'en');
var body_en = LanguageApp.translate(body, 'ja', 'en');
// bodyを加工
// ">"で始まる行はカット
//#body_en = body_en.replace(/^>.*$/mg, ""); //←これだと空行が残る
body_en = body_en.replace(/>[^\n]+\n/g, "");
// From:を偽装することはできないので、本文の1行目にFromを入れる
// ついでに件名を2行目に入れる
var body_en = "From:" + from_en + "\n" + "Subj:" + subject_en + "\n\n" + body_en;

// メール送信
GmailApp.sendEmail(fw_addr, subject_en, body_en);
}
// スレッドの全メールからラベル"R"を剥がす
threads[i].removeLabel(labelR);
}
}


セットアップの手順:
1. `PCで、GMailにログインした状態で、Googleドライブを開く。
2. 左メニューから [新規]-[その他]-[Google Apps Script]を選ぶ。
[Google Apps Script]が選べないときは、[新規]-[その他]-[+ アプリを追加]を選び、検索窓に"Google Apps Script"を入力して検索し、インストールする。
3. 「空のプロジェクト」を選ぶ。
→「無題のプロジェクト」が開き、コード.js というファイルの画面になる。
4. function myFunction() を function Gmail_translate() に書き換えて、 関数の中身を上述のソースの通りにして、保存する。
→ファイル名を聞かれるので、"Gmail_translate.js"にする。
5. [リソース]-[現在のプロジェクトのトリガー]。
→ダイアログが開くので、以下のように設定する。
Gmail_translate_trigger.gif

これで分かるように、スクリプトが作動するトリガーは「メールを受信したとき」ではなく、「1分ごと」である。
したがって、GMailにメールが届いてからスクリプトが作動するまで、最大1分待つことになる。
「1分ごと」でなく「5分ごと」の方が、GMail的には負荷が減って良いと思うが、デバッグ段階では1分の方が良い。




GMailを等幅で(Firefox)

GMail
06 /22 2012
GMailは賢くてそこそこ使いやすいが、フォントがプロポーショナルになってしまうのが玉に瑕。
改良するには、GreaseMonkeyを使ったりする方法もあるようだが、今回はCSSを書き換える方法で対応した。

\Document and Settings\ユーザ名\Application Data\Mozilla\Firefox\Profiles\ごにょごにょ.設定名\chrome\ に userContent.css を作る。
予め userConten-example.css があるはずなので、これをコピーすればよい。
(といっても内容はコメントしかないが)
このファイルに以下を記述する。



いくつかのサイトを参考にし、自分なりの好みで色とフォントサイズを調整した。

GMailが仕様変更したら、div.nH や textarea.Ak の部分を書き換える必要がある。
Firebugがあれば新しいクラス名を比較的容易に見つけられる。

GMail経由でSPAMカット

GMail
03 /16 2009

普段はBecky!を使ってメールを読んでいる。
仕事用・プライベートともに複数のメールアドレスを所持しているので、Becky!の巡回機能は重宝している。

最近はSPAMメールが増え、困っていた。
1日100通を越えている。
サーバ側にspamassassinを導入したり、Becky!側でBkASPilプラグインを導入したりしていたが、それでも多くのメールが、SPAM判定をすり抜けてしまう。
たちが悪いことに最近のSPAMは、受信者自身のアドレスを発信者として送ってくる。そのため発信者を使ったフィルタを適用させようとすると、自分自身がフィルタの対象になってしまう。
特定のパターン(中国サイトのURLなど)があればspamassassinやBkASPilに覚えさせることができるが、それも毎回一致するわけではないし、SPAMに共通するパターンを見つけることは難しい。
第一、SPAMが来る→対策を立てる という作業は後手に回るため、1度~数度はSPAMを受信せざるを得ない。

そんな状況だったが、良い解決策を見つけた。
Google Mail(以下GMail)を利用する方法だ。
言うまでもなくGMailはフリーのWebメールで、世界中に多くの愛用者が居る。
それだけにSPAM判定も優れている。
またGMailのサイトでは、自前のアカウント(*@gmail.com)だけでなく、他のアカウント(プロバイダが提供しているアカウントなど)を読み込む事もできる。これによりGMailサイトで全てのメールアドレスを一元管理できる。

  • 1つのGMailアドレスに対して、外部アカウントを最大5つまで設定できる。
  • 6つ以上設定したいときは、2つ目のGMailアドレスを作る。

さらにGMailを一般のメールソフト(Outlook ExpressやBecky!など)で読むこともできる。
これを併用し、次のようにする。

  • 外部メールアカウントを、GMailで読み込むように設定する。
    1つのGMailアカウントに対して、複数の外部アカウントが設定できる。
  • Becky!で、上で設定したメールアカウントの読み込みを、GMailに切り替える。

例:

  1. abc@example.com , def@hoge.jp というアカウントを既に持っていたとする。
  2. GMailで、xyz@gmail.com というアカウントを取得する。(既にGMailを使っているならそのアカウントを利用しても良い)
  3. GMailの[設定]-[アカウント]-[別のアカウントからメールを受信:]-[自分のメールアドレスを追加]
  4. ユーザー名・パスワード・POPサーバーなどを入力する。
    • ユーザー名:abc@example.com
    • パスワード:abcabc
    • POPサーバー:mail.example.com (サーバにより異なる)
  5. def@hoge.jp に関しても、上と同様に[自分のメールアドレスを追加]を行う。
  6. メールソフトで、受信に関する設定を変更する。
    以下はBecky!の例。
    • ユーザーID:abc@example.com → xyz@gmail.com
    • パスワード:abcabc → xyzxyz(GMail用パスワードに変更する、の意味)
    • POP3サーバー:mail.example.com → pop.gmail.com
    • POP3S にチェックを付ける
      →ダイアログが開くので[はい]
      →ポートが自動的に995に変わる
  7. メールソフトにある def@hoge.jp の受信設定は、不要になったので削除する。
    設定した1つのGMailアカウントで、両方の外部アカウントを巡回してくれるため。

こうしておけば、自分でspamassassinなどを保守しなくても、優秀なGMailのSPAM処理が適切な判定をしてくれる。
GMailの読み込みはSSLを使用するため、通常のPOPに比べて若干接続が遅いが、気になる程の差ではない。複数のアカウントを巡回する手間が省けるので、トータルではむしろ速いかもしれない。

なおGMailをメールソフトで読み出した場合、SPAMメールは読み込まずにGMailサーバに残る。
そのため、Becky!上でSPAMを削除する手間が発生しない。これが最大のメリットである。
SPAMはGMailの「迷惑メール」に区分されて30日保持された後で自動的に削除されるので、大事なメールがGMailによって誤ってSPAM判定されていないかどうか、数日に1度程度確認すると良い。
誤ってSPAM判定された場合、GMail側で「これはSPAMではない」と教えておけば、次からは誤判定しなくなる。この手軽さと賢さも特長の1つ。

Paq

忘れっぽい中年プログラマが、日々の開発作業の中で、忘れると困ることを書き留めています。