zoukankan      html  css  js  c++  java
  • 【转】简易smtp调用类

    用PHP发邮件的一个类,无需验证SMTP主机,类代码你可以不用管,只要按照后面的使用方法操作就行,这个类要先保存成一个php文件,文件名就叫smtp.php吧,下面是该文件代码:

    <?php
    class smtp
    {
    /* 公共变量 */
    var $smtp_port;
    var $time_out;
    var $host_name;
    var $log_file;
    var $relay_host;
    var $debug;
    var $auth;
    var $user;
    var $pass;
    var $sock;
    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;
    $this->auth = $auth;
    $this->user = $user;
    $this->pass = $pass;
    $this->host_name = "localhost"; 
    $this->log_file = "";
    $this->sock = FALSE;
    }
    /* 主函数 */
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
    {
    $mail_from = $this->get_address($this->strip_comment($from));
    $body = ereg_replace("(^|(
    ))(.)", "1.3", $body);
    $header .= "MIME-Version:1.0
    ";
    if($mailtype=="HTML"){
    $header .= "Content-Type:text/html
    ";
    }
    $header .= "To: ".$to."
    ";
    if ($cc != "") {
    $header .= "Cc: ".$cc."
    ";
    }
    $header .= "From: $from<".$from.">
    ";
    $header .= "Subject: ".$subject."
    ";
    $header .= $additional_headers;
    $header .= "Date: ".date("r")."
    ";
    $header .= "X-Mailer:By Redhat (PHP/".phpversion().")
    ";
    list($msec, $sec) = explode(" ", microtime());
    $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">
    ";
    $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."
    ");
    $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.">
    ");
    } else {
    $this->log_write("Error: Cannot send email to <".$rcpt_to.">
    ");
    $sent = FALSE;
    }
    fclose($this->sock);
    $this->log_write("Disconnected from remote host
    ");
    }
    return $sent;
    }
    /* 私有函数 */
    function smtp_send($helo, $from, $to, $header, $body = "")
    {
    if (!$this->smtp_putcmd("HELO", $helo)) {
    return $this->smtp_error("sending HELO command");
    }
    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("尝试连接 ".$this->relay_host.":".$this->smtp_port."
    ");
    $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
    if (!($this->sock && $this->smtp_ok())) {
    $this->log_write("Error: 不能连接到中继主机 ".$this->relay_host."
    ");
    $this->log_write("Error: ".$errstr." (".$errno.")
    ");
    return FALSE;
    }
    $this->log_write("已连接到中继主机".$this->relay_host."
    ");
    return TRUE;;
    }
    function smtp_sockopen_mx($address)
    {
    $domain = ereg_replace("^.+@([^@]+)$", "1", $address);
    if (!@getmxrr($domain, $MXHOSTS)) {
    $this->log_write("Error: 无法解析MX "".$domain.""
    ");
    return FALSE;
    }
    foreach ($MXHOSTS as $host) {
    $this->log_write("Trying to ".$host.":".$this->smtp_port."
    ");
    $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
    if (!($this->sock && $this->smtp_ok())) {
    $this->log_write("Warning: 不能连接到主机".$host."
    ");
    $this->log_write("Error: ".$errstr." (".$errno.")
    ");
    continue;
    }
    $this->log_write("已连接".$host."
    ");
    return TRUE;
    }
    $this->log_write("Error: 不能连接到任何主机 (".implode(", ", $MXHOSTS).")
    ");
    return FALSE;
    }
    function smtp_message($header, $body)
    {
    fputs($this->sock, $header."
    ".$body);
    $this->smtp_debug("> ".str_replace("
    ", "
    "."> ", $header."
    > ".$body."
    > "));
    return TRUE;
    }
    function smtp_eom()
    {
    fputs($this->sock, "
    .
    ");
    $this->smtp_debug(". [EOM]
    ");
    return $this->smtp_ok();
    }
    function smtp_ok()
    {
    $response = str_replace("
    ", "", fgets($this->sock, 512));
    $this->smtp_debug($response."
    ");
    if (!ereg("^[23]", $response)) {
    fputs($this->sock, "QUIT
    ");
    fgets($this->sock, 512);
    $this->log_write("Error: Remote host returned "".$response.""
    ");
    return FALSE;
    }
    return TRUE;
    }
    function smtp_putcmd($cmd, $arg = "")
    {
    if ($arg != "") {
    if($cmd=="") $cmd = $arg;
    else $cmd = $cmd." ".$arg;
    }
    fputs($this->sock, $cmd."
    ");
    $this->smtp_debug("> ".$cmd."
    ");
    return $this->smtp_ok();
    }
    function smtp_error($string)
    {
    $this->log_write("Error: Error occurred while ".$string.".
    ");
    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.""
    ");
    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("([ 	
    ])+", "", $address);
    $address = ereg_replace("^.*<(.+)>.*$", "1", $address);
    return $address;
    }
    function smtp_debug($message)
    {
    if ($this->debug) {
    echo $message;
    }
    }
    }
    ?>

    使用例子:在例子中要先引入上述代码文件smtp.php

    <?php
    //以tom.com为例,已设置好,不过tom邮件服务器如果换了,那就需要自己动手改下
    require("smtp.php");
    $smtpserver = "smtp.tom.com";//SMTP服务器地址
    $smtpserverport =25;//SMTP端口
    $smtpusermail = "someone@tom.com";//用户邮箱
    $smtpemailto = "jack@knowsky.com";//发送给谁
    $smtpuser = "someone";//SMTP服务器的用户帐号
    $smtppass = "someonepass";//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);
    ?>
  • 相关阅读:
    二分练习题4 查找最接近的元素 题解
    二分练习题5 二分法求函数的零点 题解
    二分练习题3 查找小于x的最大元素 题解
    二分练习题2 查找大于等于x的最小元素 题解
    二分练习题1 查找元素 题解
    code forces 1176 D. Recover it!
    code forces 1173 B. Nauuo and Chess
    code forces 1173 C. Nauuo and Cards
    吴恩达深度学习课程笔记-15
    吴恩达深度学习课程笔记-14
  • 原文地址:https://www.cnblogs.com/mangoVic/p/6207065.html
Copyright © 2011-2022 走看看