`
gyfmp5
  • 浏览: 96697 次
社区版块
存档分类
最新评论

php发送socket mail

阅读更多

PHP Socket 发送验证<nobr>邮件</nobr>

在php里发送邮件还真有点麻烦,不像Java用JavaMail来发送验证邮件很简单方便((JavaMail 发送验证邮)。PHP里用自带的mail("mailAddress", "the subject", $message);函数无法发送要验证的邮件。这样就没法用免费邮件里的smtp功能来发送邮件,从网上找的例子好像只有利用PHP Socket来完成这个任务。
    这也是网上通用的例子,使用smtp.php class,虽然使用Socket可能有效果问题,但是如果要发送验证的smtp邮件,看来这是比较好的一方法了。

之前从网上也找过很多类似例子,感觉最好的还是smtp.php 类。


smtp.php源代码

<?php
class smtp
{
    /* Public Variables */
    var $smtp_port;
    var $time_out;
    var $host_name;
    var $log_file;
    var $relay_host;
    var $debug;
    var $auth;
    var $user;
    var $pass;

    /* Private Variables */
    var $sock;

    /* Constractor */


    function smtp($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 = "")
    {
        $mail_from = $this->get_address($this->strip_comment($from));
        $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);
        $header = "MIME-Version:1.0\r\n";

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

        if ($cc != "") {
            $header .= "Cc: ".$cc."\r\n";
        }

        $header .= "From: <".$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";
        if($mailtype=="HTML"){
              //$header .= "Content-Type:text/html\r\n"; 
            $header .= "Content-Type:text/html;charset=\"gbk\"\r\n";
            //charset=\"gbk\" 中文
        }
       
       

        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()
    {
        $errno = 0;
        $errstr = "";
        $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)
    {
        $errno=0;
        $errstr="";
        $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
        $MXHOSTS = array();
        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", "\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 (!ereg("^[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 (ereg($comment, $address)) {
            $address = ereg_replace($comment, "", $address);
        }
        return $address;
    }

    function get_address($address)
    {
        $address = ereg_replace("([ \t\r\n])+", "", $address);
        $address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
        return $address;
    }

    function smtp_debug($message)
    {
        if ($this->debug) {
        echo $message;
        }
    }
   
   
}

//调用smtp类发送socket验证邮件

function postmail($to,$subject = "",$body = "", $mailtype){
    $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);


        $smtpserver = "smtp.126.com";                    #SMTP服务器地址
        $smtpserverport =25;                                    #SMTP服务器端口,E-mail是25
        $smtpusermail = "username@126.com";             #SMTP服务器的用户邮箱,这是用126测试
        $smtpemailto = $to;                                        #发送给谁,逗号分隔可以多个       
        $smtpuser = "username";                                    #SMTP服务器的用户帐号
        $smtppass = "password";                            #SMTP服务器的用户密码
        $mailsubject = $subject;                            #邮件标题
        $mailbody = $body;                                        #邮件内容

        $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
        #true 表示使用身份验证,否则不使用身份验证.
       
        $smtp->debug = FALSE;
        #是否显示发送的调试信息
       
        $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
        #调用发送函数

}
?>

调用smtp.php的发送文件,send.php源代码

<?php
require_once("smtp.php");
//引用smtp.php
?>
<?php

$to = "xxx@gmail.com";    #收件人
$subject = "你好php mail test";   #标题
$body = "这是一封来自<a href='http://www.php.net/'>php</a><b> Socket Mail</b>的测试邮件";                          #内容
$mailtype = "HTML";      #邮件类型html or txt

/*
*新建smtp类来发送邮件;
*/
/*
//function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass);
$post = new smtp("smtp.163.com", 25,true,"你的用户名","你的密码");

//function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "");
$post -> sendmail($to, "你的用户名@163.com", $subject, $body, $mailtype, $cc="", $bcc = "", $additional_headers = "");

*/

//直接调用smtp类里的函数postmail发送验证邮件
postmail($to, $subject, $body , $mailtype);
echo "发送成功successful!";


?>
 

分享到:
评论

相关推荐

    php中Socket发送邮件验证邮箱的类.zip

    本压缩包提供的"php中Socket发送邮件验证邮箱的类"正是这样一个工具,它能够帮助开发者实现这一功能。 该类的工作原理是模拟SMTP通信过程,向邮件服务器发起连接请求,通过发送EHLO/HELO命令、验证用户身份(使用...

    php用socket发送邮件

    本资源包含了发送邮件的socket类以及测试文件等等。将mail.class.php文件和sendmail.php文件放在同一目录下。然后运行sendmail.php文件。

    php socket 邮件发送类

    在本场景中,我们关注的是如何使用PHP的Socket功能来发送HTML电子邮件。"php socket邮件发送类"是这样一个工具,它通过SMTP协议与邮件服务器建立连接,从而实现邮件的发送。 SMTP(Simple Mail Transfer Protocol)...

    socket:发送邮件的php类库

    了解如何使用socket发送邮件也能帮助开发者更好地理解和调试邮件发送问题,尤其是在遇到常规邮件函数(如`mail()`)无法解决的情况时。 总的来说,这个PHP类库利用socket功能实现了SMTP邮件发送,为开发者提供了一种...

    socket:发送邮件的php类库.zip

    在这个“socket:发送邮件的php类库”中,开发者提供了一个方便的工具,使得通过PHP发送电子邮件变得更加简单。这个类库可能是封装了SMTP协议,利用PHP的socket功能来与邮件服务器进行交互,完成邮件的发送。 在PHP...

    php中Socket发送邮件验证邮箱的类

    在PHP编程中,使用Socket发送邮件验证邮箱的类是一种实用的技术,它可以帮助开发者验证电子邮件地址是否真实有效,而不仅仅是检查其格式是否正确。Socket通信是网络编程中的基础部分,允许两个应用程序通过网络直接...

    PHP100视频教程 42:PHP通过mail()或Socket发邮件

    1、PHP中发送邮件的方式2、mail函数的使用mail() 函数允许您从脚本中直接发送电子邮件。如果邮件的投递被成功地接收,则返回 true,否则返回 false3、socket方式发送原理使用fsockopen函数打开一个Internet连接这里...

    PHP用socket连接SMTP服务器发送邮件参照.pdf

    【PHP通过Socket连接SMTP服务器发送邮件】 在PHP中,通过Socket连接SMTP服务器发送邮件是一种常见的邮件发送方式。SMTP(Simple Mail Transfer Protocol)是用于在互联网上传输电子邮件的标准协议。以下是一个详细...

    PHP100视频教程42:PHP通过mail()或Socket发邮件.rar

    【PHP100视频教程42】主要涵盖了如何在PHP中使用内置的`mail()`函数以及通过Socket方式发送电子邮件的核心概念和技术。在这个教程中,我们将深入理解这两种方法,以便更好地在PHP应用程序中实现邮件功能。 首先,让...

    PHP100视频教程 42:PHP通过mail()或Socket发邮件.rar

    软件介绍 1、PHP中发送邮件的方式 2、mail函数的使用 mail() 函数允许您从脚本中直接发送电子邮件。 如果邮件的投递被成功地接收,则返回 true,否则返回 false 3、socket方式发送原理 使用fsockopen函数打开一...

    PHP100视频教程 (四十二、PHP通过mail()或Socket发邮件).rar

    软件介绍 1、PHP中发送邮件的方式 2、mail函数的使用 mail() 函数允许您从脚本中直接发送电子邮件。 如果邮件的投递被成功地接收,则返回 true,否则返回 false 3、socket方式发送原理 使用fsockopen函数打开一...

    php发送邮件插件

    查看是否支持sockets(socket 是属于PHP扩展部分),如果显现为“enabled”,那就是支持了。 第三,把文件解压到你的web服务器目录下,调用类就可以了. 首先包含class.phpmailer.php,然后创建对象,设置参数,调用...

    PHPMailer发送邮件 SSL465端口发送邮件

    在IT行业中,PHPMailer是一个广泛使用的PHP库,用于发送电子邮件。由于许多网络服务提供商限制了传统的SMTP端口25,以防止垃圾邮件的传播,因此开发者通常转向使用其他端口,如SSL加密的465端口来发送邮件。本文将...

    使用Socket结合SMTP/POP3邮件协议发送和接收邮件

    本文将深入探讨如何使用Socket编程结合SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)邮件协议来实现这一功能。 首先,SMTP是互联网上用于发送电子邮件的标准协议。它定义了邮件...

    PHP SMTP发送类

    在PHP开发中,SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的标准协议,它允许程序员通过编程方式发送邮件。本文将详细介绍如何使用PHP结合SMTP发送类来实现邮件的发送,并提供一个实际的示例。 ...

    PHP邮件发送类及实例(无需组件支持)

    首先,我们来看`mail.inc.php`这个文件,它通常包含一个名为`Mail`的类,该类封装了邮件发送的相关逻辑。在这个类中,可能会有如下的方法: 1. `__construct()`: 构造函数,可能用于设置SMTP服务器信息、端口号、...

    phpmailer(优秀的php邮件类) V5.1 开源版.rar

    php本身提供了一个邮件发送函数mail,可以在程序中直接发送电子邮件,不过该函数要求服务器支持sendmail或者必须设置一台不需要中继的邮件发送服务器,但现在要找到一台不需要身份验证的邮件发送中继几乎不可能,...

    phpMailer php 发送邮件组件

    1. **SMTP验证**:PHPMailer支持使用SMTP服务器进行邮件发送,这通常比直接通过PHP内置的`mail()`函数更可靠,因为SMTP服务器通常具有更好的邮件传递率。它允许设置SMTP服务器地址、端口、用户名和密码,确保了发送...

    PHP恳求Socket接口测试实例_.docx

    这个实例展示了PHP与Java之间通过Socket进行通信的基本步骤,包括客户端建立连接、发送请求、接收响应,以及服务端监听连接、接受请求、处理数据和发送响应。这样的通信方式在安全性方面需要注意以下几点: 1. 数据...

    PHP文件上传和邮件发送的类

    PHP邮件发送通常通过`mail()`函数实现,但这个函数在某些情况下可能需要配置php.ini,且不支持发送HTML邮件。为了解决这些问题,我们可以使用基于`socket`的邮件发送类,如PHPMailer或者SwiftMailer。这些库通常不...

Global site tag (gtag.js) - Google Analytics