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;