end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Net::SMTP for perl で機種依存文字のメール送信なら、ISO-2022-JP-MS

http://osdn.jp/projects/legacy-encoding/releases/
上記より、Encode::ISO2022JPMS をinstallし、以下のscriptのように利用します。

Encode::encode('iso-2022-jp',)では、半角カナ→全角、機種依存文字→?に置換されますが、Encode::ISO2022JPMS では、いい感じに送信されます。

※Encode::ISO2022JPMS導入による悪影響は確認していません
※UTF8でのメールに移行すべきですかね? レガシーな仕組みにメールすることもあるので、難しいですが

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::ISO2022JPMS;
use Authen::SASL;
use Net::SMTP;
use Data::Dumper;

my $CONF = {host=>'smtp.gmail.com',
            port => 465, #SSL=465, TLS=587
            SSL     => 1,
            uid=>'ないしょ@gmail.com',
            passwd=>'ないしょ' };
# gmailでsmtpするなら、アプリ専用passwdを発行しましょう
# https://security.google.com/settings/security/apppasswords

main();


sub main {


    my $from = 'ないしょ@gmail.com';
    my $subject = 'TEST - Net::SMTP for perl';
    my $mailto = ['ないしょ@gmail.com];

    my $message =<<EOF;
これは、Net::SMTP for perl における
機種依存文字のテストです。

アイウエオ
ガギグゲゴ
㈱ 郄 粼
① ②
EOF

    #メールのヘッダーを構築
    my $header = << "MAILHEADER";
From: $from
Subject: $subject
Mime-Version: 1.0
Content-Type: text/plain; charset = "ISO-2022-JP"
Content-Transfer-Encoding: 7bit
MAILHEADER

    # http://osdn.jp/projects/legacy-encoding/releases/
    $message = Encode::ISO2022JPMS->encode($message);

    # encode('iso-2022-jp', ...)では、半角カナ→全角、機種依存文字→?に置換
#    $message = Encode::encode('iso-2022-jp',$message);

    my $smtp = Net::SMTP->new($CONF->{host},
                              Hello=>$CONF->{host},
                              Port=> $CONF->{port},
                              Timeout=>20,
                              SSL=>1,
                              Debug=>1
                             );

    unless($smtp){
        my $msg = "can't connect smtp server:$CONF->{host}:$!";
        die $msg;
    }

    unless ($smtp->auth($CONF->{uid},$CONF->{passwd}) ){
        my $msg = "can't login smtp server:$CONF->{host}:$!";
        die $msg;
    }

    $smtp->mail($from);
    $smtp->to(@$mailto);
    $smtp->data();
    $smtp->datasend("$header\n");
    $smtp->datasend("$message\n");
    $smtp->dataend();
    $smtp->quit;

}

1;