初心者だけどPerlが大好き

コードが世界を変える!

さくらからNet::SMTPでヤフーに添付メールを飛ばす

メールは確かに飛びますので 構文は正しいと思います。
ただし SMTPを叩くせいか 連続して送信ができません。
DOS攻撃に備えて さくらのサーバーが
同じIPアドレスから連続送信できないようになっているのか???不明

フォームは 以前のものを 丸ごと使います。

POP before SMTPというのに さくらのメールサーバーが対応しています
SMTP自体に 認証機能が無いので
use Net::POP3;(コアモジュールです)
さきに POPで サーバーに

$pop = Net::POP3->new('メールホスト名');
POPメールサーバー名と POPメールサーバーのパスワードを送ります。

フォームから データを受け取って メールするcgiです

mail777.cgiとします

#!/usr/bin/perl     #さくらレンタルサーバーのPerlのパス
use utf8;
use CGI;
use Encode;
use MIME::Base64;
use File::Basename;
use Net::SMTP;
use Net::POP3;
my $q = CGI->new();
$name= $q->param('name');
$email= $q->param('email');
$subject= $q->param('subject');
$comments= $q->param('comments');
$mailto='trinity777@yahow.co.jp';       #あなたのヤフーメルアド
my $mailhost ='なんとかかんとか.sakura.ne.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_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);
#POPします
$pop3= Net::POP3->new($mailhost) or die "error!!\n";
$pop3->login("メールサーバー名","メールサーバーパスワード");
$pop3->quit();
#SMTPします
my $smtp = Net::SMTP->new($mailhost) or die "error!!\n";
$smtp->mail($email);     #フォームで入力されたメルアドにする
$mail_email=encode('MIME-Header-ISO_2022_JP',$email);
$smtp->to($mailto);      #ヤフーに設定したのでヤフーにいきます
$mail_to=encode('MIME-Header-ISO_2022_JP',$mailto);
$smtp->data();
$smtp->datasend("MIME-Version: 1.0\n");
$smtp->datasend("Content-Type: Multipart/Mixed; boundary=$bound\n");
$smtp->datasend("Content-Transfer-Encoding: base64\n");
$smtp->datasend("From: $mail_email\n");
$smtp->datasend("To: $mail_to\n");
$smtp->datasend("Subject:$mail_subject\n");
$smtp->datasend("--$bound\n");
$smtp->datasend("Content-Type: text/plain; charset=ISO-2022-JP\n");
$smtp->datasend("\n");
$smtp->datasend("$mail_comments\n");
$smtp->datasend("--$bound\n");
$smtp->datasend("Content-Type: application/octet-stream; name=$filename\n");
$smtp->datasend("Content-Transfer-Encoding: base64\n");
$smtp->datasend("Content-Disposition: attachment; filename=$mail_filename\n");
$smtp->datasend("\n");
$smtp->datasend("$base64filebody\n");
$smtp->datasend("--$bound--\n");
$smtp->dataend();
$smtp->quit;
print $q->header(-charset => 'utf-8'),
$q->start_html('Mail Form'),
$q->h1('settings in this form'),
$q->p('メールを送信しました。'),
$q->end_html;