SendmailからPHPmailerへの移行

平文でメール発信していたツールを、6月に向けて、SSL型に移行するため、
PHPに書き換えたいが、腰が重くなっていた。
話題のClaude3に任せることにしたら、ほぼそのまま、SSL型メール発信になった。
参考にしたいという人もいるので、Before/Afterで、ソースコードを載せる。

元のPerl-CGI

#!/usr/local/bin/perl

# モジュール宣言
use strict;
use utf8;
use CGI::Carp qw(fatalsToBrowser);
use lib "./lib";
# use CGI::Minimal;
use CGI;
use URI::Escape;
use File::Copy;
use File::Basename;
use Encode qw(decode);
use JSON;

# データ受理
# CGI::Minimal::max_read_size(10240);
my $cgi = CGI->new;
my %in = &parse_form($cgi);
my %hash ;  

my $date = $in{date};
my $str_crypt = $in{str_crypt};
my $str_plain;

# 初期モード
my $ret = 0;
my $personc = Encode::decode('utf8',$in{addrJ});
my $join;
my $body;
my $mbody;
	&header();
print $in{addrJ};
my $addrJ = decode_json($in{addrJ}); print "$@";
my $title = Encode::decode('utf8',$in{subject});
print $title."<br>";

# for my $person (@$addrJ) {for my $clm (@$person) {print "$clm<br>\n";}};
my $upfile = "";
my $upfile2 = "";

if ($in{attach} ne "") {
	$upfile = basename($in{attach});
	my $fh = $cgi->param('attach');
	copy ($fh, "../temp/$upfile");
}
if ($in{attach2} ne "") {
	$upfile2 = basename($in{attach2});
	my $fh = $cgi->param('attach2');
	copy ($fh, "../temp/$upfile2");
}
# 認証
if ($in{mode} eq "chkMl") {
	require './lib/captcha.pl';
	($str_plain, $str_crypt) = cap::make( 'captclipbrd', 6 );
}

foreach my $addr (@$addrJ) {
    my @pers = @$addr;
    if ($#pers > 1) {
	my $email = @$addr[2];
        my $eemail = $email;
	$eemail =~ s/\@/@/;
	my $name  = @$addr[1];
	my $nenji = @$addr[0];
	$join = $nenji."卒) ".$name." 様";
	$mbody = Encode::decode('utf8',$in{mbody});
	$mbody =~ s/!EMAIL!/$eemail/g;
	if ($in{mode} eq "sendMl") { &checKey(); }
        # 改行処理<br>
	$body = $join."\n".$mbody;
	# 依頼者へのメールテキスト出力
	if (($in{mode} eq "sendMl")||($in{mode} eq "mailIn")) {
		$ret = &sendMail($title,$name,$email,$in{email},$body);
		print "メール発信を実施しました。".$in{email}." ".$ret."<br>\n";
	}
	elsif ($in{mode} eq "chkMl") {
		# 画面展開
		if ($body eq "【ファイル】") {
		  $body = $join;
		}
		# 改行処理
		$body .= "\nこのメッセージの発信には、次の投稿キーが必要です。\n";
		$body .= $str_plain."\n";
		$ret = &sendMail($title."(プレビュー)",$name,$in{email},$in{email},$body);
		$body =~ s/\r\n/<br>/g;
		$body =~ s/\r/<br>/g;
		$body =~ s/\n/<br>/g;
		print $body;
		&error("発信のプレビューがあなたにメール送信されました。".$ret);
	}
    }
}
print "</body></html>";
exit();

#-----------------------------------------------------------
#  HTMLヘッダー
#-----------------------------------------------------------
sub header {
	my $ttl = shift;

	print "Content-type: text/html\n\n";
	print <<EOM;
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css">
<!--
body,td,th { font-size: 13px; }
.ttl { color: #004040; }
-->
</style>
<title>$ttl</title>
</head>
<body>
EOM
}
#-----------------------------------------------------------
#  フォームデコード
#-----------------------------------------------------------
sub parse_form {
	my $cgi = shift;

	my %in;
#	if ($ENV{'QUERY_STRING'} ne "") { &error ("フォームの外からの要求です");}
	$in{xls} = "";
	foreach ( $cgi->param() ) {
		my $val = $cgi->param($_);

		if (($_ ne 'addrJ') && ($_ ne 'mbody') && ($_ ne 'upfile')) {
			# 無効化
			$val =~ s/&/&/g;
			$val =~ s/</</g;
			$val =~ s/>/>/g;
			$val =~ s/"/"/g;
			$val =~ s/'/'/g;

			# 改行処理
			$val =~ s/\r\n/<br>/g;
			$val =~ s/\r/<br>/g;
			$val =~ s/\n/<br>/g;
		}
		$in{$_} = $val;
	}
	return %in;
}

#-----------------------------------------------------------
#  エラー画面
#-----------------------------------------------------------
sub error {
	my $err = shift;
        my $ext = shift;
	my $tmpl = <<HTML;
<hr width="350">
<p>!message!</p>
<form name=form1 action="//mori1-hakua.tokyo/cgi-bin/test/sendMK.cgi" ENCTYPE="multipart/form-data" method="post">
<input type="hidden" name="mode" value="chkMl">
<input type="hidden" name="addrJ" value='$personc'>
<input type="hidden" name="sama" value="$join">
<input type="hidden" name="len" value="0">
<input type="hidden" name="subject" value="$title">
<input type="hidden" name="mbody" value='$mbody'>
<input type="hidden" name="email" value="$in{email}">
<input type="hidden" name="str_crypt" value="$str_crypt">
<table cellpadding="1" cellspacing="1" id="reqMail">
<tr>
<!-- captcha_begin -->
	<td class="item">投稿キー</td>
	<td class="small"><input type="number" name="captcha" size="6" style="ime-mode: disabled;" maxlength="6" value="">
		(プレビューで通知された数字を入力)
	</td>
<!-- captcha_end -->
</tr><tr>
	<td class="item" valign="top">添付ファイル</td>
	<td>  <input type="file" name="attach"></td>
</tr><tr>
	<td class="item" valign="top">添付ファイル2</td>
	<td>  <input type="file" name="attach2"></td>
</tr><tr>
<td></td><td align="right">
	<input type="submit" id="send" value="送信" !disable! onclick='form1.mode.value="sendMl";'>
        <input type="button" value="戻る" onclick="window.close()">
	</td>
</tr>
</table></form></body></html>
HTML
        if ($ext==3) {
	    $tmpl =~ s/!message!/$err/;
            $tmpl =~ s/!disable!/disabled/; 
        } else { 
	    $tmpl =~ s/!message!/<font color=red>$err<\/font>/;
            $tmpl =~ s/!disable!//; 
        }
	print $tmpl;
	exit;
}
#-----------------------------------------------------------
#  添付メール送信
#-----------------------------------------------------------
sub sendMail
{
	my ($title,$name,$email,$org,$body) = @_;
#	$email =~ s/@/\\@/g;
	require '/home/users/1/main.jp-mori1-mp/web/clipbbs/tmpl/sendMail.pl';
# 添付ファイル付きでメールを送る
# 引数 (添付ファイルパス・拡張子, 添付するパス無しファイル名の年次部分配列,
#	差出人名, 差出人メールアドレス, 送信先名, 送信先メールアドレス, 
#       件名, 本文 [, 返信先名, 返信先メールアドレス, 日時とホストを無追記]
#       [, Cc名, Ccアドレス, Bcc名, Bccアドレス])
return &sendmail_attach (["/home/users/1/main.jp-mori1-mp/web/wp31/cgi-bin/temp/",""],
	["$upfile","$upfile2"],
	"在京白堊会事務局",$org,$name,$email,
	$title,
	$body,
	"年次幹事",$org,0,"","","在京白堊会事務局","");
}

#-----------------------------------------------------------
#  投稿文字認証
#-----------------------------------------------------------
sub checKey {
	# 要求キーチェック
	require './lib/captcha.pl';
	if ($in{captcha} !~ /^\d{6}$/) {
		&error("投稿キーが入力不備です。<br>プレビューで通知を受けたキーを入力してください");
	}

	# 要求キーチェック
	# -1 : キー不一致
	#  0 : 制限時間オーバー
	#  1 : キー一致
	my $chk = cap::check($in{captcha}, $in{str_crypt},'captclipbrd',10, 6);
	if ($chk == 0) {
		&error("投稿キーが有効時間を超過しました。<br>プレビューをやり直してください");
	} elsif ($chk == -1) {
		&error("投稿キーが不正です。<br>プレビューで通知を受けたキーを入力してください");
	}
}

変換後のPHPmailerによるプログラム

これで、Gmailにも正確に届く。

カテゴリー: お知らせ パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です