gmail – bluegold https://blog.bluegold.me OpenSolaris と MacBook で自宅ネットワークを構築するメモ Mon, 23 Aug 2010 18:32:38 +0000 ja hourly 1 https://wordpress.org/?v=5.2.1 6047458 POPFileを使用してGmailのラベルを設定する https://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/ https://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/#respond Thu, 25 Dec 2008 15:20:25 +0000 http://blog.bluegold.me/?p=153 今週から会社のメールがGoogle Apps for Your Domainに移行しました。今までのメールサーバはPOP3しか使えなかったのですが、Gmailに移行したのを機にIMAP4を使ってみることにしました。
私は主にLeopardのMail.appを利用してメールを読んでいるので、Googleの公式のヘルプにある通りの手順で簡単に設定することができます。

ただ、このままだとGmailが「迷惑メール」と判断したメールがMail.appでは未読メールとして表示されたり、Mail.appでメールを削除した際にGmailのゴミ箱に移動されずに「Deleted Messages」ラベルが付けられる、などの問題が発生します。そこで、Gmail側の「迷惑メール」フォルダなどにMail.appで「メールボックスの用途」を設定しました。これでメール管理をMail.app側に統合化する事ができ、便利に使えるようになりました。

POP3でメールを読んでいた頃はPOPFileを利用して、迷惑メールのフィルタやメールの振り分けを行っていました。Gmailには迷惑メールのフィルタ機能が元から備わっていますが、メールの振り分けをPOPFileほどは柔軟に設定できません。たとえば、会社のメールアドレスには誰かが全員用のエイリアス用に購読したNikkei BPやキーマンズネットのニュースがたくさん送られてくるのですが、単純なルールでこれらをまとめて「ニュース」フォルダに振り分けるのは(ほぼ)不可能です。

そこで、POPFileをIMAP4の環境で使用する方法について調べてみました。

POPFileのIMAPモジュールはPOPモジュールと異なりプロキシではありません。そのため、POPFileを利用するのにメールクライアントの設定を変更する必要はありません。これは良いことですが欠点もあります。プロキシとして動作しない為に、サブジェクトを変更したりX-Text-Classificationヘッダを付加する事ができません。

IMAPモジュールはメールクライアントの動作とは無関係に定期的にIMAPサーバに接続し、メールの本文の内容を判断して適切なフォルダ(Gmailの場合はラベル)に振り分けます。IMAPモジュールはいったん設定を行うと後は自動的に処理を続けるロボットのようなプログラムなので、クライアントPCで動作させるよりは常時稼働しているサーバの上で動かした方が良いのかもしれません。

IMAPモジュールの使い方は公式サイトの説明にある通りですが、Leopard(Mac OS X)で使用するには注意する点がいくつかあります。(POPFile v1.1.0 を使用しています。)

imap.gmail.com

POPFile コントロールセンターの「設定」ページの「IMAPサーバー ホスト名」にGmailのIMAPサーバ名、imap.gmail.com を入力しても接続できずに、以下のエラーがログに残ります。

2008/12/25 23:48:08 10142: IMAP-Client: 136: IO::Socket::SSL error: IO::Socket::SSL: bind: Address family not supported by protocol family
2008/12/25 23:48:08 10142: imap: 1624: Could not CONNECT to server.
2008/12/25 23:48:08 10142: imap: 1493: Could not connect to server.

エラーメッセージをGoogleで検索すると、IPv6が関係しているエラーのようです。Leopard に固有の問題のようですが、「imap.google.com の AAAA レコードが見つかる為に IO::Socket::SSL がサポートしていない IPv6 で接続しようとしている」ためにエラーになっているらしい。将来のバージョンで修正されると思いますが、それまでのワークアラウンドを考えます。

要は、imap.gmail.com の AAAA レコードが見つかることが原因なので、たとえば、imap.gmail.com の(IPv4の)IPアドレスを調べて、それをIMAPサーバーのホスト名に設定したり、そのIPアドレスを逆引きして得られる実サーバのホスト名を設定すれば、とりあえず使用できるようになります。(今、私の環境から調べるとrv-in-f111.google.comです。)ただ、imap.gmail.comを構成する多数のサーバの中の1台にしか接続できなくなるため、そのうち接続出来なくなるかもしれません。

日本語のIMAPフォルダ名

IMAPモジュールではPOPFileのバケツ毎に振り分けるIMAPのフォルダを設定する必要があります。この設定はPOPFile コントロールセンターの「設定」ページから行いますが、このページは日本語の IMAPフォルダ名に対応していません。たとえば、「迷惑メール」フォルダは「&j,dg0TDhMPww6w-」と表示されます。これは modified UTF-7 というエンコーディングだそうですが、このままでは振り分けるべきフォルダがどれなのかが分かりません。

これも将来のバージョンで修正されると思いますが、当面は以下のような方法で調べるしかないようです。

$ irb -rnet/imap
irb(main):001:0> %w(迷惑メール 下書き 送信済みメール ゴミ箱).each {|key| puts "#{key} -> [Gmail]/#{Net::IMAP.encode_utf7(key)}"}
迷惑メール -> [Gmail]/&j,dg0TDhMPww6w-
下書き   -> [Gmail]/&Tgtm+DBN-
送信済みメール -> [Gmail]/&kAFP4W4IMH8w4TD8MOs-
ゴミ箱   -> [Gmail]/&MLQw33ux-

]]>
https://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/feed/ 0 153
WordPressのバックアップを Gmail に保存する その3 https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/ https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/#respond Mon, 20 Oct 2008 16:28:18 +0000 http://blog.bluegold.me/?p=45 前回、暗号化を行った事によりバックアップの保存の目的はほぼ果たしているのですが、気持ちが悪いので添付ファイルについても考えてみました。

gmail と uuencode をキーワードに Google で検索した所、mutt を使うのが一般的らしい。
↓のように ‘-a’ キーワードで添付するファイルを指定するだけで添付ファイルとして扱ってくれます。

mutt -a name.afz -a mysql_name.afz -s "name backup `date`" to_address

複数の添付ファイルにも対応しているので、この方法で問題ないかとも思ったのですが、1つだけ問題がありました。mutt では Envelope From を引数で変更することが出来ず、muttrc/.muttrc に別途設定する必要があります。

なんかめんどくさそうな感じがしたので、結局は Ruby でフィルタプログラムを書くことにしました。

以下のような物になりました。

#!/usr/bin/env ruby
#
# sendmail.rb</p>

require 'rubygems'
require 'tmail'
require 'net/smtp'
require 'nkf'
require 'etc'
require 'socket'
require 'optparse'


def usage( status, msg = nil )
  output = (status == 0 ? $stdout : $stderr)
  output.puts msg if msg
  output.print(&lt;&lt;EOS)
Usage: cat msg | #{File.basename $0} [-j|--ja] [-s <subject>] [-f <from>] <to>

  -s,--subject=sbj   subject of the message. (default=(none))
  -f,--from=from     from address.
  -a,--attachment=file attachment
  -j,--ja            handle japanese message. (default=off)

EOS
  exit status
end

def main(args)
  subject = nil
  from = guess_from_address()
  to = []
  attachments = []
  ja_locale = false

  OptionParser.new do |opt|
    opt.banner = "Usage: #{$0} [options]"

    opt.on('-s', '--subject=subj', 'subject of the message. (default=(none))') do |arg|
      subject = arg
    end
    opt.on('-f', '--from=from', 'from address.') do | arg|
      from = arg
    end
    opt.on('-j', '--ja', 'handle japanese message. (default=off)') do
      ja_locale = true
    end
    opt.on('-a', '--attachment=file', 'attachment') do |arg|
      attachments &lt;&lt; arg
    end

    to = opt.parse!(args)
  end

  usage(1) if to.empty?

  setup_mail(from, to, subject, $stdin.read, ja_locale, attachments)
end

def setup_mail( from, to, subject, body, ja_locale, attachments )
  mail = TMail::Mail.new
  mail.date = Time.now
  mail.from = from
  mail.to = to
  mail.subject = subject if subject
  mail.mime_version = '1.0'

  # 本文の処理
  if attachments.empty?
    message = mail
  else
    message = TMail::Mail.new
    message.transfer_encoding = '7bit'
  end
  if ja_locale
    message.body = <span class="caps">NKF.</span>nkf('-j', body)
    message.set_content_type 'text', 'plain', 'charset' =&gt; 'iso-2022-jp'
  else
    message.body = body
    message.set_content_type 'text', 'plain'
  end

  # 添付ファイルの処理
  unless attachments.empty?
    mail.parts.push(message)

    attachments.each do |filepath|
      body = nil
      File.open(filepath) { |f| body = f.read } rescue nil
      next if body.nil?

      attachment = TMail::Mail.new
      filename = File.basename(filepath)

      encoded_body = [body].pack('m').chomp.gsub(/.{76}/, "\\1\n")
      attachment = TMail::Mail.new
      attachment.body = encoded_body
      attachment.transfer_encoding = 'base64'
      attachment.set_content_type('application', 'octet-stream', 'name' =&gt; filename)
      attachment.set_content_disposition('attachment', 
                 'filename' =&gt; filename)

      mail.parts.push(attachment)
    end

    mail.write_back
  end

  puts mail.encoded

  mail
end

def guess_from_address
  user = getlogin()
  unless user
    $stderr.puts 'cannot get user account; abort.'
    exit 1
  end
  if domain = (Socket.gethostname || <span class="caps">ENV</span>['HOSTNAME'] || <span class="caps">ENV</span>['HOST'])
    user + '@' + domain
  else
    user
  end
end

def getlogint
  begin
    require 'etc'
    Etc.getlogin
  rescue LoadError
    <span class="caps">ENV</span>['LOGNAME'] || <span class="caps">ENV</span>['USER']
  end
end

main(ARGV)

TMail のサンプルの sendmail.rb をほぼそのまま使っています。
引数 ’-a’ で添付ファイルを指定出来るように変更しました。(getopts が deprecated になっていたので optparse で書き直しています。)

]]>
https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/feed/ 0 45
WordPressのバックアップを Gmail に保存する その2 https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/ https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/#respond Sun, 19 Oct 2008 16:21:39 +0000 http://blog.bluegold.me/?p=40 バックアップファイルを 256bit AES で暗号化する方法について考えます。

バックアップの作成に使用した afio には、バックアップ対象のファイルを個別に圧縮する機能があります。圧縮に使用する外部プログラムは引数で変更出来るので、これを利用して暗号化を行います。

まずは、下のような暗号化用のフィルタを作成します。

#!/bin/sh
# encrypt_filter.sh

opt="-pass env:FILTER_PASSWORD"

if [ -r /etc/wp_backup_password ]; then
    opt="-pass file:/etc/wp_backup_password"
fi
gzip -c | openssl enc -e -aes-256-cbc $opt

次に afio に -P オプションでフィルタプログラムを使用させます。

afio -ovz -Z -U -P encrypt_filter.sh backup.afz

これでバックアップファイルが作成される際に個別のファイル毎に暗号化されるようになります。

/etc/wp_backup_password ファイルが暗号鍵になります。このファイルはバックアップを元に戻す時に必要になるので安全な場所に保管しておかないといけません。パスワードファイルの中身はなんでも構わないので、うちのサイトでは以下のようにしてランダムに作成しています。

dd if=/dev/urandom of=/etc/wp_backup_password bs=256 count=1

このファイルはバックアップを行うアカウント以外からは読み込めないようにパーミッションを設定しておく必要があります。

]]>
https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/feed/ 0 40
WordPressのバックアップを Gmail に保存する https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/ https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/#respond Sat, 18 Oct 2008 06:34:56 +0000 http://blog.bluegold.me/?p=28 毎日のブログのバックアップの保管場所をどこにしようかと悩んでいたんですが、Gmailに送ってしまえば良い事に気がつきました。
容量的には問題はないですし、毎日のバックアップの置き場としては問題無さそうです。

暗号化とかは後で考えるとして、とりあえず下のようなスクリプトを書いてみました。

#!/bin/sh

AFIO=/usr/local/bin/afio
MYSQLHOTCOPY=/usr/bin/mysqlhotcopy
SENDMAIL=/usr/sbin/sendmail

WORKDIR=/var/tmp
WWWDIR=/var/www
LOGDIR=/var/log

if [ -f /etc/wp_backup ]; then
    . /etc/wp_backup
fi

if [ ${MYSQL_USER:-nothing} = "nothing" ]; then
    exit 1
fi
if [ ${MAIL_FROM:-nothing} = "nothing" ]; then
    exit 1
fi

function cleanup() {
    rm -rf $WORKDIR/mysql
    rm -f $WORKDIR/$name.afz
    rm -f $WORKDIR/mysql_$name.afz
}
trap "cleanup" EXIT

name=${1:-blog}

if [ ! -d $WORKDIR/mysql ]; then
    mkdir $WORKDIR/mysql
fi

(
echo "BACKUP START: `date`"

# backup mysql
$MYSQLHOTCOPY -u $MYSQL_USER -p $MYSQL_PASSWORD $name $WORKDIR/mysql

cd $WORKDIR/mysql
find $name | $AFIO -ovz -Z -U $WORKDIR/mysql_$name.afz

# backup wordpress
cd $WWWDIR
find $name | $AFIO -ovz -Z -U $WORKDIR/$name.afz

echo "BACKUP FINISHED: `date`"
) >> $LOGDIR/wp_backup.log 2>&1

# send the backup files
(
cat <<__END__
From: $MAIL_FROM
To: $MAIL_TO
Subject: $name backup `date`

blog name: $name
date: `date`

`uuencode $name.afz < $WORKDIR/$name.afz`

`uuencode mysql_$name.afz < $WORKDIR/mysql_$name.afz`

__END__
) | $SENDMAIL -f $MAIL_FROM -t $MAIL_TO

exit 0

バックアップを Gmail に送信する事はできたので問題は解決したかと思ったんですが、Gmail は uuencode の添付ファイルを認識しないんですねぇ。手元の Apple Mail でも認識していないので単に時代遅れなだけか。

もう少し考えねば

]]>
https://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/feed/ 0 28