zoukankan      html  css  js  c++  java
  • 夹缝中求生存-在一无所有的php虚拟主机环境下利用smtp发送邮件(一)

    夹缝中求生存

    利用php虚拟主机向指定QQ邮箱账户发送一份电子邮件,以163邮箱为例。

    前言:在阿里云虚拟主机php的苛刻环境下,php函数库少的可怜,各种不支持,想要发送一份不被收件邮箱屏蔽的邮件,顿时感觉整个世界都黑暗了,不过还好,在夹缝中求生存,踩过了各种坑,最后还是有解决之道的。

    • 首先得注册163个人邮箱账号,配置SMTP并设置授权密码(此部分不再赘述,如有疑问请自行百度)。
    • 几点提醒:
      • 邮件发送成功却未收到邮件提醒:发送的邮件可能被放到了垃圾箱,尤其是注意账户为QQ邮箱的收件人。
      • 邮件内容不要太多,否则很有可能会被当成垃圾邮件处理(亲测发送整段html代码邮件会被QQ收件邮箱会屏蔽拒收邮件,而163收件邮箱会正常接收邮件),尤其是注意账户为QQ邮箱的收件人。
      • 以下是以163邮箱配置smpt,亲测代码可用,其他邮箱配置smpt未作尝试。
      • 已解决自定义发件人,代码中已写明。
      • 未解决当收件邮箱为QQ邮箱时,邮件会被QQ邮箱当作垃圾邮件处理的问题。
    • 以下是php代码:

    test.php

     1 <?php
     2 header("Content-Type: text/html; charset=utf-8");
     3 
     4 //引入发送邮件类
     5 require("smtp.php");
     6 //使用163邮箱服务器
     7 $smtpserver = "smtp.163.com";
     8 //163邮箱服务器端口
     9 $smtpserverport = 25;
    10 //你的163服务器邮箱账号
    11 $smtpusermail = "****@163.com";//
    12 //收件人邮箱,***@163.com/***@qq.com
    13 $smtpemailto = "707490440@qq.com";
    14 //发送人,可随意显示发件人
    15 $sender = "邮件发送方";
    16 //你的邮箱账号(去掉@163.com)
    17 $smtpuser = "****";//你的163邮箱去掉后面的163.com
    18 //你的邮箱密码
    19 $smtppass = "*****"; //你的163邮箱SMTP的授权码,千万不要填密码!!!
    20 
    21 //邮件主题
    22 $mailsubject = "邮件提醒";
    23 //邮件内容
    24 $mailbody = "
    25 详细信息:</br>
    26 <h1>这是一封测试邮件</h1>
    27 ";
    28 //邮件格式(HTML/TXT),TXT为文本邮件
    29 $mailtype = "HTML";
    30 //这里面的一个true是表示使用身份验证,否则不使用身份验证.
    31 $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
    32 //是否显示发送的调试信息
    33 $smtp->debug = TRUE;
    34 //发送邮件
    35 $smtp->sendmail($smtpemailto, $smtpusermail, $sender ,$mailsubject, $mailbody, $mailtype);
    36   
    37 ?>

    smtp.php

      1 <?php
      2 header("Content-Type: text/html; charset=utf-8");
      3   
      4 class smtp
      5 {
      6  /* Public Variables */
      7  var $smtp_port;
      8  var $time_out;
      9  var $host_name;
     10  var $log_file;
     11  var $relay_host;
     12  var $debug;
     13  var $auth;
     14  var $user;
     15  var $pass;
     16   
     17  /* Private Variables */
     18  var $sock;
     19   
     20  /* Constractor */
     21  function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
     22  {
     23   $this->debug = FALSE;
     24   $this->smtp_port = $smtp_port;
     25   $this->relay_host = $relay_host;
     26   $this->time_out = 30; //is used in fsockopen()
     27   $this->auth = $auth;//auth
     28   $this->user = $user;
     29   $this->pass = $pass;
     30   $this->host_name = "localhost"; //is used in HELO command
     31   $this->log_file = "";
     32   $this->sock = FALSE;
     33 }
     34   
     35  /* Main Function */
     36  function sendmail($to, $from, $sender, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
     37  {
     38   $mail_from = $this->get_address($this->strip_comment($from));
     39   $body = preg_replace("/(^|(
    ))(.)/", "1.3", $body);
     40   $header = "MIME-Version:1.0
    ";
     41   if($mailtype=="HTML")
     42   {
     43    $header .= "Content-Type:text/html
    ";
     44   }
     45   $header .= "To: ".$to."
    ";
     46   if ($cc != "")
     47   {
     48    $header .= "Cc: ".$cc."
    ";
     49   }
     50   $header .= "From: ".$sender."<".$from.">
    ";
     51   $header .= "Subject: ".$subject."
    ";
     52   $header .= $additional_headers;
     53   $header .= "Date: ".date("r")."
    ";
     54   $header .= "X-Mailer:By Redhat (PHP/".phpversion().")
    ";
     55   list($msec, $sec) = explode(" ", microtime());
     56   $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">
    ";
     57   $TO = explode(",", $this->strip_comment($to));
     58   
     59   if ($cc != "")
     60   {
     61    $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
     62    }
     63   if ($bcc != "")
     64   {
     65    $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
     66   }
     67   $sent = TRUE;
     68   foreach ($TO as $rcpt_to)
     69   {
     70    $rcpt_to = $this->get_address($rcpt_to);
     71    if (!$this->smtp_sockopen($rcpt_to))
     72    {
     73     $this->log_write("Error: Cannot send email to ".$rcpt_to."
    ");
     74     $sent = FALSE;
     75     continue;
     76    }
     77    if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body))
     78    {
     79     $this->log_write("E-mail has been sent to <".$rcpt_to.">
    ");
     80    }
     81    else
     82    {
     83     $this->log_write("Error: Cannot send email to <".$rcpt_to.">
    ");
     84     $sent = FALSE;
     85    }
     86    fclose($this->sock);
     87    $this->log_write("Disconnected from remote host
    ");
     88   }
     89   return $sent;
     90  }
     91   
     92  /* Private Functions */
     93  function smtp_send($helo, $from, $to, $header, $body = "")
     94  {
     95   if (!$this->smtp_putcmd("HELO", $helo))
     96   {
     97    return $this->smtp_error("sending HELO command");
     98   }
     99   
    100   #auth
    101   if($this->auth)
    102   {
    103    if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user)))
    104    {
    105     return $this->smtp_error("sending HELO command");
    106    }
    107    if (!$this->smtp_putcmd("", base64_encode($this->pass)))
    108    {
    109     return $this->smtp_error("sending HELO command");
    110    }
    111   }
    112   if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">"))
    113   {
    114    return $this->smtp_error("sending MAIL FROM command");
    115   }
    116   if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">"))
    117   {
    118    return $this->smtp_error("sending RCPT TO command");
    119   }
    120   if (!$this->smtp_putcmd("DATA"))
    121   {
    122    return $this->smtp_error("sending DATA command");
    123   }
    124   if (!$this->smtp_message($header, $body))
    125   {
    126    return $this->smtp_error("sending message");
    127   }
    128   if (!$this->smtp_eom())
    129   {
    130    return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
    131   }
    132   if (!$this->smtp_putcmd("QUIT"))
    133   {
    134    return $this->smtp_error("sending QUIT command");
    135   }
    136   return TRUE;
    137  }
    138   
    139  function smtp_sockopen($address)
    140  {
    141   if ($this->relay_host == "")
    142   {
    143    return $this->smtp_sockopen_mx($address);
    144   }
    145   else
    146   {
    147    return $this->smtp_sockopen_relay();
    148   }
    149  }
    150   
    151  function smtp_sockopen_relay()
    152  {
    153   $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."
    ");
    154   $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
    155   if (!($this->sock && $this->smtp_ok()))
    156   {
    157    $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."
    ");
    158    $this->log_write("Error: ".$errstr." (".$errno.")
    ");
    159    return FALSE;
    160   }
    161   $this->log_write("Connected to relay host ".$this->relay_host."
    ");
    162   return TRUE;;
    163  }
    164   
    165  function smtp_sockopen_mx($address)
    166  {
    167   $domain = preg_replace("^.+@([^@]+)$", "1", $address);
    168   if (!@getmxrr($domain, $MXHOSTS))
    169   {
    170    $this->log_write("Error: Cannot resolve MX "".$domain.""
    ");
    171    return FALSE;
    172   }
    173   foreach ($MXHOSTS as $host)
    174   {
    175    $this->log_write("Trying to ".$host.":".$this->smtp_port."
    ");
    176    $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
    177    if (!($this->sock && $this->smtp_ok()))
    178    {
    179     $this->log_write("Warning: Cannot connect to mx host ".$host."
    ");
    180     $this->log_write("Error: ".$errstr." (".$errno.")
    ");
    181     continue;
    182    }
    183    $this->log_write("Connected to mx host ".$host."
    ");
    184    return TRUE;
    185   }
    186   $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")
    ");
    187   return FALSE;
    188  }
    189   
    190  function smtp_message($header, $body)
    191  {
    192   fputs($this->sock, $header."
    ".$body);
    193   $this->smtp_debug("> ".str_replace("
    ", "
    "."> ", $header."
    > ".$body."
    > "));
    194   return TRUE;
    195  }
    196   
    197  function smtp_eom()
    198  {
    199   fputs($this->sock, "
    .
    ");
    200   $this->smtp_debug(". [EOM]
    ");
    201   return $this->smtp_ok();
    202  }
    203   
    204  function smtp_ok()
    205  {
    206   $response = str_replace("
    ", "", fgets($this->sock, 512));
    207   $this->smtp_debug($response."
    ");
    208   if (!preg_match("/^[23]/", $response))
    209   {
    210    fputs($this->sock, "QUIT
    ");
    211    fgets($this->sock, 512);
    212    $this->log_write("Error: Remote host returned "".$response.""
    ");
    213    return FALSE;
    214   }
    215   return TRUE;
    216  }
    217   
    218  function smtp_putcmd($cmd, $arg = "")
    219  {
    220   if ($arg != "")
    221   {
    222    if($cmd=="")
    223    {
    224     $cmd = $arg;
    225    }
    226    else
    227    {
    228     $cmd = $cmd." ".$arg;
    229    }
    230   }
    231   fputs($this->sock, $cmd."
    ");
    232   $this->smtp_debug("> ".$cmd."
    ");
    233   return $this->smtp_ok();
    234  }
    235   
    236  function smtp_error($string)
    237  {
    238   $this->log_write("Error: Error occurred while ".$string.".
    ");
    239   return FALSE;
    240  }
    241   
    242  function log_write($message)
    243  {
    244   $this->smtp_debug($message);
    245   if ($this->log_file == "")
    246   {
    247    return TRUE;
    248   }
    249   $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
    250   if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a")))
    251   {
    252    $this->smtp_debug("Warning: Cannot open log file "".$this->log_file.""
    ");
    253    return FALSE;;
    254   }
    255   flock($fp, LOCK_EX);
    256   fputs($fp, $message);
    257   fclose($fp);
    258   return TRUE;
    259  }
    260   
    261  function strip_comment($address)
    262  {
    263   $comment = "/([^()]*)/";
    264   while (preg_match($comment, $address))
    265   {
    266    $address = preg_replace($comment, "", $address);
    267   }
    268   return $address;
    269  }
    270   
    271  function get_address($address)
    272  {
    273   $address = preg_replace("/([ 	
    ])+/", "", $address);
    274   $address = preg_replace("/^.*<(.+)>.*$/", "1", $address);
    275   return $address;
    276  }
    277   
    278  function smtp_debug($message)
    279  {
    280   if ($this->debug)
    281   {
    282    echo $message;
    283   }
    284  }
    285   
    286 }
    287 ?>
  • 相关阅读:
    串匹配(C/C++实现)
    稀疏数组-矩阵存储【C语言实现】
    mysql frm、MYD、MYI数据文件恢复,导入MySQL中
    我们为什么要分库分表?
    golang 使用goto进行多错误处理
    mongodb 查看、创建、修改、删除索引
    MyBatis中模糊搜索使用like匹配带%字符时失效问题
    MySQL 用 limit 为什么会影响性能?
    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力
    【Java代码之美】 -- Java17新特性初探
  • 原文地址:https://www.cnblogs.com/scrazy/p/7634242.html
Copyright © 2011-2022 走看看