mail.func.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. /**
  3. * 邮件发送函数
  4. * @copyright (C) 2005-2010 PHPCMS
  5. * @license http://www.phpcms.cn/license/
  6. * @lastmodify 2010-6-1
  7. */
  8. function runlog($mode = 'SMTP',$b = '',$c = '',$d='') {
  9. }
  10. /**
  11. * 发送邮件
  12. * @param $toemail 收件人email
  13. * @param $subject 邮件主题
  14. * @param $message 正文
  15. * @param $from 发件人
  16. * @param $cfg 邮件配置信息
  17. * @param $sitename 邮件站点名称
  18. */
  19. function sendmail($toemail, $subject, $message, $from='',$cfg = array(), $sitename='') {
  20. if($sitename=='') {
  21. $siteid = get_siteid();
  22. $siteinfo = siteinfo($siteid);
  23. $sitename = $siteinfo['site_title'];
  24. }
  25. if($cfg && is_array($cfg)) {
  26. $from = $cfg['from'];
  27. $mail = $cfg;
  28. $mail_type = $cfg['mail_type']; //邮件发送模式
  29. } else {
  30. $cfg = getcache('common','commons');
  31. $from = $cfg['mail_from'];
  32. $mail_type = $cfg['mail_type']; //邮件发送模式
  33. if($cfg['mail_user']=='' || $cfg['mail_password'] ==''){
  34. return false;
  35. }
  36. $mail= Array (
  37. 'mailsend' => 2,
  38. 'maildelimiter' => 1,
  39. 'mailusername' => 1,
  40. 'server' => $cfg['mail_server'],
  41. 'port' => $cfg['mail_port'],
  42. 'auth' => $cfg['mail_auth'],
  43. 'from' => $cfg['mail_from'],
  44. 'auth_username' => $cfg['mail_user'],
  45. 'auth_password' => $cfg['mail_password']
  46. );
  47. }
  48. //mail 发送模式
  49. if($mail_type==0) {
  50. $headers = 'MIME-Version: 1.0' . "\r\n";
  51. $headers .= 'Content-type: text/html; charset='.CHARSET.'' . "\r\n";
  52. $headers .= 'From: '.$sitename.' <'.$from.'>' . "\r\n";
  53. mail($toemail, $subject, $message, $headers);
  54. return true;
  55. }
  56. //邮件头的分隔符
  57. $maildelimiter = $mail['maildelimiter'] == 1 ? "\r\n" : ($mail['maildelimiter'] == 2 ? "\r" : "\n");
  58. //收件人地址中包含用户名
  59. $mailusername = isset($mail['mailusername']) ? $mail['mailusername'] : 1;
  60. //端口
  61. $mail['port'] = $mail['port'] ? $mail['port'] : 25;
  62. $mail['mailsend'] = $mail['mailsend'] ? $mail['mailsend'] : 1;
  63. //发信者
  64. $email_from = $from == '' ? '=?'.CHARSET.'?B?'.base64_encode($sitename)."?= <".$from.">" : (preg_match('/^(.+?) \<(.+?)\>$/',$from, $mats) ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $from);
  65. $email_to = preg_match('/^(.+?) \<(.+?)\>$/',$toemail, $mats) ? ($mailusername ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $mats[2]) : $toemail;;
  66. $email_subject = '=?'.CHARSET.'?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$sitename.'] '.$subject)).'?=';
  67. $email_message = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));
  68. $headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: PHPCMS-V9 {$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=".CHARSET."{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
  69. if(!$fp = fsockopen($mail['server'], $mail['port'], $errno, $errstr, 30)) {
  70. runlog('SMTP', "($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server", 0);
  71. return false;
  72. }
  73. stream_set_blocking($fp, true);
  74. $lastmessage = fgets($fp, 512);
  75. if(substr($lastmessage, 0, 3) != '220') {
  76. runlog('SMTP', "$mail[server]:$mail[port] CONNECT - $lastmessage", 0);
  77. return false;
  78. }
  79. fputs($fp, ($mail['auth'] ? 'EHLO' : 'HELO')." phpcms\r\n");
  80. $lastmessage = fgets($fp, 512);
  81. if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  82. runlog('SMTP', "($mail[server]:$mail[port]) HELO/EHLO - $lastmessage", 0);
  83. return false;
  84. }
  85. while(1) {
  86. if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
  87. break;
  88. }
  89. $lastmessage = fgets($fp, 512);
  90. }
  91. if($mail['auth']) {
  92. fputs($fp, "AUTH LOGIN\r\n");
  93. $lastmessage = fgets($fp, 512);
  94. if(substr($lastmessage, 0, 3) != 334) {
  95. runlog('SMTP', "($mail[server]:$mail[port]) AUTH LOGIN - $lastmessage", 0);
  96. return false;
  97. }
  98. fputs($fp, base64_encode($mail['auth_username'])."\r\n");
  99. $lastmessage = fgets($fp, 512);
  100. if(substr($lastmessage, 0, 3) != 334) {
  101. runlog('SMTP', "($mail[server]:$mail[port]) USERNAME - $lastmessage", 0);
  102. return false;
  103. }
  104. fputs($fp, base64_encode($mail['auth_password'])."\r\n");
  105. $lastmessage = fgets($fp, 512);
  106. if(substr($lastmessage, 0, 3) != 235) {
  107. runlog('SMTP', "($mail[server]:$mail[port]) PASSWORD - $lastmessage", 0);
  108. return false;
  109. }
  110. $email_from = $mail['from'];
  111. }
  112. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  113. $lastmessage = fgets($fp, 512);
  114. if(substr($lastmessage, 0, 3) != 250) {
  115. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  116. $lastmessage = fgets($fp, 512);
  117. if(substr($lastmessage, 0, 3) != 250) {
  118. runlog('SMTP', "($mail[server]:$mail[port]) MAIL FROM - $lastmessage", 0);
  119. return false;
  120. }
  121. }
  122. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  123. $lastmessage = fgets($fp, 512);
  124. if(substr($lastmessage, 0, 3) != 250) {
  125. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  126. $lastmessage = fgets($fp, 512);
  127. runlog('SMTP', "($mail[server]:$mail[port]) RCPT TO - $lastmessage", 0);
  128. return false;
  129. }
  130. fputs($fp, "DATA\r\n");
  131. $lastmessage = fgets($fp, 512);
  132. if(substr($lastmessage, 0, 3) != 354) {
  133. runlog('SMTP', "($mail[server]:$mail[port]) DATA - $lastmessage", 0);
  134. return false;
  135. }
  136. $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$maildelimiter}";
  137. fputs($fp, "Date: ".gmdate('r')."\r\n");
  138. fputs($fp, "To: ".$email_to."\r\n");
  139. fputs($fp, "Subject: ".$email_subject."\r\n");
  140. fputs($fp, $headers."\r\n");
  141. fputs($fp, "\r\n\r\n");
  142. fputs($fp, "$email_message\r\n.\r\n");
  143. $lastmessage = fgets($fp, 512);
  144. if(substr($lastmessage, 0, 3) != 250) {
  145. runlog('SMTP', "($mail[server]:$mail[port]) END - $lastmessage", 0);
  146. }
  147. fputs($fp, "QUIT\r\n");
  148. return true;
  149. }
  150. ?>