Publish::Iso_2022_jp_mail

某所でなぜか期待されてしまったので適当にでっち上げ。

Publish::GmailMIME::Lite::TT::Japaneseからパクリまくりです。


Plainテキストで携帯に送りたいと勝手に解釈したうえで…。

Plainテキストへの変換は以前に作っていたFilter::FormatTextを使用し、Publish::Iso_2022_jp_mailのみを作りました。

P::Iso_2022_jp_mailからF::FormatTextが自動的に呼ばれるので以下の2つをコピペして使ってください。

また、entryが長すぎる場合はここのFilter::Substrも併用してください。

ヘッダは

Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=iso-2022-jp

となるので問題なさそうですが、携帯に送るテストは行なっていません。

また、MIME::Lite::TT::Japaneseから拝借したencode_body,guess_encoding,remove_utf8_flagはもっとどうにか出来そうですが、とりあえずこれで勘弁してください。> Yappoさん。

Publish::Iso_2022_jp_mail

 package Plagger::Plugin::Publish::Iso_2022_jp_mail;
use strict;
use base qw(Plagger::Plugin);

use DateTime;
use DateTime::Format::Mail;
use Encode;
use Encode::MIME::Header;
use Jcode;
use MIME::Lite;

sub rule_hock {'publish.entry.fixup'}

sub register {
my ($self, $c) = @_;
$c->autoload_plugin('Filter::FormatText');
$c->register_hook(
$self,
'publish.entry.fixup' => \&notify,
);
}

sub init {
my $self = shift;
$self->SUPER::init(@_);
$self->conf->{mailto} or Plagger->context->error("mailto is required");
$self->conf->{mailfrom} ||= 'plagger@localhost';
}


sub notify {
my ($self, $context, $args) = @_;
return if $args->{feed}->count == 0;
my $cnf = $self->conf;
my $now = Plagger::Date->now(timezone => $context->conf->{timezone});
my $subject = $args->{feed}->title || '(no-title)';
my $from = $cnf->{mailfrom};
my $msg = MIME::Lite->new(
Date => $now->format('Mail'),
From => encode('MIME-Header-ISO_2022_JP', $from),
TO => $cnf->{mailto},
Subject => encode('MIME-Header-ISO_2022_JP', $subject),
Type => 'text/plain; charset=iso-2022-jp',
Encoding=> '7bit',
Data => encode_body($args->{entry}->body),
);
$msg->send();
$context->log(info => "Sending $subject to $cnf->{mailto}");
}

sub encode_body {
my $str = shift;
$str = remove_utf8_flag($str);
$str =~ s/\x0D\x0A/\n/g;
$str =~ tr/\r/\n/;
return Jcode->new($str, guess_encoding($str))->jis;
}

sub guess_encoding {
my $str = shift;
my $enc = Jcode::getcode($str) || 'euc';
$enc = 'euc' if $enc eq 'ascii' || $enc eq 'binary';
return $enc;
}

sub remove_utf8_flag { pack 'C0A*', $_[0] }

1;

Filter::FormatText

 package Plagger::Plugin::Filter::FormatText;

use HTML::TreeBuilder;
use HTML::FormatText;
use HTML::WikiConverter;

use strict;
use warnings;
use base qw( Plagger::Plugin );
use utf8;

our $VERSION = 0.04;

sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'update.entry.fixup' => \&filter,
);
}

sub filter {
my($self, $context, $args) = @_;
my $entry = $args->{entry};
#if ($entry->body->is_html || $self->conf->{always}){
if ($entry->body =~ /<\w+>/ || $self->conf->{always}){
my $tree = HTML::TreeBuilder->new()->parse($entry->body);
my $formatter = HTML::FormatText->new( lm => 0, rm => 998 );

my $body = $formatter->format($tree);
$entry->body($body);
$context->log(info => "format $entry->{link}") if $entry->{link};
}
}

1;

本当はSummaryのサポートを待つのが正解でしょうが…。