这一节的内容是发送邮件,有以下几点需要注意:
1、mail函数的格式,各个参数的格式;
2、发送成功之后,应该给用户怎样的反馈?
3、如果没有发送成功,改给用户什么样的反馈?
主要是增加了下面这些代码:
mail_process.php
1 $mailSended = mail($to ,$subject, $message, $headers, $authenticate);//这里直接换做mail函数 2 if(!$mailSended){ 3 $errors[‘mailfail‘] = true; //如果发送失败了,我们将用这里的布尔值决定是否向用户展示信息。 4 //别以为你所有的函数都设置好了,后面的就肯定可以成功,对最后的结果还是要有验证的。 5 }
form.php:
1 $authenticate = null; 2 require ‘mail_process.php‘; 3 if($mailSended){ 4 header(‘Location: welcome.htm‘);//新认识的函数,header 5 exit; 6 }
1 <?php if(($_POST && $suspect) ||($_POST && isset($errors[‘mailfail‘]))){ ?> 2 <p class="waring">消息无法发送成功</p> 3 4 <?php 5 }elseif($missing || $errors){ 6 ?> 7 <p class="waring">你没有按要求填写表单,请按要求填写</p> 8 <?php 9 } 10 ?>
到目前为止,这个发送表格的课程全部学完了,一下是完整的代码:
form.php:
1 <?php 2 $missing = array();//用于存储用户没有填写的信息; 3 $errors = array();//用于存储用户填写错误的信息; 4 //具体如何识别没有填写或者填写错误的信息,然后把它们存储到相应的数组中?这是另一节的内容了。 5 if(isset($_POST[‘send‘])){ 6 $to = ‘[email protected]‘; 7 $subject = ‘来自留言本的反馈‘; 8 $expected = array(‘name‘,‘email‘,‘comment‘); 9 $required = array(‘name‘,‘email‘,‘comment‘); 10 $headers = "From: [email protected]\r\n"; 11 $headers .= "Content-Type: text/plain;charset-utf-8"; 12 $authenticate = null; 13 require ‘mail_process.php‘; 14 if($mailSended){ 15 header(‘Location: welcome.htm‘);//新认识的函数,header 16 exit; 17 } 18 } 19 ?> 20 <html> 21 <head> 22 <meta charset="utf-8"> 23 <title>联系我们</title> 24 <style> 25 input,label,textarea{ 26 display:block; 27 margin:1em; 28 } 29 textarea{ 30 width:400px; 31 height:200px; 32 } 33 .waring{ 34 color:red; 35 font-weight:bold; 36 } 37 </style> 38 </head> 39 40 <body> 41 <h1>留言本</h1><!-- 这里添加一个标题,其实是无关紧要的 --> 42 <?php if(($_POST && $suspect) ||($_POST && isset($errors[‘mailfail‘]))){ ?> 43 <p class="waring">消息无法发送成功</p> 44 45 <?php 46 }elseif($missing || $errors){ 47 ?> 48 <p class="waring">你没有按要求填写表单,请按要求填写</p> 49 <?php 50 } 51 ?> 52 <form method="post" action=‘<?php echo($_SERVER[‘PHP_SELF‘]); ?>‘;> 53 54 <label>姓名: 55 <?php if($missing && in_array(‘name‘, $missing)){ ?> 56 <span class="waring">你没有填写名字!</span> 57 <?php } ?> 58 59 </label> 60 <input type="text" name="name" id="name" 61 <?php 62 if( $errors || $missing ){ 63 echo ‘value="‘. htmlentities($name,ENT_COMPAT,‘utf-8‘) . ‘"‘;//原来只有$name,现在加入了htmlentites函数 64 } 65 ?>></input> 66 67 <label>邮箱地址: 68 <?php 69 if($missing && in_array(‘email‘,$missing)){ 70 ?> 71 <span class="waring">你没有填写邮箱地址!</span> 72 <?php }elseif(isset($errors[‘email‘])){ 73 ?> 74 <span class="waring">您填写的邮箱地址格式不合法!</span> 75 <?php } ?> 76 77 </label> 78 <input type="text" name="email" id="email" 79 80 <?php 81 if( $errors || $missing ){ 82 echo ‘value="‘. htmlentities($email,ENT_COMPAT,‘utf-8‘) . ‘"‘; 83 } 84 ?> 85 86 ></input> 87 88 <label>评论: 89 <?php 90 if($missing && in_array(‘comment‘,$missing)){ 91 ?> 92 <span class="waring">你没有填写评论</span> 93 <?php } ?> 94 95 <?php 96 if($errors && in_array(‘comment‘,$errors)){ 97 ?> 98 <span class="waring">您填写的评论格式不合法!</span> 99 <?php } ?> 100 101 </label> 102 <textarea name="comment" id="comment"><?php //textarea的开始符和PHP的开始符之间不要有空格,要不然会页面中显出出来。 103 if($missing || $errors){ 104 echo htmlentities($comment,ENT_COMPAT,‘utf-8‘); 105 } 106 ?></textarea> <!-- 同样的textarea的结束符也是和PHP的结束符之间不要有空格。 --> 107 108 <input type="submit" name="send" id="send" value="提交评论"></submit> 109 </form> 110 111 </body> 112 </html>
mail_process.php:
1 <?php 2 $suspect = false; 3 $pattern = ‘/Content-Type:|Bcc:|Cc:/i‘; 4 5 function isSuspect($val,$pattern,&$suspect) { 6 if(is_array($val)){//如果$val是数组,我们就遍历整个数组,将将每个value找出来赋值给$item; 7 foreach($val as $item){//这就是传说中的递归? 8 isSuspect($item,$pattern,$suspect); 9 } 10 }else{ 11 if(preg_match($pattern,$val)){ 12 $suspect = true; 13 } 14 } 15 } 16 17 isSuspect($_POST,$pattern,$suspect); 18 19 if(!$suspect){ 20 foreach($_POST as $key => $value){ 21 $temp = is_array($value) ? $value :trim($value); //判定用户的输入是不是一个数组; 22 if(empty($temp) && in_array($key,$required)){ 23 $missing[] = $key;//如果输入是空的,就把它放到$missing的数组里面; 24 $$key = ‘‘;//并且把空值赋给$$key; 25 }elseif(in_array($key,$expected)){ 26 $$key = $temp;//如果不是空的,而且还是我们想要的$expece,那就把它的值赋给$$key,所以说$$key有可能是个数组了。 27 } 28 } 29 } 30 31 32 if(!$suspect && !empty($email)){ 33 //这里是过滤用户输入的email地址,如果符合email地址格式,就赋值给$validemail,如果不是email地址,则返回false,即$validemail = false; 34 $validemail = filter_input(INPUT_POST,‘email‘,FILTER_VALIDATE_EMAIL); //这里email是数组INPUT_POST的key,不用$ 35 if($validemail){ 36 $headers .= "\r\nReply-to: $validemail"; 37 }else{ 38 $errors[‘email‘] = true; 39 } 40 } 41 42 if(!$suspect && !$missing && !$errors){//如果出现以上情况,我们不希望这个程序运行; 43 $message = ‘‘; //先建立$message以后再慢慢的往里面加内容; 44 foreach($expected as $item){ //谨慎起见,我只希望希望的内容出现在邮件主题中 45 if(isset($$item) && !empty($$item)){ 46 $val = $$item; //variable variable,具体到实例,就是$val = $name/$val = $email等; 47 } else { 48 $val = ‘没有选中‘; //这个基本上不会出现,因为前面$missing和$errors都已经验证过了。 49 } 50 51 if(is_array($val)){ //处理输入值是数组的情况 52 $val = implode(‘, ‘,$val); 53 } 54 $item = str_replace(array(‘_‘,‘-‘),‘ ‘,$item);//去除掉下划线或者短横线,如果e-mail会变成e mail 55 $message .= ucfirst($item) . ": $val\r\n\r\n";//首字母变大写,这些都是小处理,可以在完成大的逻辑之后慢慢补充这些内容 56 } 57 $message = wordwrap($message,70);//这是邮件的要求,单行不能超过70个字符; 58 59 60 //$message = ‘这里是message的全部内容‘; 61 $mailSended = mail($to ,$subject, $message, $headers, $authenticate);//这里直接换做mail函数 62 if(!$mailSended){ 63 $errors[‘mailfail‘] = true; //如果发送失败了,我们将用这里的布尔值决定是否向用户展示信息。 64 //别以为你所有的函数都设置好了,后面的就肯定可以成功,对最后的结果还是要有验证的。 65 } 66 }
welcome.htm:
1 <h1>消息已经发送成功,我将尽快和您联系!</h1>
<over>
时间: 2024-10-26 01:09:40