MacにPlaggerをインストールする(実際に動かしてみる編)

ここから色々と苦戦した。
まずやりたかったことは、Mixiの日記をGmailで読めるようにすることなのだが、実はこれがまだ出来ていない。
(fetch 0 entriesと表示されてしまう)


ということで、このブログのRSSを読んで、それをGmailで送信、を行ってみる。


まずハマったのがYAMLの記述方法。
とにかくインデントに厳しい。
検索して出てきたYAMLをコピーしてきて、
plagger -c config.yaml
を実行するも、元のソースが一切インデントされておらず、


Plagger::Template [debug] Assets path: /usr/bin/assets/plugins/Publish-Gmail:/usr/bin/assets/common
Plagger::Plugin [fatal] file error - gmail_notify.tt: not found at line 144


こんなエラーが出てくる。
原因はこれ

global:
assets_path: /Users/username/plagger/assets/
timezone: Asia/Tokyo

2行目、3行目がインデントされていないので読み込んでくれなかったようだ。

global:
  assets_path: /Users/username/plagger/assets/
  timezone: Asia/Tokyo

こうすれば大丈夫。YAMLは触ったことが無いので非常に厄介だ。


よーし、ついに動くぞ、と思うもまたしても問題発生。
今度はこんなエラー。


Plagger::Plugin::Publish::Gmail [error] Error while sending emails: Failed to connect to mail server: Connection refused
at /Users/to510/Downloads/plagger-0.7.17-1/cpan/lib/perl5/site_perl/Plagger/Plugin/Publish/Gmail.pm line 118


またしても原因はYAML

  - module: Publish::Gmail
    config: メール送信先
      mailfrom: 送信者(なんでもおk)
      mailroute:
      via: smtp_tls
      host: smtp.gmail.com:587
      username: Gmailアカウント
      password: Gmailパスワード

5行目以降にインデントが無い。
↓これでおk

  - module: Publish::Gmail
    config: メール送信先
      mailfrom: 送信者(なんでもおk)
      mailroute:
        via: smtp_tls
        host: smtp.gmail.com:587
        username: Gmailアカウント
        password: Gmailパスワード

2回失敗して、YAMLのインデントの感覚は覚えてきた。
なんというか、キレイなツリー構造をインデントで表現してやらねばならないようだ。
とにかく内側の処理になったらインデント。


そろそろ動く…よね?


Plagger::Plugin::Publish::Gmail [error] Error while sending emails: Undefined subroutine &MIME::Lite::extract_addrs called at /Library/Perl/5.8.8/Plagger/Plugin/Publish/Gmail.pm line 217.


またキタコレ。


とにかくGmail.pmの217行目を見てみる。

my($from) = MIME::Lite::extract_addrs( $self->get('From') );


悪いのはここらしいですよ。
で、/Library/Perl/5.8.8/MIME/Lite.pm を調べる。


extract_addrsなんて無いorz
539行目にこんなものがある。

                sub extract_full_addrs {
                    my @ret=map { $_->format } Mail::Address->parse($_[0]);
                    return wantarray ? @ret : $ret[0]
                }
                sub extract_only_addrs {
                    my @ret=map { $_->address } Mail::Address->parse($_[0]);
                    return wantarray ? @ret : $ret[0]
                }

ということで、/Library/Perl/5.8.8/MIME/Lite.pmを修正。
212行目からを二カ所変更

# hack MIME::Lite to support TLS Authentication
*MIME::Lite::send_by_smtp_tls = sub {
    my($self, @args) = @_;

    ### We need the "From:" and "To:" headers to pass to the SMTP mailer:
    my $hdr   = $self->fields();
    my($from) = MIME::Lite::extract_full_addrs( $self->get('From') );#ここ変更した
    my $to    = $self->get('To');

    ### Sanity check:
    defined($to) or Carp::croak "send_by_smtp_tls: missing 'To:' address\n";

    ### Get the destinations as a simple array of addresses:
    my @to_all = MIME::Lite::extract_full_addrs($to);#ここ変更した
    if ($MIME::Lite::AUTO_CC) {
        foreach my $field (qw(Cc Bcc)) {
            my $value = $self->get($field);
            push @to_all, MIME::Lite::extract_addrs($value) if defined($value);
        }
    }

こんな風に。

で、最終的なYAMLはこれ。

global:
  assets_path: /Users/username/plagger/assets/
  timezone: Asia/Tokyo

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://d.hatena.ne.jp/goryugo/rss
  - module: CustomFeed::Mixi
    config:
      email: Mixi email
      password: password
      fetch_body: 1
      fetch_comment: 1
      show_icon: 1
      feed_type:
        - FriendDiary
        - RecentComment
        - Message
        - Log
  - module: Publish::Gmail
    config:
      mailto: mail
      mailfrom: from
      mailroute:
        via: smtp_tls
        host: smtp.gmail.com:587
        username: gmail ID
        password: password

やっとメール届いたよ…


ミクシィにログインしなくてすむように、今度はマイミクの日記をメールしたいです…