欢迎访问宙启技术站
智能推送

如何使用PHP中的邮件发送函数?

发布时间:2023-06-11 19:58:39

邮件发送是在网站和服务器运行过程中非常频繁的操作,因此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