ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュのローカル環境でのメール送信について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ローカル環境でのメール送信について

PHP:5.0.1
  OS:Windows XP
  Webサーバ:Apache

今、ソーテック社の「実践マスターPHP+MySQL」という本で勉強しているところです。
Part8の325ページの会員管理画面で新規ユーザ登録をすると、
新規ユーザへの案内メールが届くとありますが、届く前にエラーが出てしまいメールが届かないのです。

エラー表示は以下です。
Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\jissen\Part8\8-1\userkanri.php on line 105

「ローカル環境でのメール送信」でググってみたところ、参考になるサイトがあったので読んでみました。
http://www.phppro.jp/qa/717#3267

Xmailやsendまねーるといったメール環境を導入しないとだめなのでしょうか?


試しにレンタルサーバへ突っ込んでやってみたのですが、URLをいれると
BASIC認証の画面になり、指定のIDとPASSを入れるのですが
認証されないのです。(もちろんローカル環境では認証されます。)
Xmailなどの説明がないということは、ローカル環境で作業する事ができるのでしょうか?
これはXmailなどを使用しなくても進めてられるのかその辺を知りたいです。



ソースを記載しておきます。(本のサンプルデータをダウンロードしているので間違いはないと思います。)
<?php
//======================================================================
// ■: 友達会員限定お料理日記公開システム ユーザ管理 userkanri.php
//======================================================================
//------------------------------------
// ■ BASIC認証
//------------------------------------
if (!isset($_SERVER["PHP_AUTH_USER"]) ||
!($_SERVER["PHP_AUTH_USER"] == "mikan" && $_SERVER["PHP_AUTH_PW"] == "minoru")){
header("WWW-Authenticate: Basic realm=\"Cooking community\"");
header("HTTP/1.0 401 Unauthorized");
echo "BASIC認証のIDまたはパスワードが正しくありません";
echo "BASIC認証のIDまたはパスワードが正しくありません<br><br>";
echo "<a href=\"userkanri.php\">ユーザ管理ページへ</a>";
exit();
}
//----------------------------------------
// ■ MySQLクラスファイルの取り込み
//----------------------------------------
require_once("mysql2.php");
//----------------------------------------
// □:MYSQLクラスインスタンスの作成
//----------------------------------------
$mysql = new MySQL;
//----------------------------------------
// ■外部ファイルの読み込み
//----------------------------------------
require_once("com_define.php");
//----------------------------------------
// ■ 変数初期化
//----------------------------------------
$sql = "";
$error = "";
$new_no = "";
$new_name = "";
$new_birth = "";
$new_email = "";
//----------------------------------------
// ■ POSTされたとき
//----------------------------------------
if ($_SERVER["REQUEST_METHOD"]=="POST"){
//--------------------------------
// □ 新規追加
//--------------------------------
if (isset($_POST["submit_add"])){
//--------------------------------
// □ POSTされたデータを取得
//--------------------------------
//新規追加
$new_no = htmlspecialchars($_POST["new_no"], ENT_QUOTES); //追加番号
$new_name = htmlspecialchars($_POST["new_name"], ENT_QUOTES); //追加名前
$new_birth = htmlspecialchars($_POST["new_birth"], ENT_QUOTES); //追加誕生日
$new_email = htmlspecialchars($_POST["new_email"], ENT_QUOTES); //追加メールアドレス
//--------------------------------
// □ 全角文字を半角に変換
//--------------------------------
$new_no = mb_convert_kana($new_no,"as");
$new_birth = mb_convert_kana($new_birth,"as");
$new_email = mb_convert_kana($new_email,"as");
//--------------------------------
// □ チェック
//--------------------------------
//番号
if (strlen($new_no)>0){
if (!preg_match("/^[0-9]*$/",$new_no)){$error = "新規番号[$new_no]に誤りがあります";}
//最大番号を取得
$mysql->query("SELECT MAX(no) AS maxno FROM friends");
$row = $mysql->fetch();
if ($new_no<=$row["maxno"]){
$error = "新規番号[$new_no]は最大番号よりも大きくしてください";
}
}else{
$error = "新規番号が未入力です";
}
//名前
if (strlen($new_name)==0){
$error = "新規名前が未入力です";
}
//誕生日
check_birth(0,$new_birth,$error);
//メールアドレス
check_email(0,$new_email,$mysql,$error);
//--------------------------------
// □ SQL文作成
//--------------------------------
if ($error==""){
$sql = "INSERT INTO friends VALUES($new_no,'$new_name','$new_birth','$new_email')";
$mysql->query($sql);

//------------------------------------
// □ 新規ユーザ登録の際メールを送る
//------------------------------------
$subject = "お料理コミュニティへのお誘い";

$content = str_repeat("*==",20) ."\n";
$content.= "◎お料理コミュニティへのお誘い\n";
$content.= str_repeat("*==",20)."\n\n";
$content.= "{$new_name} さま\n\n";
$content.= "楽しいお料理コミュニティに参加しませんか?\(^o^)/\n\n";
$content.= "http://localhost/8-1/login.php\n\n";
$content.= "ユーザID:{$new_email}\n";
$content.= "パスワード:" .FIRST_PASS ."\n\n";
$content.= "ご参加を友人一同、心から待っていまーす♪\n";
$mailfrom="From:masago@kagoya.net";
if (mb_send_mail($new_email,$subject,$content,$mailfrom)){
$error = "新規登録が完了しました";
}else{
$error = "メールが送信できませんでした";
}
$new_no = "";
$new_name = "";
$new_birth = "";
$new_email = "";

}

}
//--------------------------------
// □ 変更
//--------------------------------
if (isset($_POST["submit_upd"])){
$no = key($_POST[submit_upd]); //押下したボタン番号を取得
//--------------------------------
// □ POSTされたデータを取得
//--------------------------------
$name = htmlspecialchars($_POST["name"][$no], ENT_QUOTES); //名前
$birth = htmlspecialchars($_POST["birth"][$no], ENT_QUOTES); //誕生日
$email = htmlspecialchars($_POST["email"][$no], ENT_QUOTES); //メールアドレス
//--------------------------------
// □ 全角文字を半角に変換
//--------------------------------
$email = mb_convert_kana($email ,"as");
$birth= mb_convert_kana($birth ,"as");
//--------------------------------
// □ チェック
//--------------------------------
//名前
if (strlen($name)==0){
$error = "{$no}番の名前が未入力です";
}
//誕生日
check_birth($no,$birth,$error);
//メールアドレス
check_email($no,$email,$mysql,$error);
//--------------------------------
// □ SQL文作成
//--------------------------------
if ($error==""){
$sql = "UPDATE friends SET name='$name',birth='$birth',email='$email' WHERE no=$no";
$mysql->query($sql);
$error = "{$no}番のデータを変更しました";
}
}
//--------------------------------
// □ 削除
//--------------------------------
if (isset($_POST["submit_del"])){
$no = key($_POST[submit_del]); //押下したボタン番号を取得
//友達テーブル(friends)から削除
$sql = "DELETE FROM friends WHERE no=$no";
$mysql->query($sql);
//友達情報テーブル(friendinfo)から削除
$sql = "DELETE FROM friendinfo WHERE no=$no";
$mysql->query($sql);
//メッセージテーブル(friendmsg)から削除
$sql = "DELETE FROM friendmsg WHERE no=$no";
$mysql->query($sql);
//クッキングログテーブル(cookinglog)から削除
$sql = "DELETE FROM cookinglog WHERE no=$no";
$mysql->query($sql);
//クッキングコメントテーブル(cookingres)から削除
$sql = "DELETE FROM cookingres WHERE no=$no";
$mysql->query($sql);
$error = "{$no}番のデータを削除しました";

}
}
//=====================================================================
// ■ H T M L
//=====================================================================
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=euc-jp">
<title>友達会員限定お料理日記ページ 会員管理画面</title>
</head>
<body>
<?php
//--------------------------------------------------------------------
// ■ エラーメッセージがあったら表示
//--------------------------------------------------------------------
if (strlen($error)>0){
echo "<font size=\"2\" color=\"#da0b00\">{$error}</font><p>";
}
?>
<h3>友達会員限定お料理日記ページ 会員管理</h3>
<form action="<?=$_SERVER["PHP_SELF"]?>" method="POST">
<table border="1" cellspacing="0" cellpadding="3" width="100%" bordercolor="#666666">
<tr bgcolor="#eee8aa">
<td align="center"><font size="2">番号</font></td>
<td align="center"><font size="2">名前</font></td>
<td align="center"><font size="2">誕生日</font></td>
<td align="center"><font size="2">メールアドレス</font></td>
<td><font size="2"> </font></td>
</tr>
<?php
//----------------------------------------
// □:テーブルからデータを読む
//----------------------------------------
$mysql->query("SELECT * FROM friends ORDER BY no");
while($row = $mysql->fetch()){
$no = $row["no"];
$name = $row["name"];
$birth = $row["birth"];
$email = $row["email"];
echo <<<EOT
<td align="center">$no</td>
<td><input type="text" name="name[$no]" value="$name" size="10"></td>
<td><input type="text" name="birth[$no]" value="$birth"></td>
<td><input type="text" name="email[$no]" value="$email" size="30"></td>
<td><input type="submit" name="submit_upd[$no]" value="変更">
<input type="submit" name="submit_del[$no]" value="削除"></td>
</tr>
EOT;
}
//ここまでwhileループ[終了の閉じカッコ]
?>
<tr>
<td align="center"><input type="text" name="new_no" value="<?=$new_no ?>" size="5"></td>
<td><input type="text" name="new_name" value="<?=$new_name ?>" size="10"></td>
<td><input type="text" name="new_birth" value="<?=$new_birth ?>"></td>
<td><input type="text" name="new_email" value="<?=$new_email ?>" size="30"></td>
<td><input type="submit" name="submit_add" value="追加♪"></td>
</tr>
</table>
</form>
<font size="2" color="#556b2f">
※追加したユーザにログインパスワードのメールを自動的に送ります。<br>
</font>
</body>
</html>
<?php
//======================================================================
// ■: ユーザ定義関数
//======================================================================
//------------------------------------
// □ 年月日のチェック
//------------------------------------
function check_birth($no,$ymd,&$error){
if ($no == 0){
$strno = "新規";
}else{
$strno = "{$no}番";
}
if (strlen($ymd)>0){
if (!preg_match("/^[0-9-]*$/",$ymd)){
$error= "{$strno}の誕生日[$ymd]に誤りがあります";
}else{
list($y,$m,$d) = explode("-", $ymd);
if (!checkdate($m,$d,$y)){
$error = "{$strno}の誕生日[$ymd]に誤りがあります";
}
}
}else{
$error = "{$strno}の誕生日が未入力です";
}
}
//------------------------------------
// □ メールアドレスのチェック
//------------------------------------
function check_email($no,$mail,&$mysql,&$error){
if ($no == 0){
$strno = "新規";
}else{
$strno = "{$no}番";
}

if (strlen($mail)>0){
if (!preg_match("/^[^@]+@([-a-z0-9]+\.)+[a-z]{2,}$/", $mail)){
$error = "{$strno}のメールアドレス[{$mail}]に誤りがあります";
}
//メールアドレスの重複チェック
$mysql->query("SELECT * FROM friends WHERE email='$mail' AND no<>$no");
if ($mysql->rows()>0){
$error = "{$strno}のメールアドレス[{$mail}]は登録されています";
}
}else{
$error = "{$strno}のメールアドレスが未入力です";
}
}
?>

コメント(11)

WindowsApacheでsendmailをインストールするのは
かなり難しいのでphp.iniで外部のSMTPサーバーを指定するのをお薦めます。
http://mixi.jp/view_bbs.pl?id=65068069&comment_count=0&comm_id=2234
http://mixi.jp/view_bbs.pl?id=65068095&comment_count=0&comm_id=105980
マルチポストするんじゃないよボケが。
荒木様
すみません。
どこのコミュニティが適切かわからずマルチポストしました。
とりあえずPHPコミュ以外のトピックは削除しました。
名前考え中様
フォウ様
ご返答ありがとうございました。

メールサーバを使用するのは難しいとの事ですので、
valuedomainというレンタルサーバを使用しているのでphp.iniをその設定に合わせてみました。

以下↓
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = s372.xrea.com
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = d.seino@e-commu.jp

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

ですが、メール送信できないです。ポート587でも試しましたがだめでした。
エラーは同じみたいです。
以下↓
Warning: mb_send_mail() [function.mb-send-mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\jissen\Part8\8-1\userkanri.php on line 105

何が原因なのでしょうか?
レンタルサーバーなら何も設定いりません。
php.iniを削除してください。
radishっていうメールサーバーをインストールしたらいけるかも?
http://lilium.7thheavenblue.com/web_environment/radish/

前やった時は設定いらずでメール送信テストできました。
ブーヤー様
ありがとうございます。
でもダウンロードすると、
Brothersoftdownloader_for_Radish.exe
がダウンロードできて
以下のリンクに行くだけなのですが…

file:///C:/Documents%20and%20Settings/Owner/My%20Documents/Downloads/brothersoft-community-toolbar-download-321725.html


あと、先ほどの「うつしよ」さんのサイトを見ると
XAMPP なら「Mercury Mail Transport System」 が含まれているので、それを使えばいいが

と書いてあります。
私のPCの環境はXAMPPでして、「Mercury Mail Transport System」入ってるのですが、なんでうまくいかないのでしょうか?
radishの配布元はもう閉じられているんですね^^;

ここに見つけました。ページ右側の radish-3.0.0-b026.lzh です
http://www.download.co.jp/network/server/a0000000008/

現在利用しているPCがMacなんで動作確認できてませんが^^;
ブーヤー様
閉じられてるってことなんですね!
見つけて頂き感謝です。
ありがとうございます。

さっそくやってみますわーい(嬉しい顔)
ブーヤー様
radish設定したらローカル環境で無事にメール送信できました!!
これで次のステップへ行けます。
めっちゃうれしいです。
ありがとうございました _(._. )_

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング