Perlの最近のブログ記事

MIMEエンコード

| コメント(0) | トラックバック(0)

前回の続きだけど(perlでsmtpサーバーに接続して送信

問題なのが、意外に文字列処理。

昔は、eucで書いて、Jcodeでsjisやjisに変換していました。

今は、utf8で書いて、Unicode::Japaneseで処理してます。

MIMEエンコードをどうしようかな。MIMEの部分だけ、JcodeかEncodeを使用しようとしたら、処理がすごく遅いという、気になる記事が。([Perl] 帰ってきたEncodeのMIME-Header-ISO_2022_JPは遅いんじゃ? たまには呪文をとなえてみるか:仕事版/ウェブリブログ

今のJcodeはEncodeのWrapperだから、どっちも同じ事なんだろうな。(Jcode.pm

 

じゃぁどうしようかなと言うことなんだけど。

携帯キャリアによっては少し処理を変えた方が良いかも(携帯/絵文字メール送信(Perl+Encode-JP-Mobile) - yanor.net/wiki)。

いやいや。まずは標準的な機能を導入するのが先だな。

 

use MIME::Words;
$subject = Unicode::Japanese->new($subject)->jis;
$header .= "Subject: ".encode_mimeword($subject,'B','iso-2022-jp')."\n";

こんな感じにする事にします。

 

しかし、このままでは長い件名だとそのままなので、ある程度の文字数で改行する必要がある。(http://www.puni.net/~mimori/rfc/rfc2822.txt

2.1.1. 行の長さの制限

それぞれの行の文字はCRLFを除いて、決して998文字以下でなければならず(MUST)、78文字以下であるべきである(SHOULD)。

これに対応するには、Perlメモのbase64あたりの事をしないとダメなんだなぁ。
簡単に出来ると思ったら、結構しんどそう。
またこれは改めて対応することにする。

cpan

| コメント(0) | トラックバック(0)

◆インストールされているかの確認
perl -e 'use Authen::SASL'

◆インストールするとき
cpan -i Authen::SASL

 

http://www.rfs.jp/sb/perl/05/grep.html
http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique
ここら辺を参考に作る。

@bkm_topic= ( "1\t2\t3\t4","1\t2\t5\t4","1\t2\t3\t5" );
のようなデータがあるときに、重複する配列を削除する。
ただし、各配列の4項目目は無視したい。異なっていても重複と見なす。

    {
    my %tmp;
    @bkm_topic = grep(  !$tmp{&aaa($_)}++, @bkm_topic );
    sub aaa{
        my($a,$b,$c,$d)=split(/\t/,$_[0]);
        return "$a\t$b\t$c"
    }
    }

3個目までの項目をチェックして、4項目は異なっていても重複と見なす
すると、このようになる。
@bkm_topic= ( "1\t2\t3\t4","1\t2\t5\t4" );

残る配列は、最初の方なので、あらかじめソートなどをしておく。