初心者だけどPerlが大好き

コードが世界を変える!

さくらからEncode.pmでヤフーに添付メールを飛ばす

以前のは Jcode.pm でしたので 新しく書き換えました。
さくらレンタルサーバーで 動作確認をいたしました
ヤフーと Gmail と so-net に飛ばすことに成功しました。あと未確認。

いままで 作成したフォームをいじって
メールを書くページ         mail666.cgi
メールを書くページのスタイルシート form.css
メールを飛ばしてから 送信しましたという結果を表示するページ mail777.cgi
と 3つに分けました
セキュリティのことを考えると さらに 細かく書きこむことがありますが
とにかく みなさんが 理解しやすい 簡単なメールCGIを心がけました

'form.css'の内容は CGI.pmとスタイルシートの記事の内容そのままです
/* --基本部分の設定-- */
body{background-color:#66ffcc;font-size:20px;line-height:20px}
h1{text-align:center;margin:0 15%;
background-color:#eea8aa;
font-size:20px;
color:#ffffff;
font-style:italic;}
em{font-size:20px;
border-bottom:dashed;
color:#808000;}
#bbb {color:#ff1493;margin:0 15%;line-height:12px;}
.ccc {color:#008000;margin:0 15%;line-height:15px;}


メールを書くページは  mail666.cgi
  

#!/usr/bin/perl           #さくらレンタルサーバーのPerlのパス   
use utf8;
use CGI;
$q= new CGI;
print $q->header(-charset => 'utf-8'),
$q->start_html(-title=>"Example CGI.pm Form", -style=>{'src'=>'form.css'}),
$q->h1(' Example CGI.pm Form'),
$q->start_div({-class=>"aaa"}),
$q->p('これは class="aaa" の部分です'),
$q->start_form(-action=>'mail777.cgi'),
$q->em("What's your name?"),
$q->br,
$q->br,
$q->textfield('name'),
$q->checkbox('Not my real name'),
$q->br,
$q->em("What's your e-mail?"),
$q->br,
$q->br,
$q->textfield('email'),
$q->br,
$q->em("What's your subject?"),
$q->br,
$q->br,
$q->textfield('subject'),
$q->br,
$q->em('Any parting comments?'),
$q->br,
$q->br,
$q->textarea(-name=>'comments',-rows=>3,-columns=>50),
$q->reset,
$q->submit('Action','送信'),
$q->submit('Action','Scream'),
$q->endform,
$q->end_div,
$q->start_div({-id=>"bbb"}), 
$q->h3('これは id="bbb" の部分です'),
$q->end_div,
$q->start_div({-class=>"ccc"}),
$q->h3('これは class="ccc" の部分です'),
$q->end_div,
$q->end_html;


次は フォームから データを受け取って メールするcgiです
mail777.cgiとします

#!/usr/bin/perl      #さくらレンタルサーバーのPerlのパス
use utf8;
use CGI;
use Encode;
use MIME::Base64;
use File::Basename;
my $q = CGI->new();
$name= $q->param('name');
$email= $q->param('email');
$subject= $q->param('subject');
$comments= $q->param('comments');
$mailto='trinity777@yahowo.co.jp';
# ファイルネーム取得
my $filename = $q->param('uploaded_file');
# ファイルシステムの設定(デフォルト:Unix)
fileparse_set_fstype('MSWin32');
my $basename= basename($filename,"");
# ファイルハンドル取得
my $fh = $q->upload('uploaded_file');
# バイナリデータとして読み込む
binmode $fh;
my $data ='';
while (read $fh,$buf,60*57){$data.=$buf;}
close $fh;
#バイナリデータをBASE64することでメール添付するためのASCIIテキストにする
$base64filebody = encode_base64($data,'');
#本文を出力する前に$base64filebodyの改行を\nに置換
#Windowsの改行コードは\r\nでMacの改行コードは\rですから全て\nに置換
$base64filebody=~ s/\r\n/\n/g;
$base64filebody=~ s/\r/\n/g;
# 汚染チェックとして改行を取り除く
$name=~ s/\r|\n//g;
$email=~ s/\r|\n//g;
$subject=~ s/\r|\n//g;
$comments=~ s/\r|\n//g;
#バウンダリーの設定で適当な文字入れる
my $bound='wq5se3d1ew';
$mail_name= encode('MIME-Header-ISO_2022_JP',$name);
$mail_email=encode('MIME-Header-ISO_2022_JP',$email);
$mail_to=encode('MIME-Header-ISO_2022_JP',$mailto);
$mail_subject=encode('MIME-Header-ISO_2022_JP',$subject);
$mail_comments=encode('ISO_2022_JP', decode('utf-8', $comments));
$mail_filename=encode('MIME-Header-ISO_2022_JP',$basename);
#さくらのSendmailのパスの指定
$sendmail = '/usr/sbin/sendmail';
# Sendmailのファイルを開いてデータを書き込む
open(MAIL,"| $sendmail -t")|| &error(150," 送信に失敗しました");
# mailのヘッダー
### 全体のヘッダ
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: Multipart/Mixed; boundary=$bound\n";
print MAIL "From: $mail_name <$mail_email>\n";
print MAIL "To: $mail_to\n";
print MAIL "Name: $mail_name\n";
print MAIL "Subject:$mail_subject\n";
print MAIL "--$bound\n";
print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n";
print MAIL "\n";
# mailの本文
$mail_comments =~ s/\r\n/\n/g;
print MAIL "$mail_comments\n";
print MAIL "--$bound\n";
print MAIL "Content-Type: application/octet-stream; name=$filename\n";
print MAIL "Content-Transfer-Encoding: base64\n";
print MAIL "Content-Disposition: attachment; filename=$mail_filename\n";
print MAIL "\n";
#添付するデータをbase64でエンコードしたもの
print MAIL "$base64filebody\n";
print MAIL "\n";
print MAIL "--$bound--\n";
close(MAIL);
print $q->header(-charset => 'utf-8'),
$q->start_html('Mail Form'),
$q->h1('settings in this form'),
$q->p('メールを送信しました。'),
$q->end_html;