电子邮件

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
2
3
4
5
6
7
8
<?php
$to = "someone@example.com"; // 邮件接收者
$subject = "Test"; // 邮件标题
$message = "Hello! 这是邮件的内容。"; // 邮件正文
$from = "someonelse@example.com"; // 邮件发送者
$headers = "From:" . $from; // 头部信息设置
mail($to,$subject,$message,$headers);
echo "邮件已发送";

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>

<?php
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
4
someone@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
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<?php
function spamcheck($field)
{
// filter_var() 过滤 e-mail
// 使用 FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);

//filter_var() 过滤 e-mail
// 使用 FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}

if (isset($_REQUEST['email']))
{
// 如果接收到邮箱参数则发送邮件

// 判断邮箱是否合法
$mailcheck = spamcheck($_REQUEST['email']);
if ($mailcheck==FALSE)
{
echo "非法输入";
}
else
{
// 发送邮件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
}
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>

上面这个例子使用了过滤器来对输入进行验证

  • 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,后面会学到