define('SMTP_STATUS_NOT_CONNECTED', 1, true);define('SMTP_STATUS_CONNECTED', 2, true);class smtp{ var $connection; var $recipients; var $headers; var $timeout; var $errors; var $status; var $body; var $from; var $host; var $port; var $helo; var $auth; var $user; var $pass; /** * 参数为一个数组 * host SMTP 服务器的主机 默认:localhost * port SMTP 服务器的端口 默认:25 * helo 发送HELO命令的名称 默认:localhost * user SMTP 服务器的用户名 默认:空值 * pass SMTP 服务器的登陆密码 默认:空值 * timeout 连接超时的时间 默认:5 * @return bool */ function smtp($params = array()) { if (!defined('CRLF')) { define('CRLF', "\r\n", true); } $this->timeout = 10; $this->status = SMTP_STATUS_NOT_CONNECTED; $this->host = 'localhost'; $this->port = 25; $this->auth = false; $this->user = ''; $this->pass = ''; $this->errors = array(); foreach ($params AS $key => $value) { $this->$key = $value; } $this->helo = $this->host; // 如果没有设置用户名则不验证 $this->auth = ('' == $this->user) ? false : true; } function connect($params = array()) { if (!isset($this->status)) { $obj = new smtp($params); if ($obj->connect()) { $obj->status = SMTP_STATUS_CONNECTED; } return $obj; } else { if (!empty($GLOBALS['_CFG']['smtp_ssl'])) { $this->host = "ssl://" . $this->host; } $this->connection = @fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout); if ($this->connection === false) { $this->errors[] = 'Access is denied.'; return false; } @socket_set_timeout($this->connection, 0, 250000); $greeting = $this->get_data(); if (is_resource($this->connection)) { $this->status = 2; return $this->auth ? $this->ehlo() : $this->helo(); } else { log_write($errstr, __FILE__, __LINE__); $this->errors[] = 'Failed to connect to server: ' . $errstr; return false; } } } /** * 参数为数组 * recipients 接收人的数组 * from 发件人的地址,也将作为回复地址 * headers 头部信息的数组 * body 邮件的主体 */ function send($params = array()) { foreach ($params AS $key => $value) { $this->$key = $value; } if ($this->is_connected()) { // 服务器是否需要验证 if ($this->auth) { if (!$this->auth()) { return false; } } $this->mail($this->from); if (is_array($this->recipients)) { foreach ($this->recipients AS $value) { $this->rcpt($value); } } else { $this->rcpt($this->recipients); } if (!$this->data()) { return false; } $headers = str_replace(CRLF . '.', CRLF . '..', trim(implode(CRLF, $this->headers))); $body = str_replace(CRLF . '.', CRLF . '..', $this->body); $body = substr($body, 0, 1) == '.' ? '.' . $body : $body; $this->send_data($headers); $this->send_data(''); $this->send_data($body); $this->send_data('.'); return (substr($this->get_data(), 0, 3) === '250'); } else { $this->errors[] = 'Not connected!'; return false; } } function helo() { if (is_resource($this->connection) AND $this->send_data('HELO ' . $this->helo) AND substr($error = $this->get_data(), 0, 3) === '250' ) { return true; } else { $this->errors[] = 'HELO command failed, output: ' . trim(substr($error, 3)); return false; } } function ehlo() { if (is_resource($this->connection) AND $this->send_data('EHLO ' . $this->helo) AND substr($error = $this->get_data(), 0, 3) === '250' ) { return true; } else { $this->errors[] = 'EHLO command failed, output: ' . trim(substr($error, 3)); return false; } } function auth() { if (is_resource($this->connection) AND $this->send_data('AUTH LOGIN') AND substr($error = $this->get_data(), 0, 3) === '334' AND $this->send_data(base64_encode($this->user)) // Send username AND substr($error = $this->get_data(),0,3) === '334' AND $this->send_data(base64_encode($this->pass)) // Send password AND substr($error = $this->get_data(),0,3) === '235' ) { return true; } else { $this->errors[] = 'AUTH command failed: ' . trim(substr($error, 3)); return false; } } function mail($from) { if ($this->is_connected() AND $this->send_data('MAIL FROM:<' . $from . '>') AND substr($this->get_data(), 0, 2) === '250' ) { return true; } else { return false; } } function rcpt($to) { if ($this->is_connected() AND $this->send_data('RCPT TO:<' . $to . '>') AND substr($error = $this->get_data(), 0, 2) === '25') { return true; } else { $this->errors[] = trim(substr($error, 3)); return false; } } function data() { if ($this->is_connected() AND $this->send_data('DATA') AND substr($error = $this->get_data(), 0, 3) === '354' ) { return true; } else { $this->errors[] = trim(substr($error, 3)); return false; } } function is_connected() { return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED)); } function send_data($data) { if (is_resource($this->connection)) { return fwrite($this->connection, $data . CRLF, strlen($data) + 2); } else { return false; } } function get_data() { $return = ''; $line = ''; if (is_resource($this->connection)) { while (strpos($return, CRLF) === false OR $line{3} !== ' ') { $line = fgets($this->connection, 512); $return .= $line; } return trim($return); } else { return ''; } } /** * 获得最后一个错误信息 * * @access public * @return string */ function error_msg() { if (!empty($this->errors)) { $len = count($this->errors) - 1; return $this->errors[$len]; } else { return ''; } }}?>
详细解决方案
php使用smtp服务发送邮件 首先
热度:402 发布时间:2016-04-28 18:06:48.0
相关解决方案
- cmd输入telnet smtp.sina.com25展示telnet不是内部命令
- SMTP 服务器要求安全连接或客户端未经过身份验证
- smtp,该如何解决
- SMTP 发件人 如何设置显示中文
- 请问一上大家,email邮箱的pop3, smtp, exchange, 有什么不同
- [求助]用 sun.net.smtp.SmtpClient发Email所引发的问题
- SMTP Error: Could not connect to SMTP host.该如何解决
- ping“smtp.gmail.com”可以通,为什么PHPMAILer却报错
- 18:11:51,873 ERROR [STDERR] com.sun.mail.smtp.SMTPSendFailedException:
- javamail 发送邮件 Caused by: javax.mail.MessagingException: Unknown SMTP host: smtp.163.com,该怎么解决
- javamail smtp.sina.com.cn 的连接有关问题
- exception is: com.sun.mail.smtp.SMTPAddressFailedException
- smtp 和 pop 是一个服务器地址,怎样通过javax.mail 访问他们解决方案
- Could not connect to SMTP host: smtp.huawei.com, port: 25解决方法
- 请问一下大家,email邮箱的pop3, smtp, exchange, 有什么不同
- 关于创建UTL_TCP/HTTP/SMTP 的访问控制列表,提示网络权限无效,该如何解决
- com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1
- sql email发送邮件,发送邮件的信箱里给出提示:Reason: Requested action not taken: no smtp MX only
- php使用fsockopen时,fwrite中的\r\n及\n结束符导致,smtp.qq.com响应出现有关问题
- SMTP Error: Could not connect to SMTP host.该如何解决
- ping“smtp.gmail.com”可以通,为什么PHPMAILer却报错
- Log4j2 SMTP-Appender“必须首先发出 STARTTLS 命令”
- 简述TCP/IP邮件,SMTP (简单邮件传输协议)、POP (邮局协议),IMAP (因特网消息访问协议)之间的含义和区别?
- Outlook-smtp.office365.com java发送邮件异常解决
- 《计算机网络自顶向下》Socket Lab3 SMTP Lab
- com.sun.mail.util.MailConnectException: Couldn‘t connect to host, port: smtp.qq.com, 25; timeout -1
- 【TCP-IP详解卷一:协议】ch28 SMTP:简单邮件传送协议
- Python SMTP 发送纯文本邮件
- gitlab 邮件配置(smtp)
- 禅道发送邮件 SMTP - ERROR: Failed to connect to server