PHP支持发送HTML格式邮件的发送类

原创
2016-07-25 08:43:01664浏览
  1. /**
  2. * 邮件发送类
  3. * 支持发送纯文本邮件和HTML格式的邮件
  4. * @example
  5. * $config = array(
  6. * "from" => "*****",
  7. * "to" => "***",
  8. * "subject" => "test",
  9. * "body" => "test",
  10. * "username" => "***",
  11. * "password" => "****",
  12. * "isHTML" => true
  13. * );
  14. *
  15. * $mail = new MySendMail();
  16. *
  17. * $mail->setServer("smtp.126.com");
  18. *
  19. * $mail->setMailInfo($config);
  20. * if(!$mail->sendMail()) {
  21. * echo $mail->error();
  22. * return 1;
  23. * }
  24. */
  25. class MySendMail{
  26. /**
  27. * @var 邮件传输代理用户名
  28. * @access private
  29. */
  30. private $_userName;
  31. /**
  32. * @var 邮件传输代理密码
  33. * @access private
  34. */
  35. private $_password;
  36. /**
  37. * @var 邮件传输代理服务器地址
  38. * @access protected
  39. */
  40. protected $_sendServer;
  41. /**
  42. * @var 邮件传输代理服务器端口
  43. * @access protected
  44. */
  45. protected $_port=25;
  46. /**
  47. * @var 发件人
  48. * @access protected
  49. */
  50. protected $_from;
  51. /**
  52. * @var 收件人
  53. * @access protected
  54. */
  55. protected $_to;
  56. /**
  57. * @var 主题
  58. * @access protected
  59. */
  60. protected $_subject;
  61. /**
  62. * @var 邮件正文
  63. * @access protected
  64. */
  65. protected $_body;
  66. /**
  67. * @var 是否是HTML格式的邮件
  68. * @access protected
  69. */
  70. protected $_isHTML=true;
  71. /**
  72. * @var socket资源
  73. * @access protected
  74. */
  75. protected $_socket;
  76. /**
  77. * @var 错误信息
  78. * @access protected
  79. */
  80. protected $_errorMessage;
  81. public function __construct($from="", $to="", $subject="", $body="", $server="", $username="", $password="",$isHTML="", $port="") {
  82. if(!empty($from)){
  83. $this->_from = $from;
  84. }
  85. if(!empty($to)){
  86. $this->_to = $to;
  87. }
  88. if(!empty($subject)){
  89. $this->_subject = $subject;
  90. }
  91. if(!empty($body)){
  92. $this->_body = $body;
  93. }
  94. if(!empty($isHTML)){
  95. $this->_isHTML = $isHTML;
  96. }
  97. if(!empty($server)){
  98. $this->_sendServer = $server;
  99. }
  100. if(!empty($port)){
  101. $this->_port = $port;
  102. }
  103. if(!empty($username)){
  104. $this->_userName = $username;
  105. }
  106. if(!empty($password)){
  107. $this->_password = $password;
  108. }
  109. }
  110. /**
  111. * 设置邮件传输代理
  112. * @param string $server 代理服务器的ip或者域名
  113. * @param int $port 代理服务器的端口,smtp默认25号端口
  114. * @param int $localPort 本地端口
  115. * @return boolean
  116. */
  117. public function setServer($server, $port=25) {
  118. if(!isset($server) || empty($server) || !is_string($server)) {
  119. $this->_errorMessage = "first one is an invalid parameter";
  120. return false;
  121. }
  122. if(!is_numeric($port)){
  123. $this->_errorMessage = "first two is an invalid parameter";
  124. return false;
  125. }
  126. $this->_sendServer = $server;
  127. $this->_port = $port;
  128. return true;
  129. }
  130. /**
  131. * 设置邮件
  132. * @access public
  133. * @param array $config 邮件配置信息
  134. * 包含邮件发送人、接收人、主题、内容、邮件传输代理的验证信息
  135. * @return boolean
  136. */
  137. public function setMailInfo($config) {
  138. if(!is_array($config) || count($config) < 6){
  139. $this->_errorMessage = "parameters are required";
  140. return false;
  141. }
  142. $this->_from = $config['from'];
  143. $this->_to = $config['to'];
  144. $this->_subject = $config['subject'];
  145. $this->_body = $config['body'];
  146. $this->_userName = $config['username'];
  147. $this->_password = $config['password'];
  148. if(isset($config['isHTML'])){
  149. $this->_isHTML = $config['isHTML'];
  150. }
  151. return true;
  152. }
  153. /**
  154. * 发送邮件
  155. * @access public
  156. * @return boolean
  157. */
  158. public function sendMail() {
  159. $command = $this->getCommand();
  160. $this->socket();
  161. foreach ($command as $value) {
  162. if($this->sendCommand($value[0], $value[1])) {
  163. continue;
  164. }
  165. else{
  166. return false;
  167. }
  168. }
  169. $this->close(); //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放
  170. echo 'Mail OK!';
  171. return true;
  172. }
  173. /**
  174. * 返回错误信息
  175. * @return string
  176. */
  177. public function error(){
  178. if(!isset($this->_errorMessage)) {
  179. $this->_errorMessage = "";
  180. }
  181. return $this->_errorMessage;
  182. }
  183. /**
  184. * 返回mail命令
  185. * @access protected
  186. * @return array
  187. */
  188. protected function getCommand() {
  189. if($this->_isHTML) {
  190. $mail = "MIME-Version:1.0\r\n";
  191. $mail .= "Content-type:text/html;charset=utf-8\r\n";
  192. $mail .= "FROM:test<" . $this->_from . ">\r\n";
  193. $mail .= "TO:<" . $this->_to . ">\r\n";
  194. $mail .= "Subject:" . $this->_subject ."\r\n\r\n";
  195. $mail .= $this->_body . "\r\n.\r\n";
  196. }
  197. else{
  198. $mail = "FROM:test<" . $this->_from . ">\r\n";
  199. $mail .= "TO:<" . $this->_to . ">\r\n";
  200. $mail .= "Subject:" . $this->_subject ."\r\n\r\n";
  201. $mail .= $this->_body . "\r\n.\r\n";
  202. }
  203. $command = array(
  204. array("HELO sendmail\r\n", 250),
  205. array("AUTH LOGIN\r\n", 334),
  206. array(base64_encode($this->_userName) . "\r\n", 334),
  207. array(base64_encode($this->_password) . "\r\n", 235),
  208. array("MAIL FROM:<" . $this->_from . ">\r\n", 250),
  209. array("RCPT TO:<" . $this->_to . ">\r\n", 250),
  210. array("DATA\r\n", 354),
  211. array($mail, 250),
  212. array("QUIT\r\n", 221)
  213. );
  214. return $command;
  215. }
  216. /**
  217. * @access protected
  218. * @param string $command 发送到服务器的smtp命令
  219. * @param int $code 期望服务器返回的响应吗
  220. * @param boolean
  221. */
  222. protected function sendCommand($command, $code) {
  223. echo 'Send command:' . $command . ',expected code:' . $code . '
    ';
  224. //发送命令给服务器
  225. try{
  226. if(socket_write($this->_socket, $command, strlen($command))){
  227. //读取服务器返回
  228. $data = trim(socket_read($this->_socket, 1024));
  229. echo 'response:' . $data . '

    ';
  230. if($data) {
  231. $pattern = "/^".$code."//m.sbmmt.com/m/";
  232. if(preg_match($pattern, $data)) {
  233. return true;
  234. }
  235. else{
  236. $this->_errorMessage = "Error:" . $data . "|**| command:";
  237. return false;
  238. }
  239. }
  240. else{
  241. $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());
  242. return false;
  243. }
  244. }
  245. else{
  246. $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());
  247. return false;
  248. }
  249. }catch(Exception $e) {
  250. $this->_errorMessage = "Error:" . $e->getMessage();
  251. }
  252. }
  253. /**
  254. * 建立到服务器的网络连接
  255. * @access private
  256. * @return boolean
  257. */
  258. private function socket() {
  259. if(!function_exists("socket_create")) {
  260. $this->_errorMessage = "extension php-sockets must be enabled";
  261. return false;
  262. }
  263. //创建socket资源
  264. $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
  265. if(!$this->_socket) {
  266. $this->_errorMessage = socket_strerror(socket_last_error());
  267. return false;
  268. }
  269. //连接服务器
  270. if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {
  271. $this->_errorMessage = socket_strerror(socket_last_error());
  272. return false;
  273. }
  274. socket_read($this->_socket, 1024);
  275. return true;
  276. }
  277. /**
  278. * 关闭socket
  279. * @access private
  280. * @return boolean
  281. */
  282. private function close() {
  283. if(isset($this->_socket) && is_object($this->_socket)) {
  284. $this->_socket->close();
  285. return true;
  286. }
  287. $this->_errorMessage = "no resource can to be close";
  288. return false;
  289. }
  290. }
  291. /**************************** Test ***********************************/
  292. $config = array(
  293. "from" => "********@163.com",
  294. "to" => "******@163.com",
  295. "subject" => "test",
  296. "body" => "test",
  297. "username" => "******",
  298. "password" => "password",
  299. );
  300. $mail = new MySendMail();
  301. $mail->setServer("smtp.163.com");
  302. $mail->setMailInfo($config);
  303. if(!$mail->sendMail()){
  304. echo $mail->error();
  305. return 1;
  306. }
复制代码

PHP, HTML


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
上一条:php对mysql查询结果进行分页 下一条:PHP判断一张图片的主色调的代码片段

学习路径

查看更多

相关文章

查看更多