如何使用PHP中的邮件发送函数?
邮件发送是在网站和服务器运行过程中非常频繁的操作,因此PHP提供了mail函数来帮助我们完成邮件发送的操作。本文将详细介绍mail函数的使用方法。
1. 函数基本语法
mail()函数是php自带的邮件发送函数,语法如下:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
这里,$to表示邮件接收者的邮箱地址,$subject表示邮件的主题,$message表示邮件内容。第四个和第五个参数是可选的,$additional_headers表示邮件的附加标题,$additional_parameters表示发送邮件时的其他参数,比如发送邮件的发件人信息。
函数返回值为布尔类型,表示邮件是否发送成功。如果发送成功,则返回true,否则返回false。
2. 邮件发送操作步骤
邮件发送的基本流程包括:连接邮件服务器、认证、设置邮件信息和发送邮件等步骤。下面我们逐一介绍。
2.1 连接邮件服务器
邮件发送需要连接邮件服务器,常用的邮件服务器有QQ邮箱、163邮箱、Gmail等。我们可以使用如下代码连接QQ邮箱SMTP服务器。
$smtp_server = "smtp.qq.com";
$smtp_port = 25;
$smtp_username = "你的QQ邮箱地址";
$smtp_password = "你的QQ邮箱SMTP服务器密码";
$smtp_socket = fsockopen($smtp_server, $smtp_port, $errno, $errstr);
if (!$smtp_socket) {
echo "连接SMTP服务器失败:{$errno}: {$errstr}
";
return false;
}
上面的代码以连接QQ邮箱SMTP服务器为例,需要修改$smtp_username和$smtp_password为你自己的QQ邮箱账号和SMTP服务器密码。在连接SMTP服务器时,我们使用了fsockopen函数与服务器建立Socket连接。
2.2 认证
连接SMTP服务器后,我们需要通过认证才能发送邮件。SMTP服务器通常使用的认证方式有登录、PLAIN和CRAM-MD5三种方式。其中,登录方式最为常用。
登录方式是将账号和密码以base64编码的形式发送给SMTP服务器,用于验证用户身份。下面是使用登录方式认证的代码:
if (preg_match("/^220/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "EHLO {$smtp_server}\r
");
if (preg_match("/^250/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "AUTH LOGIN\r
");
if (preg_match("/^334/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, base64_encode($smtp_username) . "\r
");
if (preg_match("/^334/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, base64_encode($smtp_password) . "\r
");
if (preg_match("/^235/i", fgets($smtp_socket, 1024))) {
echo "认证成功!
";
} else {
echo "认证失败:用户名和密码不匹配!
";
return false;
}
} else {
echo "认证失败:请输入密码!
";
return false;
}
} else {
echo "认证失败:请输入账号!
";
return false;
}
} else {
echo "认证失败:SMTP服务器不支持登录认证!
";
return false;
}
} else {
echo "连接SMTP服务器失败!
";
return false;
}
上述代码使用EHLO命令与SMTP服务器通信,并发送AUTH LOGIN命令以进入登录状态。然后逐一发送账号、密码进行认证。如果认证失败,则返回false。
2.3 设置邮件信息
认证通过后,我们需要分别设置邮件的发件人、接收人、主题、内容等信息。代码如下:
// 设置发件人
fputs($smtp_socket, "MAIL FROM:<{$smtp_username}>\r
");
fputs($smtp_socket, "RCPT TO:<{$to}>\r
");
// 设置邮件头部信息
$femail = "From: {$smtp_username}\r
";
$femail .= "To: {$to}\r
";
$femail .= "Subject: {$subject}\r
";
$femail .= "MIME-Version: 1.0\r
";
$femail .= "Content-Type: text/html;charset=utf-8\r
\r
";
$femail .= $message;
2.4 发送邮件
设置好邮件信息后,我们就可以使用fputs函数将邮件发送给SMTP服务器,完成邮件发送的操作。
if (preg_match("/^250/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "DATA\r
");
if (preg_match("/^354/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, $femail."\r
.\r
");
if (preg_match("/^250/i", fgets($smtp_socket, 1024))) {
echo "邮件发送成功!
";
return true;
} else {
echo "邮件发送失败!
";
return false;
}
}
}
以上代码会用DATA命令告诉SMTP服务器接下来的内容为邮件的内容。如果返回的状态码为354,则表示可以发送邮件。然后再用fputs函数将邮件内容发送给SMTP服务器,最后用“.”结尾表示邮件内容发送结束。如果邮件发送成功,则返回true,否则返回false。
3. 完整的邮件发送代码
根据以上三个步骤,可以得出完整的邮件发送代码:
function send_mail($to, $subject, $message){
$smtp_server = "smtp.qq.com";
$smtp_port = 25;
$smtp_username = "你的QQ邮箱地址";
$smtp_password = "你的QQ邮箱SMTP服务器密码";
$smtp_socket = fsockopen($smtp_server, $smtp_port, $errno, $errstr);
if (!$smtp_socket) {
echo "连接SMTP服务器失败:{$errno}: {$errstr}
";
return false;
}
// 认证
if (preg_match("/^220/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "EHLO {$smtp_server}\r
");
if (preg_match("/^250/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "AUTH LOGIN\r
");
if (preg_match("/^334/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, base64_encode($smtp_username) . "\r
");
if (preg_match("/^334/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, base64_encode($smtp_password) . "\r
");
if (preg_match("/^235/i", fgets($smtp_socket, 1024))) {
echo "认证成功!
";
} else {
echo "认证失败:用户名和密码不匹配!
";
return false;
}
} else {
echo "认证失败:请输入密码!
";
return false;
}
} else {
echo "认证失败:请输入账号!
";
return false;
}
} else {
echo "认证失败:SMTP服务器不支持登录认证!
";
return false;
}
} else {
echo "连接SMTP服务器失败!
";
return false;
}
// 设置发件人和收件人
fputs($smtp_socket, "MAIL FROM:<{$smtp_username}>\r
");
fputs($smtp_socket, "RCPT TO:<{$to}>\r
");
// 设置邮件头部信息
$femail = "From: {$smtp_username}\r
";
$femail .= "To: {$to}\r
";
$femail .= "Subject: {$subject}\r
";
$femail .= "MIME-Version: 1.0\r
";
$femail .= "Content-Type: text/html;charset=utf-8\r
\r
";
$femail .= $message;
// 发送邮件
if (preg_match("/^250/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, "DATA\r
");
if (preg_match("/^354/i", fgets($smtp_socket, 1024))) {
fputs($smtp_socket, $femail."\r
.\r
");
if (preg_match("/^250/i", fgets
