PHP-SMTP发送邮件

/**
 * 邮件发送类
 */
class Mail
{
    // SMTP服务器名称
    private $SmtpHost;
    /* SMTP服务端口
     + 标准服务端口,默认为25
     */
    private $SmtpPort = 25;
    // SMTP用户名
    private $SmtpUser = ‘‘;
    // SMTP用户密码
    private $SmtpPassword = ‘‘;
    /* 超时时间
     + 用于fsockopen()函数,超过该时间未连上则中断
     */
    private $TimeOut = 30;
    /* 用户身份
     + 用于HELO指令
     */
    private $HostName = ‘localhost‘;
    /* 开启调试模式 */
    private $Debug = false;
    /* 是否进行身份验证 */
    private $Authentication = false;
    /* Private Variables */
    private $Socket = false;

    /**
     * 构造方法
     */
    public function __construct($smtpHost = ‘‘, $smtpUser = ‘‘, $smtpPassword = ‘‘, $authentication = false, $smtpPort = 25)
    {
        $this->SmtpHost = $smtpHost;
        $this->SmtpPort = $smtpPort;
        $this->SmtpUser = $smtpUser;
        $this->SmtpPassword = $smtpPassword;
        $this->Authentication = $authentication;
    }

    /** 发送邮件
     * @param string $maiTo 收件人
     * @param string $mailFrom 发件人(支持名称:Email)
     * @param string $subject 主题
     * @param string $body 内容
     * @param string $mailType 邮件类型
     * @param string $cc 抄送邮件地址
     * @param string $bcc 隐藏抄送邮件地址
     * @param string $additionalHeaders 附加内容
     * @return boolean
     */
    public function SendMail($maiTo, $mailFrom, $subject = ‘‘, $body = ‘‘, $mailType = ‘HTML‘, $cc = ‘‘, $bcc = ‘‘, $additionalHeaders = ‘‘)
    {

        $header = ‘‘;
        $header .= "MIME-Version:1.0\r\n";
        if ($mailType == ‘HTML‘) {
            $header .= "Content-Type:text/html;";
        }
        $header .= "charset=‘utf-8‘\r\n";
        $header .= "Content-Language=‘zh-cn‘\r\n";
        $header .= "To: " . $maiTo . "\r\n";
        if ($cc != ‘‘) {
            $header .= "Cc: " . $cc . "\r\n";
        }
        $header .= "From:" . $mailFrom . "<" . $mailFrom . ">\r\n";
        $header .= "Subject:=?UTF-8?B?" . base64_encode($subject). "?=\r\n";
        $header .= $additionalHeaders;
        $header .= "Date: " . date("r") . "\r\n";
        $header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")\r\n";
        list($msec, $sec) = explode(‘ ‘, microtime());
        $header .= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mailFrom . ">\r\n";

        //收件人地址解析
        $maiTo = explode(",", $maiTo);
        if ($cc != "") {
            $maiTo = array_merge($maiTo, explode(",", $cc));
        }
        if ($bcc != "") {
            $maiTo = array_merge($maiTo, explode(",", $bcc));
        }

        //邮件是否发送成功标志
        $mailSent = true;
        foreach ($maiTo as $value) {
            if (!$this->SmtpSockopen($value)) {
                $this->SmtpDebug("[错误]: 无法发送邮件至 \"" . $value . "\"\n");
                $mailSent = false;
                continue;
            }
            if ($this->SmtpSend($this->HostName, $mailFrom, $value, $header, $body)) {
                $this->SmtpDebug("[成功]: E-mail已经成功发送至 <" . $value . ">\n");
            } else {
                $this->SmtpDebug("[失败]: E-mail无法发送至 <" . $value . ">\n");
                $mailSent = false;
            }
            fclose($this->Socket);
            //$this->SmtpDebug("[失败]:  连接服务器失败\n");
        }
        $this->SmtpDebug($header);
        return $mailSent;
    }

    /**
     * 发送邮件
     * @param $helo
     * @param $maiFrom
     * @param $maiTo
     * @param $header
     * @param string $body
     * @return bool
     */
    function SmtpSend($helo, $maiFrom, $maiTo, $header, $body = "")
    {
        //发送连接命令
        if (!$this->SmtpPutcmd("HELO", $helo)) {
            return $this->SmtpError("发送 HELO 命令");
        }

        //身份验证
        if ($this->Authentication) {
            if (!$this->SmtpPutcmd("AUTH LOGIN", base64_encode($this->SmtpUser))) {
                return $this->SmtpError("发送 HELO 命令");
            }

            if (!$this->SmtpPutcmd("", base64_encode($this->SmtpPassword))) {
                return $this->SmtpError("发送 HELO 命令");
            }
        }

        //发件人信息
        if (!$this->SmtpPutcmd("MAIL", "FROM:<" . $maiFrom . ">")) {
            return $this->SmtpError("发送 MAIL FROM 命令");
        }

        //收件人信息
        if (!$this->SmtpPutcmd("RCPT", "TO:<" . $maiTo . ">")) {
            return $this->SmtpError("发送 RCPT TO 命令");
        }

        //发送数据
        if (!$this->SmtpPutcmd("DATA")) {
            return $this->SmtpError("发送 DATA 命令");
        }

        //发送消息
        if (!$this->SmtpMessage($header, $body)) {
            return $this->SmtpError("发送 信息");
        }

        //发送EOM
        if (!$this->SmtpEom()) {
            return $this->SmtpError("发送 <CR><LF>.<CR><LF> [EOM]");
        }

        //发送退出命令
        if (!$this->SmtpPutcmd("QUIT")) {
            return $this->SmtpError("发送 QUIT 命令");
        }

        return true;
    }

    /** 发送SMTP命令
     * @param $cmd
     * @param $arg
     * @return bool
     */
    function SmtpPutcmd($cmd, $arg = "")
    {
        if ($arg != ‘‘) {
            if ($cmd == ‘‘) {
                $cmd = $arg;
            } else {
                $cmd = $cmd . ‘ ‘ . $arg;
            }
        }
        fputs($this->Socket, $cmd . "\r\n");
        $this->SmtpDebug("> " . $cmd . "\n");
        return $this->SmtpOk();
    }

    /** SMTP错误信息
     * @param string $string 错误信息
     * @return bool
     */
    function SmtpError($string)
    {
        $this->SmtpDebug("[错误]: 在 " . $string . " 时发生了错误\n");
        return false;
    }

    /** SMTP信息
     * @param string $header 头部消息
     * @param string $body 内容
     * @return bool
     */
    function SmtpMessage($header, $body)
    {
        fputs($this->Socket, $header . "\r\n" . $body);
        $this->SmtpDebug("> " . str_replace("\r\n", "\n" . "> ", $header . "\n> " . $body . "\n> "));
        return true;
    }

    /* EOM */
    function SmtpEom()
    {
        fputs($this->Socket, "\r\n.\r\n");
        $this->SmtpDebug(". [EOM]\n");
        return $this->SmtpOk();
    }

    /* SMTP OK */
    function SmtpOk()
    {
        $response = str_replace("\r\n", "", fgets($this->Socket, 512));
        $this->SmtpDebug($response . "\n");

        if (preg_match("/^[23]/", $response) == 0) {
            fputs($this->Socket, "QUIT\r\n");
            fgets($this->Socket, 512);
            $this->SmtpDebug("[错误]: 服务器返回 \"" . $response . "\"\n");
            return false;
        }
        return true;
    }

    /* debug
     * @param string $message 错误消息
     */
    private function SmtpDebug($message)
    {
        if ($this->Debug) {
            echo $message . "<br />";
        }
    }

    /** 网络Socket链接准备
     * @param string $address 邮件地址
     * @return boolean
     */
    private function SmtpSockopen($address)
    {
        if ($this->SmtpHost == ‘‘) {
            return $this->SmtpSockopenMx($address);
        } else {
            return $this->SmtpSockopenRelay($this->SmtpHost);
        }
    }

    /** 获取MX记录
     * @param string $address 邮件地址
     * @return boolean
     */
    private function SmtpSockopenMx($address)
    {
        $domain = ereg_replace("^[email protected]([^@]+)$", "\\1", $address);
        if (!$this->MyCheckdnsrr($domain, ‘mx‘)) {
            $this->SmtpDebug("[错误]: 无法找到 MX记录 \"" . $domain . "\"\n");
            return false;
        }
        $this->SmtpSockopenRelay($domain);
        $this->SmtpDebug(‘[错误]: 无法连接 MX主机 (‘ . $domain . ")\n");
        return false;
    }

    /** 打开网络Socket链接
     * @param string $smtpHost 服务器名称
     * @return boolean
     */
    private function SmtpSockopenRelay($smtpHost)
    {
        $this->SmtpDebug(‘[操作]: 尝试连接 "‘ . $smtpHost . ‘:‘ . $this->SmtpPort . "\"\n");
        $this->Socket = @stream_socket_client(‘tcp://‘ . $smtpHost . ‘:‘ . $this->SmtpPort, $errno, $errstr, $this->TimeOut);
        if (!($this->Socket && $this->SmtpOk())) {
            $this->SmtpDebug(‘[错误]: 无法连接服务器 "‘ . $smtpHost . "\n");
            $this->SmtpDebug(‘[错误]: ‘ . $errstr . " (" . $errno . ")\n");
            return false;
        }
        $this->SmtpDebug(‘[成功]: 成功连接 ‘ . $smtpHost . ‘:‘ . $this->SmtpPort . "\"\n");
        return true;;
    }

    /** 自定义邮箱有效性验证
     * + 解决window下checkdnsrr函数无效情况
     * @param string $hostName 主机名
     * @param string $recType 类型(可以是MX、NS、SOA、PTR、CNAME 或 ANY)
     * @return boolean
     */
    function MyCheckdnsrr($hostName, $recType = ‘MX‘)
    {
        if ($hostName != ‘‘) {
            $recType = $recType == ‘‘ ? ‘MX‘ : $recType;
            exec("nslookup -type=$recType $hostName", $result);
            foreach ($result as $line) {
                if (preg_match("/^$hostName/", $line) > 0) {
                    return true;
                }
            }
            return false;
        }
        return false;
    }
}

//邮件配置
$title = ‘xxx‘;
$sm = new Mail(‘xxx.xxx.xxx‘, ‘xxx‘, ‘xxx‘,true);
$sendTo = "[email protected]";
$end = $sm->SendMail($sendTo,‘[email protected]‘,$title,$content);
if ($end) echo $end;
else echo "发送成功!";
时间: 2024-12-13 22:06:40

PHP-SMTP发送邮件的相关文章

python通过SMTP发送邮件失败,报错505/535

python通过SMTP发送邮件失败:错误1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')    我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的(对指定的邮箱大师客户端默认开启),因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码)

使用 phpMailer 基于(SMTP) 发送邮件

PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quoted-printable.支持SMTP验证.支持带附件的邮件和Html格式的邮件. 实现代码 : <?php include 'class.smtp.php'; include 'class.phpmailer.php'; $mail = new PHPMailer; $mail->isSMTP()

通过SMTP发送邮件的Python代码

贴上一段用Python开发的发送邮件程序 #coding=UTF-8 import smtplib from email.mime.text import MIMEText smtp_host="smtp.163.com" smtp_port="25" mail_user="[email protected]" mail_password="1111222" def send_mail(to_list,subject,cont

再谈用java实现Smtp发送邮件之Socket编程

很多其它内容欢迎訪问个人站点   http://icodeyou.com 前几天利用Socket实现了用java语言搭建webserver,全程下来应该会对Socket这个东西已经使用的很熟悉了.尽管抽象,可是使用过一次之后就会感受到它在网络通信上的作用是多么的强大.正好,今天就继续用Socket来练习使用下面Smtp协议发送一封简单的电子邮件.今天的故事呢,是我要约我女神出去吃饭啦啦啦~~~所以,面对Smtp.仅仅许成功,不许失败. 全局假定我的邮箱为[email protected]   女

WordPress SMTP发送邮件插件:WP SMTP

对于一个网站而言,发送邮件的功能是必不可少的,现在的主机一般都支持发送邮件,但是不同的主机由于函数限制或者某些其他原因,可能造成没办法正常发送邮件.这时候,我们可能就要借助第三方SMTP发送邮件. 对于使用WordPress建站的朋友来说,SMTP发送邮件的插件还是比较多的,功能大多类似,下面以WP SMTP为例讲解一下配置. WP SMTP简介 WP SMTP插件是国人制作的,设置页面的顶部包含了 Gmail邮箱.微软邮箱.163邮箱.QQ邮箱的设置示例,可以点击对应的图标查看示例截图,其他邮

将PHPMailer整合到ThinkPHP中实现SMTP发送邮件

ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMailer整合到ThinkPHP中吧. PHPMailer是不符合ThinkPHP规范的插件程序,所以,我们需要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目录了.Vendor目录专门用于存放非标准ThinkPHP插件的目录,如下: PHPMailer整合到ThinkPHP中的存放目录 接下

gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例) 首先祭出官网文档链接:https://docs.gitlab.com/omnibus/settings/smtp.html 其实官网已经说的很清楚了,并且给出了QQ邮箱的范例(BAT还是屌的) 1. 编辑/etc/gitlab/gitlab.rb文件(加到文件最后面就好了).以QQ企业邮箱为例: 1 2 3 4 5 6 7 8 9 gitlab_rails['smtp_enable'] = true gitlab_rails

使用mail/mailx通过office365 SMTP发送邮件

Mailx是一个智能邮件处理系统,提供POSIX mailx命令功能,提供MIME.IMAP.POP3.SMTP和S/MIME扩展,通过调用sendmail来发送邮件. 安装mailx: # yum install mailx mailx语法 mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] [-S variable[

Linux学习笔记:使用外部SMTP发送邮件

在CENTOS 6.3上,安装mailx,即可使用外部smtp服务器来发送邮件, yum install mailx -y 安装好后,编辑配置文件 mailx -V 12.4 7/29/08  <<mailx的版本号 rpm -qc mailx /etc/mail.rc   <<网上很多教程写了配置文件名是nail.rc,难道是旧版的缘故? vi /etc/mail.rc 在文件最后加入以下内容.(关于这个配置文件,man是没有资料的,我也是参考网上别的教程,如果要具体研究,估计要

zabbix使用系统自带mailx(mail)SMTP发送邮件

0x01,环境介绍: 我们用的是微软的邮箱打算用SMTP方式发送邮件.先登录账户看官方给出SMTP信息. 0x02,系统mailx(mail)设置. 通过命令可以看到,mail实际上是mailx的快捷方式.然后在/etc/mail.rc里加入账号等信息. SMTP加密方式是:STARTTLS set from=Zabbix使用的发送邮件地址 set smtp=smtp.office365.com set smtp-auth-user=Zabbix使用的发送邮件地址 set smtp-auth-p