ローカル環境でサイト制作の勉強をしている場合、ローカル環境ではsmtpサーバが動いていないことが多いと思います。

そこで、gmailのsmtpサーバを使ってメール発信します。

直接メール発信をするコード(Perl5版)は、すでにアップしたので、今回は、XAMPP版です。

だから、XAMPPのsendmail.iniにsmtp.gmailのためのアカウント情報を記述する必要があります。

このコードからXAMPPのsendmailに処理が渡り、それからsmtp.gmailに処理が渡ります。


このコードを書くのに結構苦労しました。

その経過については、『xamppからsmtp.gmail.comに送信して、悪戦苦闘 』 に書いてます。

また、Perlでの記述については、『XAMPPのsendmailを使ってPerlでメール発信 』 にここより詳しく書いてます。


まず、mail.cgiです。

#!C:\xampp\perl\bin\perl.exe

# ==============================
# mail.cgi
# by Seiichi Nukayama 2017.12.7
# 参考サイトは一番下に記述。
# ==============================

use strict;
use utf8;
use Encode;
use MIME::Base64;
use CGI;

# ================== 確認項目 ==========================
my $cgi = CGI::new();
# お客様のメールアドレスを取り込む
my $mail_from = $cgi->param(‘usermail’);
# お客様のコメントを取り込む
my $usercomment = $cgi->param(‘usercomment’);
utf8::decode($usercomment) unless utf8::is_utf8($usercomment);
# お客様の名前を取り込む
my $mail_from_name = $cgi->param(‘username’);
utf8::decode($mail_from_name) unless utf8::is_utf8($mail_from_name);

#——— 追加項目 —————
my $message = “\nお名前:” . $mail_from_name;
$message .= “\nメールアドレス:” . $mail_from;
$message .= “\nお問い合わせ内容:” . $usercomment;
#———————————-

# ================ あなたが設定する項目 ==================
# あなたの名前をメールアドレスを記述する。
# お客様のコメントがメールとなって、あなたのもとに届く。
my $mail_to_name = ‘(Your Name)’;
my $mail_to = ‘XXXXXXX@example.com’;

# メールの件名を設定する。
# この件名であなたのもとに届くよ。
my $subject = ‘コメントが届いてます。’;

# メール送信後に「戻る」でどこにリンクするか?
my $modoru = ‘./’;

# xamppのsendmail.exeへのパス
my $scmd = “c:/xampp/sendmail/sendmail.exe -oi -t”;

# ============== 設定項目おわり =====================

# メール本文をutf-8外部コードに変換、base64に変換する。
my $enc_message = encode_base64(encode(‘UTF-8’, $message));

# メールヘッダを作成する。
# from、to、件名共にMIME-Header(UTF-8)へエンコードします。
my $mail_header;

# 送信者名、送信者のメールアドレスを、
# From: 送信者名 <送信者メールアドレス> 形式へ変換する。
$mail_header = make_name_addr(‘From:’,$mail_from_name,$mail_from);

# 宛名、宛先のメールアドレスを、
# To: 宛名 <宛先メールアドレス> 形式へ変換する。
$mail_header .= make_name_addr(‘To:’,$mail_to_name,$mail_to);

# 件名をMIMEエンコードする。
$mail_header .= ‘Subject: ‘.encode(‘MIME-Header’,$subject).”\n”;

# UTF-8とbase64エンコードを使う事を明記します。
$mail_header .= “MIME-Version: 1.0\n”;
$mail_header .= “Content-type: text/plain; charset=UTF-8\n”;
$mail_header .= “Content-Transfer-Encoding: base64\n”;

# メールヘッダの終わり。(これ以降は本文となります。)
$mail_header .= “\n”;

## ——————————————-
## sendmailへ送信
open(SENDMAIL, “| $scmd”) or die “Can’t fork for sendmail: $!\n”;

print SENDMAIL <<“EOF”;
$mail_header
$enc_message
EOF

close(SENDMAIL) or warn “sendmail didn’t close nicely”;
## ——————————————-

my $show_message = <<“EOM”;
Content-type: text/html

<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”utf-8″>
<title>メール送信</title>
</head>
<body>
メールを送信しました。<br><br>
<a href=” $modoru “>戻る</a>
<p>送信内容: $message</p>
</body></html>
EOM

print encode(‘utf-8′, $show_message);

exit;

# 名前とメールアドレスから、name_addr形式のフォーマットを作るサブルーチン。
sub make_name_addr {
# 引数を受け取る。
my ($mail_direction,$mail_name,$mail_address) = @_;
# 末尾にスペースを追加して”From: “または “To: “を作る。
my $name_addr = $mail_direction.’ ‘;

# 名前(送信者名または宛名)が設定されているか調べる。
if ($mail_name ne “”) {
# 名前が設定されていたら、
# 名前をMIMEエンコードして、末尾にスペースを追加する。
$name_addr .= encode(‘MIME-Header’,$mail_name).’ ‘;
}
# メールアドレスを追加する。
return ($name_addr .= ‘<‘.$mail_address.”>\n”);
}

##################################################
# 参考(というか引用元)
# perlでUnicode(UTF-8)で書かれたメールを送信する方法
# http://www.fantasy.jp/~hibernal/document/20100217.htm
########################################################

次に、htmlもアップしときます。

これは、 『HTML5CSS3レッスンブック』(ソシム)  のサンプルコードのために作ったものです。

<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>お問い合わせ – FOREST STUDIO</title>
<link rel=”stylesheet” href=”style.css”>
</head>
<body id=”contact”>
<header>
<h1><a href=”index.html”><img src=”logo.png” alt=””>FOREST STUDIO</a></h1>
<nav>
<ul>
<li><a href=”index.html”>トップ</a></li>
<li><a href=”news.html”>お知らせ</a></li>
<li><a href=”about.html”>工房について</a></li>
<li><a href=”contact.html”>お問い合わせ</a></li>
</ul>
</nav>
</header>

<article>
<h1>お問い合わせ</h1>

<p>ご意見、ご感想などがありましたら、以下の欄にご記入の上、送信してください。 また、森の工房やイベントに関するご質問などもお気軽にお寄せください。</p>

<form action=”mail.cgi” method=”post”>
<p>
<label>
名前:<input type=”text” name=”username”>
</label>
</p>

<p>
<label>
性別:<input type=”radio” name=”gender” value=”man”>男
<input type=”radio” name=”gender” value=”woman”>女
</label>
</p>

<p>
<label>
メールアドレス:<input type=”email” name=”usermail”>
</label>
</p>

<p>
<label>
コメント:<textarea name=”usercomment”></textarea>
</label>
</p>

<input type=”hidden” name=”subject” value=”お問い合わせ”>

<p><input type=”submit” value=”送信”></p>
</form>

</article>

<footer>
<small>Copyright &copy; FOREST STUDIO, all rights reserved.</small>
</footer>

</body>
</html>


XAMPPの設定は、以下です。sendmailを使うように設定します。
C:\xampp\php\php.ini


1142 ; XAMPP IMPORTANT NOTE (1): …(略)…
1143 ; XAMPP IMPORTANT NOTE (2): …(略)…
1144 ; XAMPP: Comment out this if …(略)…
1145 sendmail_path = “\”C:\xampp\sendmail\sendmail.exe\” -t” ; <== コメントをはずす
1146
1147 ; XAMPP: Comment out this if …(略)…
1148 ;sendmail_path=”C:\xampp\mailtodisk\mailtodisk.exe” ; <== コメントをつける


C:\xampp\sendmail\sendmail.ini


6 [sendmail]

14 ;smtp_server=mail.mydomain.com
15 ;smtp_server=paso1.bgm-net
16 smtp_server=smtp.gmail.com ; <== smtpサーバの指定
17
18 ; smtp port (normally 25)
19
20 ;smtp_port=25
21
22 ; for smtp.gmail.com
23 smtp_port=587 ; <== ポート番号
24
25 ; SMTPS (SSL) support
26 ; auto = use SSL for port 465, otherwise try to use TLS
27 ; ssl = alway use SSL
28 ; tls = always use TLS
29 ; none = never try to use SSL
30
31 smtp_ssl=auto ; <== autoでいけてる

51 ; for smtp.gmail.com
52 auth_username=XXXXXXXX@gmail.com ; <== あなたのメールアドレスアカウント
53 auth_password=ZZZZZZZZ ; <== あなたのパスワード

66 force_sender=XXXXXXXX@gmail.com ; <== あなたのメールアドレスアカウント