今天需要使用php发送邮件,但是使用自带的mail()函数提示发送成功,但始终无法接收到邮件,于是自己动手写了一个.
代码很少,我使用的163的免费企业邮箱,测试发送给QQ,163都没问题
/**
 * @param string $to 邮件接收人
 * @param string $nickname 接收人昵称
 * @param string $subject 邮件主题
 * @param string $body 邮件主题
 * @param string $hostname 发送人昵称
 * @param string $username 发送服务器用户名
 * @param string $password 发送服务器密码
 * @param string $smtpHost 发送服务器
 * @param int $smtpPort smtp端口
 * @return string
 */
function sendmail($to, $nickname, $subject, $body, $hostname, $username, $password, $smtpHost, $smtpPort = 25)
{
    $lb = "\r\n";

    $smtp = [
// EHLO是ESMTP,带有身份验证
        'EHLO ' . $hostname,
// 准备登录
        'AUTH LOGIN',
// 登录用户名,base64编码
        base64_encode($username),
// 登录密码,base64编码
        base64_encode($password),
// 邮件发送者
        'MAIL FROM: <' . $username . '>',
// 邮件接收者
        'RCPT TO: <' . $to . '>',
// 开始发送数据DATA
        'DATA',
// 显示发信人友好名称
        'From: ' . $hostname . ' <' . $username . '>',
// 显示接收人友好昵称
        'To: ' . $nickname . ' <' . $to . '>',
// 邮件主题
        'Subject: ' . $subject,
// 邮件类型
        'Content-Type: text/html; charset=UTF-8',
// 邮件编码方式
        'Content-Transfer-Encoding: base64',
// 发送空行表示header结束
        '',
// 发送邮件内容,base64编码
        base64_encode($body),
// 发送.表示结束邮件
        '.',
// 退出
        'QUIT'
    ];

    try {

        $fp = fsockopen($smtpHost, $smtpPort);

        foreach ($smtp as $value) {

            fputs($fp, $value . $lb);

        }

        fclose($fp);

    } catch (\Exception $exception){

        return '邮件发送失败: ' . $exception->getMessage();

    }

    return '邮件发送成功';
}

标签: none

添加新评论