http://blog.csdn.net/kingerq/archive/2005/08/19/458966.aspx这个就可以。

解决方案 »

  1.   

    不知道smtp.163.com是如何判断的,我没有那里的油箱。通常$from是可以任意指定的,并没有任何问题!
    当然你必须用正确的用正确的油箱地址发信
      

  2.   

    哦?from可以任意指定?以下是我使用smtp.tom.com的DEBUG信息 
    可以看出好像出错是因为from的地址不是tom的用户
    -----------------------------------------------------
    Trying to smtp.tom.com:25
    220 Coremail SMTP(Anti Spam) System (163net[040302])
    Connected to relay host smtp.tom.com
    > HELO localhost
    250 bjapp5
    > AUTH LOGIN aWNlc3ljQHRvbS5jb20=
    334 UGFzc3dvcmQ6
    > Zm9ybWF0
    235 Authentication successful
    > MAIL FROM:<[email protected]>
    550 <[email protected]>: Invalid User
    Error: Remote host returned "550 <[email protected]>: Invalid User"
    Error: Error occurred while sending MAIL FROM command.
    Error: Cannot send email to <[email protected]>
    Disconnected from remote host
      

  3.   

    <?php
    class CLEmail {
        //---设置全局变量
        var $mailTo = ""; // 收件人
        var $mailCC = ""; // 抄送
        var $mailBCC = ""; // 秘密抄送
        var $mailFrom = ""; // 发件人
        var $mailSubject = ""; // 主题
        var $mailText = ""; // 文本格式的信件主体
        var $mailHTML = ""; // html格式的信件主体    // 用SOCKET方式发送时参数
        var $smtp_server = "smtp.163.com";
        var $smtp_port = "25";
        var $smtp_user = "username";
        var $smtp_pin = "password";    /*
        setTo($inAddress) :检测收件人的地址
        $inAddress : email地址,使用逗号来分割多个邮件地址
        */
        function setTo($inAddress) {
            $addressArray = explode( ",",$inAddress);
            for($i=0;$i<count($addressArray);$i++) {
                if($this->checkEmail($addressArray[$i])==false)
                    return false;
            }
            $this->mailTo = implode($addressArray, ",");
            return true;
        }
        /*
        setCC($inAddress) :检测抄送的地址
        $inAddress : email地址,使用逗号来分割多个邮件地址
        */
        function setCC($inAddress) {
            $addressArray = explode( ",",$inAddress);
            for($i=0;$i<count($addressArray);$i++) {
                if($this->checkEmail($addressArray[$i])==false)
                    return false;
            }
            $this->mailCC = implode($addressArray, ",");
            return true;
        }
        /*
        setBCC($inAddress) :检测暗送的地址
        $inAddress : email地址,使用逗号来分割多个邮件地址
        */
        function setBCC($inAddress) {
            $addressArray = explode( ",",$inAddress);
            for($i=0;$i<count($addressArray);$i++) {
                if($this->checkEmail($addressArray[$i])==false)
                    return false;
            }
            $this->mailBCC = implode($addressArray, ",");
            return true;
        }
        /*
        setFrom($inAddress) :检测发件人的地址
        $inAddress : 发件人的EMAIL地址
        */
        function setFrom($inAddress) {
            if($this->checkEmail($inAddress)) {
                $this->mailFrom = $inAddress;
                return true;
            }
            return false;
        }    function setSubject($inSubject) {
            if(strlen(trim($inSubject)) > 0) {
                $this->mailSubject = ereg_replace( "n", "",$inSubject);
                return true;
            }
            return false;
        }    function setText($inText) {
            if(strlen(trim($inText)) > 0) {
                $this->mailText = $inText;
                return true;
            }
            return false;
        }
        /*
        setHTML($inHTML): 设置html格式的邮件主体参数$inHTML为html格式,
        默认返回值为true
        */
        function setHTML($inHTML) {
            if(strlen(trim($inHTML)) > 0) {
                $this->mailHTML = $inHTML;
                return true;
            }
            return false;
        }
        /*
        checkEmail($inAddress) :检查email地址的合法性
        */
        function checkEmail($inAddress) {
            return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
        }
        /*
         getRandomBoundary($offset): 返回一个随机的边界值
         $offset 为整数 – 用于多管道的调用 返回一个md5()编码的字串
        */
        function getRandomBoundary($offset = 0) {
            //--随机数生成
            srand(time()+$offset);
            //--返回 md5 编码的32位 字符长度的字串
            return ( "----".(md5(rand())));
        }
         /*
        formatTextHeader: 文本内容加上text的文件头
        */
        function formatTextHeader() {
            $outTextHeader = "";
            $outTextHeader .= "Content-Type: text/plain;
                              charset=us-asciin";
            $outTextHeader .= "Content-Transfer-Encoding: 7bitnn";
            $outTextHeader .= $this->mailText. "n";
            return $outTextHeader;
        }
        /*
        formatHTMLHeader(): 邮件主体内容加上html的文件头
        */
        function formatHTMLHeader() {
            $outHTMLHeader = "";
            $outHTMLHeader .= "Content-Type: text/html;
                              charset=us-asciin";
            $outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn";
            $outHTMLHeader .= $this->mailHTML. "n";
            return $outHTMLHeader;
        }
        /*
        send(): 用于发送邮件,发送成功返回值为true
        */
        function send() {
            //--设置邮件头为空
            $mailHeader = "";
            //--添加抄送人
            if($this->mailCC != "")
                $mailHeader .= "CC: ".$this->mailCC. "n";
            //--添加秘密抄送人
            if($this->mailBCC != "")
                $mailHeader .= "BCC: ".$this->mailBCC. "n";
            //--添加发件人
            if($this->mailFrom != "")
                $mailHeader .= "FROM: ".$this->mailFrom. "n";
            //---------------------------邮件格式------------------------------
            //--文本格式
            if($this->mailText != "" && $this->mailHTML == "") {
                return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
            }
            //--html或text格式
            else if($this->mailHTML != "") {
                $bodyBoundary = $this->getRandomBoundary();
                //$textHeader = $this->formatTextHeader();
                $htmlHeader = $this->formatHTMLHeader();
                //--设置 MIME-版本
                $mailHeader .= "MIME-Version: 1.0n";
                $mailHeader .= "Content-Type: multipart/alternative;n";
                $mailHeader .= ' boundary="'.$bodyBoundary. '"';
                $mailHeader .= "nnn";
                //--添加邮件主体和边界
                //$mailHeader .= "--".$bodyBoundary. "n";
                //$mailHeader .= $textHeader;
                //$mailHeader .= "--".$bodyBoundary. "n";
                //--添加html标签
                $mailHeader .= $htmlHeader;
                $mailHeader .= "n--".$bodyBoundary. "--";
                //--发送邮件
                return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
            }
            return false;
        }    //设置SOCKET 发送参数
        function setSmtp($smtp_server, $smtp_port, $smtp_user = '', $smtp_pin = '') {
      $this->smtp_server = $smtp_server;
      $this->smtp_port = $smtp_port;
      $this->smtp_user = $smtp_user;
      $this->smtp_pin = $smtp_pin;
        }    //用SOCKET 方式发送,只支持文本方式
        function sendSocket() {
      // open socket
      $fp = @fsockopen($this->smtp_server, $this->smtp_port, $errno, $errstr, 30);
      if(!$fp)   return false;   @fputs($fp, 'Helo ,SOCKET-Mailer\r\n');   if(!empty($this->smtp_user)) {
     @fputs($fp, 'AUTH LOGIN' . CRLF);
     @fputs($fp,  base64_encode($this->smtp_user) . "\r\n");
     @fputs($fp,  base64_encode($this->smtp_pin) . "\r\n");
       }   @fputs($fp, 'Mail from: ' . $this->mailFrom . "\r\n");
       @fputs($fp, 'Rcpt to:' . $this->mailTo . "\r\n");
      @fputs($fp, 'data\r\n');      @fputs($fp, 'To: ' . $this->mailTo . "\r\n");
      @fputs($fp, 'From: '. $this->mailFrom . "\r\n");
      @fputs($fp, 'subject: ' . $this->subject . "\r\n");
      @fputs($fp, $this->mailText . "\r\n.\r\n");   @fputs($fp, 'Quit\r\n');      return true;
       }
    }
    ?>
      

  4.   

    [email protected]
    你这个邮箱是对的吧?
    收一下
      

  5.   

    你用126.com的邮箱或者21cn的邮箱发,
    一般都成功的。
    要身份验证
      

  6.   

    发是能发成功,我想改变From的email...
      

  7.   

    应该是tom的限制,大概是为了防止把位于tom的邮件服务器作为SPAM发送点并伪装一个良好的from。
      

  8.   

    干吗,你想发垃圾邮件呀,呵呵~~~ -_-#这个跟ISP的邮件服务器有关,比如163的是使用coremail的邮件服务器,那么它会识别你的FROM是否是本地的服务,否则你随便指定FROM,那么以后别人都把163的邮箱的IP当作垃圾邮件服务器,拿它不是惨了。解决办法:
    1。找一个网络上免费提供的中转代理,或者自己拿一个扫描器扫一些开发25端口,并且没有验证的。
    2。自己随便架设一个邮件服务器,比如装完Linux默认都有sendmail,当然,你也可以自己安装Qmail或者Postfix了。一般再本地来发那样就可以随意指定FROM地址了。这个我测试过,使用sendmail可以随便指定FROM地址,当然,你不要发送的太频繁,否则会被列入垃圾邮件服务器列表就惨了。
    另外,采用这种方法的话,对sina不管用,因为sina具有反向DNS追踪,就是说,如果你的FROM地址跟你的发送IP不相符的话,它会拒收你的邮件,其他ISP的没有问题。
      

  9.   

    多谢黑夜路人,难道SMTP有身份验证的都会检查FROM是否为本地的用户?
    如果是那样只有找没有验证的或者自自己架邮件服务器了。
      

  10.   

    sina/hotmail应该都需要通过邮件服务器发送才可以顺利接受
    正如黑夜路人所述