电子邮件
PHP允许直接从脚本发送电子邮件
mail()函数
mail()函数用于从脚本中发送电子邮件
语法1
mail(to,subject,message,headers,parameters)
参数 | 描述
- | -
to | 必需。规定email接收者
subject | 必需。规定email的主题。注释:该参数不能包含任何新行字符
message | 必需。定义要发送的信息。应使用LF(\n)来分隔隔行。每行限制在70个字符内
headers | 可选。规定附加的标题,比如From、Cc和Bcc。应当使用CRLF(\r\n)分隔附加的标题
parameters | 可选。对邮件发送程序规定额外的参数
简易E-Mail
通过PHP发送电子邮件的最简单的方法是发送文本email
1 |
|
Mail表单
通过PHP,可以在站点下制作一个反馈表单。下面的实例向指定的e-mail地址发送一条文本消息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
// 发送邮件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", $subject,
$message, "From:" . $email);
echo "邮件发送成功";
} else { // 如果没有邮箱参数则显示表单
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text'><br>
Subject: <input name='subject' type='text'><br>
Message:<br>
<textarea name='message' rows='15' cols='40'>
</textarea><br>
<input type='submit'>
</form>";
}
</body>
</html>
- 首先,检查是否填写了邮件输入框
- 如果未填写,输出HTML表单
- 如果已填写,从表单发送电子邮件
- 当填写完表单点击提交按钮后,页面重新载入,可以看到邮件输入被重置,同时显示邮件发送成功的消息
更多mail()函数信息可以参考手册
https://www.runoob.com/php/php-ref-mail.html
E-mail注入
就在上面的例子中,其实是存在安全问题
上面代码存在的问题是:未经授权的用户可以通过输入表单在邮件头部插入数据
例如插入1
2
3
4someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com
由于是正常语法,mail()函数会把上面的文本放入邮件头部,现在头部就有了额外的Cc: Bcc: To:字段。当用户点击提交时便会发送到上面所有的地址
防止E-mail注入
防止最好的方法就是对输入的内容进行验证
1 | <html> |
上面这个例子使用了过滤器来对输入进行验证
- FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
- FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值
- filter_var()通过指定的过滤器过滤,语法为
filter_var(variable, filter, options)
;如果成功,则返回已过滤的数据,如果失败,则返回 false
总结
1.电子邮件的发送使用mail()函数进行,可以事先定义好相关变量,必要的变量是to:接收者 subject:主题 message:发送的消息,发送者一般使用from变量 并添加在headers中
2.也可以使用表单来发送e-mail
3.编写e-mail表单时,要注意使用过滤器验证用户输入的合法性,不能过分相信用户输入,避免出现安全问题
4.常见的e-mail过滤器为FILTER_SANITIZE_EMAIL
过滤器从字符串中删除电子邮件的非法字符FILTER_VALIDATE_EMAIL
过滤器验证电子邮件地址的值
使用filter_var()函数来进行过滤
5.具体关于Filter的内容可以参考手册https://www.runoob.com/php/php-filter.html,后面会学到