mail.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /*
  3. [UCenter] (C)2001-2099 Comsenz Inc.
  4. This is NOT a freeware, use is subject to license terms
  5. $Id: mail.php 1139 2012-05-08 09:02:11Z liulanbo $
  6. */
  7. !defined('IN_UC') && exit('Access Denied');
  8. define('UC_MAIL_REPEAT', 5);
  9. class mailmodel
  10. {
  11. var $db;
  12. var $base;
  13. var $apps;
  14. function __construct(&$base)
  15. {
  16. $this->mailmodel($base);
  17. }
  18. function mailmodel(&$base)
  19. {
  20. $this->base = $base;
  21. $this->db = $base->db;
  22. $this->apps = &$this->base->cache['apps'];
  23. }
  24. function get_total_num()
  25. {
  26. $data = $this->db->result_first("SELECT COUNT(*) FROM " . UC_DBTABLEPRE . "mailqueue");
  27. return $data;
  28. }
  29. function get_list($page, $ppp, $totalnum)
  30. {
  31. $start = $this->base->page_get_start($page, $ppp, $totalnum);
  32. $data = $this->db->fetch_all("SELECT m.*, u.username, u.email FROM " . UC_DBTABLEPRE . "mailqueue m LEFT JOIN " . UC_DBTABLEPRE . "members u ON m.touid=u.uid ORDER BY dateline DESC LIMIT $start, $ppp");
  33. foreach ((array) $data as $k => $v)
  34. {
  35. $data[$k]['subject'] = dhtmlspecialchars($v['subject']);
  36. $data[$k]['tomail'] = empty($v['tomail']) ? $v['email'] : $v['tomail'];
  37. $data[$k]['dateline'] = $v['dateline'] ? $this->base->date($data[$k]['dateline']) : '';
  38. $data[$k]['appname'] = $this->base->cache['apps'][$v['appid']]['name'];
  39. }
  40. return $data;
  41. }
  42. function delete_mail($ids)
  43. {
  44. $ids = $this->base->implode($ids);
  45. $this->db->query("DELETE FROM " . UC_DBTABLEPRE . "mailqueue WHERE mailid IN ($ids)");
  46. return $this->db->affected_rows();
  47. }
  48. function add($mail)
  49. {
  50. if ($mail['level'])
  51. {
  52. $sql = "INSERT INTO " . UC_DBTABLEPRE . "mailqueue (touid, tomail, subject, message, frommail, charset, htmlon, level, dateline, failures, appid) VALUES ";
  53. $values_arr = array();
  54. foreach ($mail['uids'] as $uid)
  55. {
  56. if (empty($uid))
  57. continue;
  58. $values_arr[] = "('$uid', '', '$mail[subject]', '$mail[message]', '$mail[frommail]', '$mail[charset]', '$mail[htmlon]', '$mail[level]', '$mail[dateline]', '0', '$mail[appid]')";
  59. }
  60. foreach ($mail['emails'] as $email)
  61. {
  62. if (empty($email))
  63. continue;
  64. $values_arr[] = "('', '$email', '$mail[subject]', '$mail[message]', '$mail[frommail]', '$mail[charset]', '$mail[htmlon]', '$mail[level]', '$mail[dateline]', '0', '$mail[appid]')";
  65. }
  66. $sql .= implode(',', $values_arr);
  67. $this->db->query($sql);
  68. $insert_id = $this->db->insert_id();
  69. $insert_id && $this->db->query("REPLACE INTO " . UC_DBTABLEPRE . "vars SET name='mailexists', value='1'");
  70. return $insert_id;
  71. } else
  72. {
  73. $mail['email_to'] = array();
  74. $uids = 0;
  75. foreach ($mail['uids'] as $uid)
  76. {
  77. if (empty($uid))
  78. continue;
  79. $uids .= ',' . $uid;
  80. }
  81. $users = $this->db->fetch_all("SELECT uid, username, email FROM " . UC_DBTABLEPRE . "members WHERE uid IN ($uids)");
  82. foreach ($users as $v)
  83. {
  84. $mail['email_to'][] = $v['username'] . '<' . $v['email'] . '>';
  85. }
  86. foreach ($mail['emails'] as $email)
  87. {
  88. if (empty($email))
  89. continue;
  90. $mail['email_to'][] = $email;
  91. }
  92. $mail['message'] = str_replace('\"', '"', $mail['message']);
  93. $mail['email_to'] = implode(',', $mail['email_to']);
  94. return $this->send_one_mail($mail);
  95. }
  96. }
  97. function send()
  98. {
  99. register_shutdown_function(array($this, '_send'));
  100. }
  101. function _send()
  102. {
  103. $mail = $this->_get_mail();
  104. if (empty($mail))
  105. {
  106. $this->db->query("REPLACE INTO " . UC_DBTABLEPRE . "vars SET name='mailexists', value='0'");
  107. return NULL;
  108. }
  109. else
  110. {
  111. $mail['email_to'] = $mail['tomail'] ? $mail['tomail'] : $mail['username'] . '<' . $mail['email'] . '>';
  112. if ($this->send_one_mail($mail))
  113. {
  114. $this->_delete_one_mail($mail['mailid']);
  115. return true;
  116. }
  117. else
  118. {
  119. $this->_update_failures($mail['mailid']);
  120. return false;
  121. }
  122. }
  123. }
  124. function send_by_id($mailid)
  125. {
  126. if ($this->send_one_mail($this->_get_mail_by_id($mailid)))
  127. {
  128. $this->_delete_one_mail($mailid);
  129. return true;
  130. }
  131. }
  132. function send_one_mail($mail)
  133. {
  134. if (empty($mail))
  135. return;
  136. $mail['email_to'] = $mail['email_to'] ? $mail['email_to'] : $mail['username'] . '<' . $mail['email'] . '>';
  137. $mail_setting = $this->base->settings;
  138. return include UC_ROOT . 'lib/sendmail.inc.php';
  139. }
  140. function _get_mail()
  141. {
  142. $data = $this->db->fetch_first("SELECT m.*, u.username, u.email FROM " . UC_DBTABLEPRE . "mailqueue m LEFT JOIN " . UC_DBTABLEPRE . "members u ON m.touid=u.uid WHERE failures<'" . UC_MAIL_REPEAT . "' ORDER BY level DESC, mailid ASC LIMIT 1");
  143. return $data;
  144. }
  145. function _get_mail_by_id($mailid)
  146. {
  147. $data = $this->db->fetch_first("SELECT m.*, u.username, u.email FROM " . UC_DBTABLEPRE . "mailqueue m LEFT JOIN " . UC_DBTABLEPRE . "members u ON m.touid=u.uid WHERE mailid='$mailid'");
  148. return $data;
  149. }
  150. function _delete_one_mail($mailid)
  151. {
  152. $mailid = intval($mailid);
  153. return $this->db->query("DELETE FROM " . UC_DBTABLEPRE . "mailqueue WHERE mailid='$mailid'");
  154. }
  155. function _update_failures($mailid)
  156. {
  157. $mailid = intval($mailid);
  158. return $this->db->query("UPDATE " . UC_DBTABLEPRE . "mailqueue SET failures=failures+1 WHERE mailid='$mailid'");
  159. }
  160. }