前几天正好需要用mail()函数定时向一个网管邮箱发邮件!就研究了下!贴出来看看你有没有用!
是windows下实现的,linux下要还没研究...<?php
/*
实现在windows下利用mail()发送电子邮件1、发送邮件系统要有SMTP服务。在“windows Server 2003”下安装“SMTP Service”组件:
A、“添加删除Windows组件”->“应用程序服务器”->“Internet 信息服务(IIS)”点击“详细信息”。
B、选择“SMTP Service”进行安装。
2、对SMTP进行设置:
A、打开“Internet 信息服务(IIS)管理器”,找到“默认 SMTP虚拟服务器”。
B、在该服务上单击右键选择“属性”。
C、在弹出的“默认 SMTP虚拟服务器 属性”框内点选“访问”表项,选择“身份验证”按钮。
D、在弹出的“身份验证”框内只选择“匿名访问”其它都不选。
E、回到“访问”表项,选择“中继”按钮,在弹出的“中继限制”框内单击“添加”按钮,添加127.0.0.1的IP地址。
3、修改“php.ini”:
------------------------------
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25; For Win32 only.
sendmail_from = [email protected]
------------------------------
4、运行本程序,登陆“$toaddress”所示邮箱查看邮件。*/
$toaddress = '[email protected]';
$subjects = 'test the php mail';
$mailcontent = 'Onlu test the php mail!';
$fromaddress = 'From: [email protected]';
mail($toaddress,$subjects,$mailcontent,$fromaddress);
?>

解决方案 »

  1.   

    我有几个问题想请教
    (1)sendmail_from = [email protected] 这个邮箱是系统默认的吗,还是你申请的?
    (2)$toaddress = '[email protected]'; 这个邮箱是接受方的邮箱,那我是163.com,直接在这写就行了吗?不是说需要验证的吗?你那个邮箱不需要验证吗?我现在php代码:
    =====================================================
    <?php
    $toaddress = '[email protected]'; 
    $subjects = 'test the php mail'; 
    $mailcontent = 'Onlu test the php mail!'; 
    $fromaddress = 'From: [email protected]'; 
    $yes=mail($toaddress,$subjects,$mailcontent,$fromaddress); 
    if ($yes) {
    echo "yes";
    }
    else 
    {echo "error";}
    ?>
    ======================================================
    执行时,页面能显示yes。但'[email protected]'邮箱没收到任何信息。为什么
    ================================================================
    php.ini内容如下:
    ===============================mail function]
    ; For Win32 only.
    SMTP =localhost
    smtp_port = 25; For Win32 only.
    sendmail_from [email protected] ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
    sendmail_path =C:\WINDOWS\system32\
      

  2.   

    (1)sendmail_from = [email protected] 这个邮箱是系统默认的吗,还是你申请的? 
    答:不是我申请的,php.ini里默认就是这个.当目标邮箱收到邮件后看到的发送方是$fromaddress = 'From: [email protected]';里的邮箱地址.(2)$toaddress = '[email protected]'; 这个邮箱是接受方的邮箱,那我是163.com,直接在这写就行了吗?不是说需要验证的吗?你那个邮箱不需要验证吗? 
    答:'[email protected]'换成你要发送的目标邮箱.
    mail()函数需要SMTP服务,也就是说你的PHP程序所在的服务器要有SMTP服务!你先要搞清楚发邮件和收邮件都是什么服务在起作用!
    发邮件(SMTP)收邮件(POP3),收邮件不需要验证,发邮件才需要.我提供的程序我自己在用,可以发邮件没问题!
    你在PHP.ini里加了个;
     For Unix only.  You may supply arguments as well (default: "sendmail -t -i"). 
    sendmail_path =C:\WINDOWS\system32\ 那你就要装sendmail,这个我没试过不知道,你可以自己实验下!我用的windows2003自带的SMTP服务实现的!
      

  3.   

    下载一个邮件发送类phpmailer,如果服务器支持mail则可以用mail,不支持可以用smtp方式,不管是windows或者linux下,smtp方式都可以的,邮件发送的代码很简单,关键要看服务器的配置了,如果服务器本身都发不了邮件mail函数肯定没用了
      

  4.   

    PHP通过SMTP发送,必须是支持匿名的~现在这样的邮箱已经不多了~我就知道 https://www.cia.com/ 太提供这样的邮箱~不过不太好申请!一般写好的类都是通过SOCKET的方法发送的....
      

  5.   

    3楼的我还有问题请教(1)你的$fromaddress='From: [email protected]'是什么邮箱阿,默认的吗,用它发信不需要验证吗?
    那我要用163邮箱发肯定需要验证的,你的不需要吗?
    (2)如果php.ini的sendmail_path =C:\WINDOWS\system32\  被屏蔽到后就会报以下错误:Warning: mail() [function.mail]: Failed to connect to mailserver at "mail.csage.cn" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\yes.php on line 7
    我是windowsxp系统,用你给我的测试的。那你这行屏蔽了,报错吗?我也是用系统自带的smtp服务
     
      

  6.   

    我还想问
    <?php
    $toaddress = '[email protected]'; 
    $subjects = 'test the php mail'; 
    $mailcontent = 'Onlu test the php mail!'; 
    $fromaddress = 'From: [email protected]'; 
    $panduan=mail($toaddress,$subjects,$mailcontent,$fromaddress); 
    if($panduan)
    {echo "ok";}
    else
    {echo "error";}
    ?> 
    如果页面显示ok的话是不是可以说明本地smtp服务已经配置成功了!
    有什么办法可以判断本地smtp服务是否配置成功!
      

  7.   

    我知道了,有的邮箱可以接到邮件了。
    那为什么往163.com和sina发信时,报以下错:
    Warning: mail() [function.mail]: SMTP server response: 553 This target address is not our MX service client. in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\yes.php on line 7
      

  8.   

    使用zend framework中的zend_mail()类进行发送.稳定.
      

  9.   

    经过检验的。
    嘿嘿。
    <?
    #################################################
    # 此函数可以发简单的邮件,三个参数:邮箱地址,标题,内容#
    #################################################
    function send_mail($to, $subject = 'No subject', $body) {
            $loc_host = "localhost";            //发信计算机名,可随意
            $smtp_acc = "[email protected]"; //Smtp认证的用户名,类似[email protected],或者fuweng
            $smtp_pass="passwd";          //Smtp认证的密码,一般等同pop3密码
            $smtp_host="smtp.163.com";    //SMTP服务器地址,类似 smtp.tom.com
            [email protected]";       //发信人Email地址,你的发信信箱地址
        $headers = "Content-Type: text/plain; charset=\"gb2312\"\r\nContent-Transfer-Encoding: base64";
        $lb="\r\n";                    //linebreak
            $hdr = explode($lb,$headers);     //解析后的hdr
        if($body) {$bdy = preg_replace("/^\./","..",explode($lb,$body));}//解析后的Body        $smtp = array(
                    //1、EHLO,期待返回220或者250
                    array("EHLO ".$loc_host.$lb,"220,250","HELO error: "),
                    //2、发送Auth Login,期待返回334
                    array("AUTH LOGIN".$lb,"334","AUTH error:"),
                    //3、发送经过Base64编码的用户名,期待返回334
                    array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "),
                    //4、发送经过Base64编码的密码,期待返回235
                    array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : "));
            //5、发送Mail From,期待返回250
            $smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: ");
            //6、发送Rcpt To。期待返回250
            $smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: ");
            //7、发送DATA,期待返回354
            $smtp[] = array("DATA".$lb,"354","DATA error: ");
            //8.0、发送From
            $smtp[] = array("From: ".$from.$lb,"","");
            //8.2、发送To
            $smtp[] = array("To: ".$to.$lb,"","");
            //8.1、发送标题
            $smtp[] = array("Subject: ".$subject.$lb,"","");
            //8.3、发送其他Header内容
            foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");}
            //8.4、发送一个空行,结束Header发送
            $smtp[] = array($lb,"","");
            //8.5、发送信件主体
            if($bdy) {foreach($bdy as $b) {$smtp[] = array(base64_encode($b.$lb).$lb,"","");}}
            //9、发送“.”表示信件结束,期待返回250
            $smtp[] = array(".".$lb,"250","DATA(end)error: ");
            //10、发送Quit,退出,期待返回221
            $smtp[] = array("QUIT".$lb,"221","QUIT error: ");        //打开smtp服务器端口
            $fp = @fsockopen($smtp_host, 25);
            if (!$fp) echo "Error: Cannot conect to ".$smtp_host."
    ";
            while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }}
            $result_str="";
            //发送smtp数组中的命令/数据
            foreach($smtp as $req){
                    //发送信息
                    @fputs($fp, $req[0]);
                    //如果需要接收服务器返回信息,则
                    if($req[1]){
                            //接收信息
                            while($result = @fgets($fp, 1024)){
                                    if(substr($result,3,1) == " ") { break; }
                            };
                            if (!strstr($req[1],substr($result,0,3))){
                                    $result_str.=$req[2].$result."
    ";
                            }
                    }
            }
            //关闭连接
            @fclose($fp);
            return $result_str;
    }
    //send_mail("[email protected]","hello","huizi");    //直接调用函数
    ?> 
      

  10.   

    10楼,你的这段代码由本地smtp服务还是另下一个服务器
      

  11.   

    楼主去 管理工具->服务 看下你安装的STMP server是否启动 就知道了 显示(ok)也是对的。 
    还有 $to 是填你自己的邮箱。