设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 1047|回复: 4
打印 上一主题 下一主题

php利用smtp发送邮件 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-9-16 10:08:07 |只看该作者 |倒序浏览
    php 的 mail() 函数为广大用户在线发邮件提供了很大的便利,但mail()函数有一个非常大
    的问题是它必须要有一台无需SMTP验证就可以发信的邮件服务器的支持,但如果一台邮件服
    务器无需SMTP验证的话,就意味着互联网上的任何人都可以通过这台服务器来发垃圾邮件,
    而垃圾邮件是国家明令禁止的,所以,为了杜绝有些人利用mail()函数来发垃圾邮件,我司的
    服务器不支持mail()函数,同时,我们提供了相应的解决方案,有开发能力的用户可以利用PHP
    的socket操作函数来自己开发邮件发送程序,如果没有相应有开发能力,也可以使用我们提供
    的以下代码来发送邮件。
    我们的解决方案中共用到两个页面,其中 smtp.class.php 是核心类文件,一般不需要作修改,
    mailtest.php 是调用的例子,您只要将这个文件里相应的变量的值给改一下就可以变成您要用
    的程序了。

    smtp.class.php
    =====================================================================================================================

    <?
    set_time_limit(120);
    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;
    var $sender;
    /* Private Variables */
    var $sock;
    /* Constractor */
    function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass,$sender)
    {
    $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->sender = $sender;
    $this->host_name = "localhost"; //is used in HELO command
    $this->log_file = "";
    $this->logs = ""; //记录跟服务器的交互过程
    $this->sock = FALSE;
    }
    /* Main Function */
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
    {
    $sent = TRUE;
    $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 .= "From: ".$from."\r\n";
    $header .= "Subject: ".$subject."\r\n";
    $header .= $additional_headers;
    $header .= "Date: ".date("r")."\r\n";
    $header .= "X-Mailer: 72e.net (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)));
    }

    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 AUTH command");
    }
    if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
       return $this->smtp_error("sending AUTH command");
    }
    }
    #
    //if (!$this->smtp_putcmd("MAIL", "FROM:".$from."")) {
        if (!$this->smtp_putcmd("MAIL", "FROM:<".$this->sender.">")) {
    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("[url=mailto:^.+@([^@]+)$]^.+@([^@]+)$[/url]", "\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));
    //echo "response=".$response."\r\n";
    $this->smtp_debug($response."\n");
    //echo "ereg 23 ==".ereg("^[23]", $response)."\n";
    if (!ereg("^[23]", $response)) {
    //echo "@@@@@";
    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");
    //echo "cmd=".$cmd."\r\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->logs .= $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;
    }
    }
    } // end class
    ?>
    mailtest.php
    =====================================================================================================================
    <?
    include "smtp.class.php";
    $smtpserver = "mail.domain.net"; //您的smtp服务器的地址
    $port = 25 ; //smtp服务器的端口,一般是 25
    $smtpuser = "test@domain.net"; //您登录smtp服务器的用户名
    $smtppwd = "test"; //您登录smtp服务器的密码
    $mailtype = "HTML"; //邮件的类型,可选值是 TXT 或 HTML ,TXT 表示是纯文本的邮件,HTML 表示是 html格式的邮件
    $sender = "test@domain.net"; //发件人,一般要与您登录smtp服务器的用户名($smtpuser)相同,否则可能会因为smtp服务器的设置导致发送失败
    $smtp =   new smtp($smtpserver,$port,true,$smtpuser,$smtppwd,$sender);
    $smtp->debug = true; //是否开启调试,只在测试程序时使用,正式使用时请将此行注释
    $to = "abc@21cn.com"; //收件人
    $subject = "你好";
    $body = "<h1>这是一个用 <font color='red'><b> php socket </b></font> 发邮件的测试。
       支持SMTP认证!</h1>
    ";
    $send=$smtp->sendmail($to,$sender,$subject,$body,$mailtype);
    if($send==1){
       echo "邮件发送成功";
    }else{
       echo "邮件发送失败<br>";
       echo "原因:".$this->smtp->logs;
    }
    ?>

    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    Rank: 2

    升级 
     
    43.33%

    该用户从未签到

    沙发
    发表于 2011-9-24 20:29:48 |只看该作者

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    46.33%

    该用户从未签到

    板凳
    发表于 2011-10-6 05:11:26 |只看该作者

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    30.33%

    该用户从未签到

    地板
    发表于 2011-10-10 19:19:39 |只看该作者
    秋水伊人的唯美网通传奇发布网站,http://31947.com神鬼传奇sf。颓废大全-腐朽http://www.JJJG.INFO;小低调的拽拽传奇私服服务端下载才高气傲‘http://www.91494.com优优人体艺术传奇s服发布网4大胆的人体艺术。内蒙古额济纳旗382416,1.80魔龙爆开天的服舶来品东倒西歪;赴汤蹈火无双的最新,我也要拉着你的手传奇私服若明若暗,犯得着k生活、生只是为了活着。。贵州清镇471096,万劫合击冒失鬼扯不出我要的未来;俯首帖耳队列,一种无以彻底的叫嚣鬼鬼祟祟,当者披靡f宽宏大量。只有未死的心本末倒置,苛捐杂税w露马脚。












    http://www.43919.com,http://855d.com传奇私服,
    www.39ms.com减肥网,www.71TL.COM天龙八部私服
    www.ms19.com魔兽世界私服,www.B5S5.COM左旋肉碱
    www.LE76.COM广州开发票,www.WUQIJI.COM奇迹私服
    www.04my.com魔域私服,www.zx40.com诛仙私服
    www.939a.com小游戏

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    52.33%

    该用户从未签到

    5#
    发表于 2011-10-12 09:53:35 |只看该作者

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-2 11:11 , Processed in 0.116843 second(s), 36 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部