名前(送信者名または宛名)が設定されているか調べる。名前をMIMEエンコードして、末尾にスペースを追加する。メールアドレスを追加する。'<'.$mail_address.">\n");}上記の箇所では、メールヘッダを格納する$mail_headerという変数を宣言した後に、実際のメールヘッダを作成しています。<宛先メールアドレス>というフォーマットを作るためのサブルーチンです。メールヘッダは7bitである事が求められますが、UTF-8は8bitなのでencodeモジュールを使ってMIMEエンコードを行い、7bitへとデータを変換しています。文中のMIME-Headerという指定は、UTF-8をMIMEエンコードするという事です。これによりFrom、To、SubjectのいずれにもUTF-8を書けるようになります。UTF-8とbase64エンコードを使う事を明記します。base64\n";上記の箇所では、送信するメールがUTF-8を使って書かれている事、そしてそれがbase64エンコードされて格納されている事を、メールヘッダへ明記しています。メールヘッダの終わり。(これ以降は本文となります。"\n";上記の箇所では、メールヘッダの終了を表す、2つの連続した改行を作るために、改行コードを追加しています。上記のbase64エンコーディングを指定している箇所の、行末にある改行と合わせて2つの連続した改行となります。SMTPでメールを送る。$SMTP=Net::SMTP->new($smtp_server,Port=>$smtp_port,Hello=>$smtp_helo);上記の箇所では、Net::SMTPモジュールを使って、SMTPサーバーとの接続を試みています。接続が成功するとSMTPオブジェクトが生成されます。}上記の箇所では、SMTPオブジェクトが生成されたかどうかを調べて、生成されていない場合にはエラーメッセージを表示してプログラムを終了させています。$SMTP->mail($mail_from);$SMTP->to($mail_to);上記の箇所では、生成したSMTPオブジェクトを使って、FromとToをSMTPサーバーへ送信しています。$SMTP->data();$SMTP->datasend($mail_header);上記の箇所では、$SMTP->data();によってSMTPサーバーにDATAコマンドを送り、これからメールデータ(メールヘッダ+本文)を送信する事を知らせています。$SMTP->datasend($mail_header);で、先ほど前の方で作っておいたメールヘッダを送信しています。$SMTP->datasend(encode_base64(encode('utf8',$message)));上記の箇所では、まずencode('utf8',$message)でメールの本文をperlの内部コードからUTF-8へ変換しています。)によって、UTF-8となったメールの本文をbase64エンコードしています。);によってSMTPサーバーへ送信しています。※1perlがUTF-8を単なるバイト列ではなく、UTF-8文字列として認識している状態を、utf8フラグが立った状態といい、utf8フラグが立ったUTF-8文字列はperlの内部コードとなります。encodeを使って何らかの外部コード(UTF-8、shift_jis、euc-jp、jis等)に変換しなければなりません。この変換作業をutf8フラグを取るといいます。perlの内部コードはUTF-8なのですが、それをUTF-8として外部へ出力する場合にもutf8フラグを取る作業は行わなければなりません。utf8フラグを取らないまま、perlの外部へ内部コードを出力しようとすると(printしたり、openしたり、etc...)perlに「内部コードが外部へ垂れ流れちゃってるよ」と怒られます。utf8;したソースの中に記述されたUTF-8文字列には、自動的にutf8フラグが立ちます。#こうしたとき"日本語"や$utr8_strにはutf8フラグが立っています。今回は使っていませんがWeb上のフォームから受け取ったUTF-8の文字列をperlにUTF-8の文字列として認識させるためには、decode_utf8を使ってutf8フラグを立てる必要があります。utf8::decode()というものもありますが、不正なUTF-8文字列をスルーしてしまうのでEncode::decode_utf8のほうを使いましょう。$input;$SMTP->dataend();$SMTP->quit;exit;上記の箇所では、$SMTP->dataend();でSMTPサーバーに対してメール本体のデータ送信が終わった事を告げ、$SMTP->quit;でSMTPサーバーとの通信を終了しています。▼Encodeで文字コード変換を行う際のTipsWindowsのテキストデータをUnicodeに変換する際に、sihift_jis→Unicodeという変換を行うと、"~"という字が"〜"に変わってしまう事があります。これはWindowsで使われているshift_jisというのは厳密にいうとcp932というコードで、shift_jisとは似て非なる物だからです。字形を崩さずに変換する為にはcp932→Unicodeという変換をしなければなりません。Encodeはcp932もサポートしているので使い分けると上手く変換できます。メールサーバー接続時のエラーチェックを追加した。メールサーバー接続時にHELOコマンドを送るようにした。メールアドレスをname-addr形式に対応させた。perlのバージョンを5.10.1から5.14.0へ更新した。libnetライブラリの内蔵時期の説明がおかしかったのを直した。動作確認したのでその旨を追記した。