PHP一个发送邮件的类

  现在很多主机空间都是IIS上执行PHP程序,大多不能直接用mail()发送邮件,有了这个类只要你有注册过邮箱,就可以随意的发送邮件,速度也不慢哦。

//******************************
// 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";

        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 .= "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 = ereg_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", "\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;

        }

    }

}

?>

//*****************************************************************
// *.php 使用文件,看清楚了,怎么使用在这里
//
//*****************************************************************

<?

require (FILE_DIR."smtp.php");

$smtpserver = "smtp.xxx.com";//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = "xxxxx@xxx.com";//SMTP服务器的用户邮箱

$smtpemailto = "aaaaa@xxx.com";//发送给谁

$smtpuser = "xxxxx";//SMTP服务器的用户帐号

$smtppass = "xxxxx";//SMTP服务器的用户密码

$mailsubject = "Test Subject";//邮件主题

$mailbody = "<h1>This is a test mail</h1>";//邮件内容

$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>

时间: 2024-08-02 03:28:29

PHP一个发送邮件的类的相关文章

php编写的一个E-mail验证类

 这篇文章主要介绍了php编写的一个E-mail验证类的用法,非常的简单实用,需要的小伙伴参考下,可以直接拿走使用.     这个类可以用来检查电子邮件是否有效使用SMTP协议. 它可以连接到由地址的域名来验证的MX记录中定义的SMTP服务器. 并且模拟消息的传递,以查看是否在给定的收件人地址被接受为有效. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE HTML PUBLIC "-

一个浏览器检查类

浏览器 一个浏览器检查类 <?php//原作者:epsilon7//SonyMusic(sonymusic@163.net)class BrowserDetector  {    var $UA =  "";    //$HTTP_USER_AGENT的内容    var $BROWSER=  "Unknown";    //浏览器类型    var $PLATFORM   =  "Unknown";    //操作系统    var $V

创建一个ASP分页类(一)文章部分

创建|分页 创建一个ASP通用分页类 平波 从开始学习到使用ASP到现在也写了不少程序了,最令人头痛的是写数据分页,每次都是由于几个变量名或几个参数的不同,因而需要每次都写哪一段冗长而又繁杂的分页代码,代码长了使得程序的可读性变差,容易出差,调试半天也找不出错在哪里,所以慢慢的我开始使用一些网上的提供的分页函数或分页类.的确省事不少,但是通常的函数和类的做法都是就数据显示部分也封装了起来,每次为了达到自己需要的显求效果要去改动函数或者类的本身,所以使用起来也不是怎么方便,自己写的分页改起来已经够

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

JavaScript实现的一个倒计时的类

 这篇文章主要介绍了JavaScript实现的一个倒计时的类,本文直接给出demo代码,需要的朋友可以参考下     近期在做排列五的彩票项目,每一期都有购彩时段,即用户打开这个排列五的页面时,会从服务器传来一个remaintime(离本次彩期结束的剩余时间),然后这个时间在客户端递减呈现给用户看,让用户获得本次彩期的剩余时间. 实现原理挺简单的,在此不在赘述,运行以下代码查看demo: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2

flex-写了一个as的类,运行的时候总是提示 Context3D不可用,网上的方法也不行

问题描述 写了一个as的类,运行的时候总是提示 Context3D不可用,网上的方法也不行 解决方案 网上说在XX-app.xml里面加一句gpu,可是我没有这个文件啊,新手求助啊 解决方案二: 写了一个Tip类(AS)

服务器-Android如何在一个异步任务类结束时再次开启一个异步任务类

问题描述 Android如何在一个异步任务类结束时再次开启一个异步任务类 本人Android新手,在学习中遇到了一个难题,希望大神给我一点启发,问题是这样的,我从服务器获取JSON数据进行解析,在onPostExecute中获取了一个图片的URL,当我在onPostExecute进行图片的读取时程序报错,查找了一些资料,说需要在onPostExecute里发送一个消息在开启一个任务类,请问大神,该怎么在onPostExecute里发送一个消息通知线程开启任务类呢? 解决方案 直接在onPostE

box-类与对象 定义一个Box(盒子)类,

问题描述 类与对象 定义一个Box(盒子)类, 定义一个Box(盒子)类,成员变量: length(长).width(宽)和height(高) 默认值均为0:成员方法: 构造方法Box()有三个参数,设置盒子长.宽和高三个合理的初始数据(正数):方法getVolume()没有参数,计算并返回盒子的体积,方法getArea()没有参数,计算并返回盒子的表面积,方法setEdge()有三个参数,用于修改三条边长.定义TestBox类,在其main()方法中创建Box对象b,长宽高分别为3.4.5,求

框架-自己写一个 小型字符串类

问题描述 自己写一个 小型字符串类 C++标准库提供了一个功能强大的String类来实现字符串的操作,本系统创建一个功能类似"String类"的小型字符串类,以实现类似的字符处理功能. 希望大神能给个思路,基本框架. 解决方案 参考:http://wenku.baidu.com/link?url=7xK4vuZ4bKFHpVHQryrkeFQQQLg6TjxUDopT-g-IuRTuqmZTKaZO5vkDWPd9SUm7-LRsL-SliVNuGgPuaUmLyub7kLIwKzb3