宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

PHP在线发邮件代码

为解决一些主机空间或服务器上不带发邮件sendmail程序
给大家提供一个亲测可用的在线发邮件小程序,可按自己要求修改

2020.12.7 更新代码,添加发件人名称自定义功能。

注意以下三个文件需要放在同一目录内。

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP利用smtp类发送邮件范例</title>
</head>
<body>
<form action="sendmail.php" method="post">
    <p>收件人:<input type="text" name="toemail" /></p>
    <p>标&nbsp;&nbsp;题:<input type="text" name="title" /></p>
    <p>内&nbsp;&nbsp;容:<textarea name="content" cols="50" rows="5"></textarea></p>
    <p><input type="submit" value="发送"  /></p>
</form>
</body>
</html>

sendmail.php

该文件中可以修改使用的邮箱,推荐使用腾讯QQ邮箱,如果邮件内容里有手机号和QQ号等内容,网易邮箱会自动当做垃圾邮件拦截导致无法发送到目标邮箱。

<?php
header"Content-type: text/html; charset=utf-8");
    require_once "smtp.class.php";
    //******************** 配置信息 ********************************
    $smtpserver = "smtp.qq.com";//SMTP服务器
    $smtpserverport =587;//SMTP服务器端口  465/587
    $smtpusermail = "875001151@qq.com";//SMTP服务器的用户邮箱
    $smtpemailto = $_POST['toemail'];//发送给谁
	$smtpfromname = "风君子博客"; //发件人名称
    $smtpuser = "875001151@qq.com";//SMTP服务器的用户帐号,注:部分邮箱只需@前面的用户名
    $smtppass = "";//SMTP服务器的授权码(网易和QQ邮箱均使用授权码,不是账号登录密码)
    $mailtitle = $_POST['title'];//邮件主题
    $mailcontent = "<h1>".$_POST['content']."</h1>";//邮件内容
    $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件
    //************************ 配置信息 ****************************
    $smtp = new Smtp$smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
    $smtp->debug = false;//是否显示发送的调试信息
	//$state = $smtp->sendmail$smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
	//添加发件人名称
    $state = $smtp->sendmail$smtpemailto, $smtpusermail, $smtpfromname, $mailtitle, $mailcontent, $mailtype);

    echo "<div style='width:300px; margin:36px auto;'>";
    if$state==""){
        echo "对不起,邮件发送失败!请检查邮箱填写是否有误。";
        echo "<a href='index.html'>点此返回</a>";
        exit);
    }
    echo "恭喜!邮件发送成功!!";
    echo "<a href='index.html'>点此返回</a>";
    echo "</div>";

?>


 

smtp.class.php

<?php
/**
 * email smtp (support php7)
 *
 * Modified by: fengjunzi.com 2020.12.7
 * UPDATE:
 * 1、change ereg to preg_match;change ereg_replace to preg_replace.
 * 2、change var to public/private.
 *
 *
 */


class Smtp
{
    /* Public Variables */
    public $smtp_port;

    public $time_out;

    public $host_name;

    public $log_file;

    public $relay_host;

    public $debug;

    public $auth;

    public $user;

    public $pass;

    /* Private Variables */
    private $sock;

    /* Constractor */
    function __construct$relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
    {
        $this->debug = FALSE;

        $this->smtp_port = $smtp_port;

        $this->relay_host = $relay_host;

        $this->time_out = 30; //is used in fsockopen)


        $this->auth = $auth;//auth

        $this->user = $user;

        $this->pass = $pass;


        $this->host_name = "localhost"; //is used in HELO command
        $this->log_file = "";

        $this->sock = FALSE;

    }

    /* Main Function */

    //function sendmail$to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
	//增加自定义发件人名称
	function sendmail$to, $from, $fromname, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
    {

        $mail_from = $this->get_address$this->strip_comment$from));

        $body = preg_replace"/^|\r\n))\.)/", "\1.\3", $body);

        $header = "MIME-Version:1.0\r\n";

        if$mailtype=="HTML"){

            $header .= "Content-Type:text/html\r\n";

        }

        $header .= "To: ".$to."\r\n";

        if $cc != "") {

            $header .= "Cc: ".$cc."\r\n";

        }

        //$header .= "From: $from<".$from.">\r\n";
		
		$header .= "From: $fromname<".$from.">\r\n";

        $header .= "Subject: ".$subject."\r\n";

        $header .= $additional_headers;

        $header .= "Date: ".date"r")."\r\n";

        $header .= "X-Mailer:By Redhat PHP/".phpversion).")\r\n";

        list$msec, $sec) = explode" ", microtime));

        $header .= "Message-ID: <".date"YmdHis", $sec).".".$msec*1000000).".".$mail_from.">\r\n";

        $TO = explode",", $this->strip_comment$to));

        if $cc != "") {

            $TO = array_merge$TO, explode",", $this->strip_comment$cc)));

        }

        if $bcc != "") {

            $TO = array_merge$TO, explode",", $this->strip_comment$bcc)));

        }

        $sent = TRUE;

        foreach $TO as $rcpt_to) {

            $rcpt_to = $this->get_address$rcpt_to);

            if !$this->smtp_sockopen$rcpt_to)) {

                $this->log_write"Error: Cannot send email to ".$rcpt_to."\n");

                $sent = FALSE;

                continue;

            }

            if $this->smtp_send$this->host_name, $mail_from, $rcpt_to, $header, $body)) {

                $this->log_write"E-mail has been sent to <".$rcpt_to.">\n");

            } else {

                $this->log_write"Error: Cannot send email to <".$rcpt_to.">\n");

                $sent = FALSE;

            }

            fclose$this->sock);

            $this->log_write"Disconnected from remote host\n");

        }

        return $sent;

    }

    /* Private Functions */

    function smtp_send$helo, $from, $to, $header, $body = "")
    {

        if !$this->smtp_putcmd"HELO", $helo)) {

            return $this->smtp_error"sending HELO command");

        }

        //auth
        if$this->auth){

            if !$this->smtp_putcmd"AUTH LOGIN", base64_encode$this->user))) {

                return $this->smtp_error"sending HELO command");

            }

            if !$this->smtp_putcmd"", base64_encode$this->pass))) {

                return $this->smtp_error"sending HELO command");

            }

        }


        if !$this->smtp_putcmd"MAIL", "FROM:<".$from.">")) {

            return $this->smtp_error"sending MAIL FROM command");

        }

        if !$this->smtp_putcmd"RCPT", "TO:<".$to.">")) {

            return $this->smtp_error"sending RCPT TO command");

        }

        if !$this->smtp_putcmd"DATA")) {

            return $this->smtp_error"sending DATA command");

        }

        if !$this->smtp_message$header, $body)) {

            return $this->smtp_error"sending message");

        }

        if !$this->smtp_eom)) {

            return $this->smtp_error"sending <CR><LF>.<CR><LF> [EOM]");

        }

        if !$this->smtp_putcmd"QUIT")) {

            return $this->smtp_error"sending QUIT command");

        }

        return TRUE;

    }

    function smtp_sockopen$address)
    {

        if $this->relay_host == "") {

            return $this->smtp_sockopen_mx$address);

        } else {

            return $this->smtp_sockopen_relay);

        }

    }

    function smtp_sockopen_relay)
    {

        $this->log_write"Trying to ".$this->relay_host.":".$this->smtp_port."\n");

        $this->sock = @fsockopen$this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

        if !$this->sock && $this->smtp_ok))) {

            $this->log_write"Error: Cannot connenct to relay host ".$this->relay_host."\n");

            $this->log_write"Error: ".$errstr." ".$errno.")\n");

            return FALSE;

        }

        $this->log_write"Connected to relay host ".$this->relay_host."\n");

        return TRUE;

    }

    function smtp_sockopen_mx$address)
    {

        $domain = preg_replace"/^.+@[^@]+)$/", "\1", $address);

        if !@getmxrr$domain, $MXHOSTS)) {

            $this->log_write"Error: Cannot resolve MX \"".$domain."\"\n");

            return FALSE;

        }


        foreach $MXHOSTS as $host) {

            $this->log_write"Trying to ".$host.":".$this->smtp_port."\n");

            $this->sock = @fsockopen$host, $this->smtp_port, $errno, $errstr, $this->time_out);

            if !$this->sock && $this->smtp_ok))) {

                $this->log_write"Warning: Cannot connect to mx host ".$host."\n");

                $this->log_write"Error: ".$errstr." ".$errno.")\n");

                continue;

            }

            $this->log_write"Connected to mx host ".$host."\n");

            return TRUE;

        }

        $this->log_write"Error: Cannot connect to any mx hosts ".implode", ", $MXHOSTS).")\n");

        return FALSE;

    }

    function smtp_message$header, $body)
    {

        fputs$this->sock, $header."\r\n".$body);

        $this->smtp_debug"> ".str_replace"\r\n", "\r\n"."> ", $header."\n> ".$body."\n> "));

        return TRUE;

    }

    function smtp_eom)
    {

        fputs$this->sock, "\r\n.\r\n");

        $this->smtp_debug". [EOM]\n");

        return $this->smtp_ok);

    }

    function smtp_ok)
    {

        $response = str_replace"\r\n", "", fgets$this->sock, 512));

        $this->smtp_debug$response."\n");

        if !preg_match"/^[23]/", $response)) {

            fputs$this->sock, "QUIT\r\n");

            fgets$this->sock, 512);

            $this->log_write"Error: Remote host returned \"".$response."\"\n");

            return FALSE;

        }

        return TRUE;

    }

    function smtp_putcmd$cmd, $arg = "")
    {

        if $arg != "") {

            if$cmd=="") $cmd = $arg;

            else $cmd = $cmd." ".$arg;

        }

        fputs$this->sock, $cmd."\r\n");

        $this->smtp_debug"> ".$cmd."\n");

        return $this->smtp_ok);

    }

    function smtp_error$string)
    {

        $this->log_write"Error: Error occurred while ".$string.".\n");

        return FALSE;

    }

    function log_write$message)
    {

        $this->smtp_debug$message);

        if $this->log_file == "") {

            return TRUE;

        }

        $message = date"M d H:i:s ").get_current_user)."[".getmypid)."]: ".$message;

        if !@file_exists$this->log_file) || !$fp = @fopen$this->log_file, "a"))) {

            $this->smtp_debug"Warning: Cannot open log file \"".$this->log_file."\"\n");

            return FALSE;

        }

        flock$fp, LOCK_EX);

        fputs$fp, $message);

        fclose$fp);


        return TRUE;

    }


    function strip_comment$address)
    {

        $comment = "/\[^)]*\)/";

        while preg_match$comment, $address)) {

            $address = preg_replace$comment, "", $address);

        }

        return $address;

    }


    function get_address$address)
    {

        $address = preg_replace"/[ \t\r\n])+/", "", $address);

        $address = preg_replace"/^.*<.+)>.*$/", "\1", $address);

        return $address;

    }

    function smtp_debug$message)
    {

        if $this->debug) {

            echo $message;

        }

    }

}

 

本文转自:https://blog.csdn.net/xiaohongIT/article/details/83386947