さくらから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;