Movable Type で、通知メールのテンプレートをカスタマイズする

Movable Type のメール通知機能でのテンプレートは、直接コードに埋め込まれているため、素人が変更するのは難しい。しかし Perl の知識があればなんとかなるだろう。以下の例では、サブジェクトはエントリーのタイトルそのままに、本文からエントリータイトルや日付など余計な部分を除いたもの。 /lib/MT/App/CMS.pm の 6618 行付近より。
<font color="red">=comment</font>
    $name = ('(' x ($fill_len/2)) . ' ' . $name . ' ' . (')' x ($fill_len/2));
    $body .= $name . "\n\n";
    my @ts = offset_time_list(time, $blog);
    my $ts = sprintf "%04d%02d%02d%02d%02d%02d",
        $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0];
    my $date = format_ts('%Y.%m.%d %H:%M:%S', $ts, $blog);
    my $fill_left = ' ' x int(($cols - length($date)) / 2);
    $body .= "$fill_left$date\n\n\n";
    $body .= ('-' x $cols) . "\n\n";
<font color="red">=cut</font>
    if ($q->param('send_excerpt')) {
        $body .= MT::I18N::wrap_text($entry->get_excerpt, $cols-4, "    ","    ") . "\n\n";
        $body .= ('-' x $cols) . "\n\n";
    }
    $body .= $entry->permalink . "\n\n";
    $body .= MT::I18N::wrap_text($q->param('message'),$cols, '', '') . "\n\n";
    if ($q->param('send_body')) {
        $body .= ('-' x $cols) . "\n\n";
        $body .= MT::I18N::wrap_text($entry->text, $cols, '', '') . "\n";
    }
<font color="red"># 以下の部分をコメントアウトまたは修正
#   my $subj = $app->translate("[_1] Update: [_2]", $blog->name, $entry->title);
# ここまで
# 以下の部分を追加
    my $subj = $app->translate("[_1]", $entry->title);</font>
</font>
Movable Type のメール通知機能でのテンプレートは、直接コードに埋め込まれているため、素人が変更するのは難しい。しかし Perl の知識があればなんとかなるだろう。以下の例では、サブジェクトはエントリーのタイトルそのままに、本文からエントリータイトルや日付など余計な部分を除いたもの。 /lib/MT/App/CMS.pm の 6618 行付近より。
<font color="red">=comment</font>
    $name = ('(' x ($fill_len/2)) . ' ' . $name . ' ' . (')' x ($fill_len/2));
    $body .= $name . "\n\n";
    my @ts = offset_time_list(time, $blog);
    my $ts = sprintf "%04d%02d%02d%02d%02d%02d",
        $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0];
    my $date = format_ts('%Y.%m.%d %H:%M:%S', $ts, $blog);
    my $fill_left = ' ' x int(($cols - length($date)) / 2);
    $body .= "$fill_left$date\n\n\n";
    $body .= ('-' x $cols) . "\n\n";
<font color="red">=cut</font>
    if ($q->param('send_excerpt')) {
        $body .= MT::I18N::wrap_text($entry->get_excerpt, $cols-4, "    ","    ") . "\n\n";
        $body .= ('-' x $cols) . "\n\n";
    }
    $body .= $entry->permalink . "\n\n";
    $body .= MT::I18N::wrap_text($q->param('message'),$cols, '', '') . "\n\n";
    if ($q->param('send_body')) {
        $body .= ('-' x $cols) . "\n\n";
        $body .= MT::I18N::wrap_text($entry->text, $cols, '', '') . "\n";
    }
<font color="red"># 以下の部分をコメントアウトまたは修正
#   my $subj = $app->translate("[_1] Update: [_2]", $blog->name, $entry->title);
# ここまで
# 以下の部分を追加
    my $subj = $app->translate("[_1]", $entry->title);</font>
</font>

Movable Type で、管理画面で Favicon を表示したい。

Movable Type 3.2 の管理画面(アドミン)では six apart の Favicon (favicon.ico → favicon.ico) が表示されない。これは、ダウンロードした Movable Type のパッケージの中に favicon.ico ファイルがなく、テンプレートにも Favicon の記述がないから。やはり Movable Type の管理画面では six apart の Favicon を表示させたい。その場合は、以下のようにする。
  1. favicon.ico を Movable Type をインストールしたディレクトリにコピーする。とりあえず six apart からコピーしよう。 → https://www.sixapart.jp/favicon.ico
  2. tmpl/cms/header.tmpl をエディタ開く
  3. このファイルの先頭から数行目にある styles.css"... を探す。
  4. この行の後に、 favicon.ico" /> を追記する。
  5. header.tmpl を保存。
Movable Type 3.2 の管理画面(アドミン)では six apart の Favicon (favicon.ico → favicon.ico) が表示されない。これは、ダウンロードした Movable Type のパッケージの中に favicon.ico ファイルがなく、テンプレートにも Favicon の記述がないから。やはり Movable Type の管理画面では six apart の Favicon を表示させたい。その場合は、以下のようにする。
  1. favicon.ico を Movable Type をインストールしたディレクトリにコピーする。とりあえず six apart からコピーしよう。 → https://www.sixapart.jp/favicon.ico
  2. tmpl/cms/header.tmpl をエディタ開く
  3. このファイルの先頭から数行目にある styles.css"... を探す。
  4. この行の後に、 favicon.ico" /> を追記する。
  5. header.tmpl を保存。

Perl で、複数のファイルまたがる文字列を置換するには?

以下のように、replace.conf のハッシュ変数に置換前・置換後の文字列を書いておき、replace.pl を実行する。 replace.conf の内容
#/usr/bin/perl -w

use strict;

our $HOME_DIR = '/home/youraccount';
our $DIR = "$HOME_DIR/targetdirectory";
our %WORDS = (

                'ブラウザー'   # 置換前の文字列
            =>   'ブラウザ',   # 置換後の文字列

                'FTP'       # 置換前の文字列
            =>     'FTP',    # 置換後の文字列

# ... 以下、

                '置換前の文字列1'
            =>  '置換後の文字列1',

                '置換前の文字列2'
            =>  '置換後の文字列2'

# ... という形で追加していけばよい。

        );
1;
replace.pl の内容
#!/usr/bin/perl

require './jcode.pl';
require './replace.conf';

opendir(DIR, $DIR) or die "Couldn't open $DIR directory.";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
    if(!(-d $file) && $file ne '.' && $file ne '..' && $file ne __FILE__) {
        print "$file\n";
        replace($file);
    }
}

sub replace {

    my ($file) = @_;

    open(IN, "$DIR/$file") or die die "Couldn't open $file.";
    my @lines = <IN>;
    close(IN);
    open(OUT, ">$DIR/$file.tmp") or die die "Couldn't open $file.";
    foreach my $line (@lines) {

        &amp;jcode'h2z_sjis(\$line);

        while(my($before, $after) = each %WORDS) {

            if($line =~ /$before/) {
                $line =~ s/$before/$after/g;
            }
        }
        print OUT $line;
    }
    close(OUT);

    rename("$DIR/$file.tmp", "$DIR/$file");
    unlink("$DIR/$file.tmp");
}

1;
以下のように、replace.conf のハッシュ変数に置換前・置換後の文字列を書いておき、replace.pl を実行する。 replace.conf の内容
#/usr/bin/perl -w

use strict;

our $HOME_DIR = '/home/youraccount';
our $DIR = "$HOME_DIR/targetdirectory";
our %WORDS = (

                'ブラウザー'   # 置換前の文字列
            =>   'ブラウザ',   # 置換後の文字列

                'FTP'       # 置換前の文字列
            =>     'FTP',    # 置換後の文字列

# ... 以下、

                '置換前の文字列1'
            =>  '置換後の文字列1',

                '置換前の文字列2'
            =>  '置換後の文字列2'

# ... という形で追加していけばよい。

        );
1;
replace.pl の内容
#!/usr/bin/perl

require './jcode.pl';
require './replace.conf';

opendir(DIR, $DIR) or die "Couldn't open $DIR directory.";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
    if(!(-d $file) && $file ne '.' && $file ne '..' && $file ne __FILE__) {
        print "$file\n";
        replace($file);
    }
}

sub replace {

    my ($file) = @_;

    open(IN, "$DIR/$file") or die die "Couldn't open $file.";
    my @lines = <IN>;
    close(IN);
    open(OUT, ">$DIR/$file.tmp") or die die "Couldn't open $file.";
    foreach my $line (@lines) {

        &amp;jcode'h2z_sjis(\$line);

        while(my($before, $after) = each %WORDS) {

            if($line =~ /$before/) {
                $line =~ s/$before/$after/g;
            }
        }
        print OUT $line;
    }
    close(OUT);

    rename("$DIR/$file.tmp", "$DIR/$file");
    unlink("$DIR/$file.tmp");
}

1;

Perl で、POST したい。

Perl で POST するには、LWP で
my $req = HTTP::Request->new(POST => $url);
として URL を指定し、
$req->content_type('application/x-www-form-urlencoded');
$req->content('Entity=Flight&ContractID=490&Enroute=N&FlightCategory=...');
のように POST するデータを与えればよい。サーバ(CGI スクリプト)に渡すパラメータは、URL の 「?」 の後に続き、<パラメータ名1>=<値1&gt&<パラメータ名2>=<値2&gt&<パラメータ名3>=<値3&gt&…といった形で、「&」 を用いていくつものパラメータと値の組み合わせをつなげることが出来る。 以下は、FryteComm というサイトにアクセスして、XML で現在のフライト状況を取得するサンプルである。飛行機が遅れているかどうかの状況がわかる。 使用するモジュール
use LWP::UserAgent;
#!/usr/bin/perl -w

use LWP::UserAgent;

our $ua = LWP::UserAgent->new;
our $url = 'https://applecomputer:apc0606jb@flytesource.flytecomm.com/FlyteSourceGeneratorWebApp/Application';
our $query_string = 'Entity=Flight&ContractID=490&Enroute=N&FlightCategory=COM&DataView=detail&DepartureAirportCode=SFO&ArrivalAirportCode=NRT&AirlineCode=UA&FlightNumber=837';

my $req = HTTP::Request->new(POST => $url);
$req->content_type('application/x-www-form-urlencoded');
$req->content($query_string);

my $res = $ua->request($req);
print $res->as_string;

1;
Perl で POST するには、LWP で
my $req = HTTP::Request->new(POST => $url);
として URL を指定し、
$req->content_type('application/x-www-form-urlencoded');
$req->content('Entity=Flight&ContractID=490&Enroute=N&FlightCategory=...');
のように POST するデータを与えればよい。サーバ(CGI スクリプト)に渡すパラメータは、URL の 「?」 の後に続き、<パラメータ名1>=<値1&gt&<パラメータ名2>=<値2&gt&<パラメータ名3>=<値3&gt&…といった形で、「&」 を用いていくつものパラメータと値の組み合わせをつなげることが出来る。 以下は、FryteComm というサイトにアクセスして、XML で現在のフライト状況を取得するサンプルである。飛行機が遅れているかどうかの状況がわかる。 使用するモジュール
use LWP::UserAgent;
#!/usr/bin/perl -w

use LWP::UserAgent;

our $ua = LWP::UserAgent->new;
our $url = 'https://applecomputer:apc0606jb@flytesource.flytecomm.com/FlyteSourceGeneratorWebApp/Application';
our $query_string = 'Entity=Flight&ContractID=490&Enroute=N&FlightCategory=COM&DataView=detail&DepartureAirportCode=SFO&ArrivalAirportCode=NRT&AirlineCode=UA&FlightNumber=837';

my $req = HTTP::Request->new(POST => $url);
$req->content_type('application/x-www-form-urlencoded');
$req->content($query_string);

my $res = $ua->request($req);
print $res->as_string;

1;