mailbox.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <?php
  2. require_once "inc/prerequisites.inc.php";
  3. if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin")) {
  4. require_once "inc/header.inc.php";
  5. $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
  6. ?>
  7. <div class="container">
  8. <div class="row">
  9. <div class="col-md-12">
  10. <div class="panel panel-default">
  11. <div class="panel-heading">
  12. <h3 class="panel-title"><?=$lang['mailbox']['domains'];?> <span class="badge" id="numRowsDomain"></span></h3>
  13. <div class="pull-right">
  14. <span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
  15. <i class="glyphicon glyphicon-filter"></i>
  16. </span>
  17. <?php
  18. if ($_SESSION['mailcow_cc_role'] == "admin"):
  19. ?>
  20. <a href="/add.php?domain"><span class="glyphicon glyphicon-plus"></span></a>
  21. <?php
  22. endif;
  23. ?>
  24. </div>
  25. </div>
  26. <div class="panel-body">
  27. <input type="text" class="form-control" id="domaintable-filter" data-action="filter" data-filters="#domaintable" placeholder="Filter" />
  28. </div>
  29. <div class="table-responsive">
  30. <table class="table table-striped sortable-theme-bootstrap" data-sortable id="domaintable">
  31. <thead>
  32. <tr>
  33. <th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
  34. <th class="sort-table" style="min-width: 81px;"><?=$lang['mailbox']['aliases'];?></th>
  35. <th class="sort-table" style="min-width: 99px;"><?=$lang['mailbox']['mailboxes'];?></th>
  36. <th class="sort-table" style="min-width: 172px;"><?=$lang['mailbox']['mailbox_quota'];?></th>
  37. <th class="sort-table" style="min-width: 117px;"><?=$lang['mailbox']['domain_quota'];?></th>
  38. <?php
  39. if ($_SESSION['mailcow_cc_role'] == "admin"):
  40. ?>
  41. <th class="sort-table" style="min-width: 105px;"><?=$lang['mailbox']['backup_mx'];?></th>
  42. <?php
  43. endif;
  44. ?>
  45. <th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
  46. <th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
  47. </tr>
  48. </thead>
  49. <tbody>
  50. <?php
  51. $domains = mailbox_get_domains();
  52. if (!empty($domains)):
  53. foreach ($domains as $domain):
  54. $domaindata = mailbox_get_domain_details($domain);
  55. ?>
  56. <tr id="data">
  57. <td><?=htmlspecialchars($domaindata['domain_name']);?></td>
  58. <td><?=$domaindata['aliases_in_domain'];?> / <?=$domaindata['max_num_aliases_for_domain'];?></td>
  59. <td><?=$domaindata['mboxes_in_domain'];?> / <?=$domaindata['max_num_mboxes_for_domain'];?></td>
  60. <td><?=formatBytes($domaindata['max_quota_for_mbox']);?></td>
  61. <td><?=formatBytes($domaindata['quota_used_in_domain'], 2);?> / <?=formatBytes($domaindata['max_quota_for_domain'], 2);?></td>
  62. <?php
  63. if ($_SESSION['mailcow_cc_role'] == "admin"):
  64. ?>
  65. <td><?=$domaindata['backupmx'];?></td>
  66. <?php
  67. endif;
  68. ?>
  69. <td><?=$domaindata['active'];?></td>
  70. <?php
  71. if ($_SESSION['mailcow_cc_role'] == "admin"):
  72. ?>
  73. <td style="text-align: right;">
  74. <div class="btn-group">
  75. <a href="/edit.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  76. <a href="/delete.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
  77. </div>
  78. </td>
  79. <?php
  80. else:
  81. ?>
  82. <td style="text-align: right;">
  83. <div class="btn-group">
  84. <a href="/edit.php?domain=<?=urlencode($domaindata['domain_name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  85. </div>
  86. </td>
  87. </tr>
  88. <?php
  89. endif;
  90. endforeach;
  91. else:
  92. ?>
  93. <tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=$lang['mailbox']['no_record_single'];?></td></tr>
  94. <?php
  95. endif;
  96. ?>
  97. </tbody>
  98. <?php
  99. if ($_SESSION['mailcow_cc_role'] == "admin"):
  100. ?>
  101. <tfoot>
  102. <tr id="no-data">
  103. <td colspan="8" style="text-align: center; font-style: normal; border-top: 1px solid #e7e7e7;">
  104. <a href="/add.php?domain"><?=$lang['mailbox']['add_domain'];?></a>
  105. </td>
  106. </tr>
  107. </tfoot>
  108. <?php
  109. endif;
  110. ?>
  111. </table>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="row">
  117. <div class="col-md-12">
  118. <div class="panel panel-default">
  119. <div class="panel-heading">
  120. <h3 class="panel-title"><?=$lang['mailbox']['mailboxes'];?> <span class="badge" id="numRowsMailbox"></span></h3>
  121. <div class="pull-right">
  122. <span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
  123. <i class="glyphicon glyphicon-filter"></i>
  124. </span>
  125. <a href="/add.php?mailbox"><span class="glyphicon glyphicon-plus"></span></a>
  126. </div>
  127. </div>
  128. <div class="panel-body">
  129. <input type="text" class="form-control" id="mailboxtable-filter" data-action="filter" data-filters="#mailboxtable" placeholder="Filter" />
  130. </div>
  131. <div class="table-responsive">
  132. <table class="table table-striped sortable-theme-bootstrap" data-sortable id="mailboxtable">
  133. <thead>
  134. <tr>
  135. <th class="sort-table" style="min-width: 100px;"><?=$lang['mailbox']['username'];?></th>
  136. <th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['fname'];?></th>
  137. <th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
  138. <th class="sort-table" style="min-width: 75px;"><?=$lang['mailbox']['quota'];?></th>
  139. <th class="sort-table" style="min-width: 99px;"><?=$lang['mailbox']['in_use'];?></th>
  140. <th class="sort-table" style="min-width: 100px;"><?=$lang['mailbox']['msg_num'];?></th>
  141. <th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
  142. <th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
  143. </tr>
  144. </thead>
  145. <tbody>
  146. <?php
  147. foreach (mailbox_get_domains() as $domain) {
  148. $mailboxes = mailbox_get_mailboxes($domain);
  149. if (!empty($mailboxes)) {
  150. foreach ($mailboxes as $mailbox) {
  151. $mailboxdata = mailbox_get_mailbox_details($mailbox);
  152. ?>
  153. <tr id="data">
  154. <td><?=($mailboxdata['is_relayed'] == "0") ? htmlspecialchars($mailboxdata['username']) : '<span data-toggle="tooltip" title="Relayed"><i class="glyphicon glyphicon-forward"></i>' . htmlspecialchars($mailboxdata['username']) . '</span>';?></td>
  155. <td><?=htmlspecialchars($mailboxdata['name'], ENT_QUOTES, 'UTF-8');?></td>
  156. <td><?=htmlspecialchars($mailboxdata['domain']);?></td>
  157. <td><?=formatBytes($mailboxdata['quota_used'], 2);?> / <?=formatBytes($mailboxdata['quota'], 2);?></td>
  158. <td style="min-width:120px;">
  159. <div class="progress">
  160. <div class="progress-bar progress-bar-<?=$mailboxdata['percent_class'];?>" role="progressbar" aria-valuenow="<?=$mailboxdata['percent_in_use'];?>" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: <?=$mailboxdata['percent_in_use'];?>%;">
  161. <?=$mailboxdata['percent_in_use'];?>%
  162. </div>
  163. </div>
  164. </td>
  165. <td><?=$mailboxdata['messages'];?></td>
  166. <td><?=$mailboxdata['active'];?></td>
  167. <td style="text-align: right;">
  168. <div class="btn-group">
  169. <a href="/edit.php?mailbox=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  170. <a href="/delete.php?mailbox=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
  171. <?php if ($_SESSION['mailcow_cc_role'] == "admin"): ?>
  172. <a href="/index.php?duallogin=<?=urlencode($mailboxdata['username']);?>" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>
  173. <?php endif; ?>
  174. </div>
  175. </td>
  176. </tr>
  177. <?php
  178. }
  179. }
  180. else {
  181. ?>
  182. <tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
  183. <?php
  184. }
  185. }
  186. ?>
  187. </tbody>
  188. <tfoot>
  189. <tr id="no-data">
  190. <td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
  191. <a href="/add.php?mailbox"><?=$lang['mailbox']['add_mailbox'];?></a>
  192. </td>
  193. </tr>
  194. </tfoot>
  195. </table>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. <div class="row">
  201. <div class="col-md-12">
  202. <div class="panel panel-default">
  203. <div class="panel-heading">
  204. <h3 class="panel-title"><?=$lang['mailbox']['resources'];?> <span class="badge" id="numRowsResource"></span></h3>
  205. <div class="pull-right">
  206. <span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
  207. <i class="glyphicon glyphicon-filter"></i>
  208. </span>
  209. <a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
  210. </div>
  211. </div>
  212. <div class="panel-body">
  213. <input type="text" class="form-control" id="resourcetable-filter" data-action="filter" data-filters="#resourcetable" placeholder="Filter" />
  214. </div>
  215. <div class="table-responsive">
  216. <table class="table table-striped sortable-theme-bootstrap" data-sortable id="resourcetable">
  217. <thead>
  218. <tr>
  219. <th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['description'];?></th>
  220. <th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['kind'];?></th>
  221. <th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
  222. <th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['multiple_bookings'];?></th>
  223. <th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
  224. <th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
  225. </tr>
  226. </thead>
  227. <tbody>
  228. <?php
  229. foreach (mailbox_get_domains() as $domain) {
  230. $resources = mailbox_get_resources($domain);
  231. if (!empty($resources)) {
  232. foreach ($resources as $resource) {
  233. $resourcedata = mailbox_get_resource_details($resource);
  234. ?>
  235. <tr id="data">
  236. <td><?=htmlspecialchars($resourcedata['description'], ENT_QUOTES, 'UTF-8');?></td>
  237. <td><?=$resourcedata['kind'];?></td>
  238. <td><?=htmlspecialchars($resourcedata['domain']);?></td>
  239. <td><?=$resourcedata['multiple_bookings'];?></td>
  240. <td><?=$resourcedata['active'];?></td>
  241. <td style="text-align: right;">
  242. <div class="btn-group">
  243. <a href="/edit.php?resource=<?=urlencode($resourcedata['name']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  244. <a href="/delete.php?resource=<?=urlencode($resourcedata['name']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
  245. </div>
  246. </td>
  247. </tr>
  248. <?php
  249. }
  250. }
  251. else {
  252. ?>
  253. <tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
  254. <?php
  255. }
  256. }
  257. ?>
  258. </tbody>
  259. <tfoot>
  260. <tr id="no-data">
  261. <td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
  262. <a href="/add.php?resource"><?=$lang['mailbox']['add_resource'];?></a>
  263. </td>
  264. </tr>
  265. </tfoot>
  266. </table>
  267. </div>
  268. </div>
  269. </div>
  270. </div>
  271. <div class="row">
  272. <div class="col-md-12">
  273. <div class="panel panel-default">
  274. <div class="panel-heading">
  275. <h3 class="panel-title"><?=$lang['mailbox']['domain_aliases'];?> <span class="badge" id="numRowsDomainAlias"></span></h3>
  276. <div class="pull-right">
  277. <span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
  278. <i class="glyphicon glyphicon-filter"></i>
  279. </span>
  280. <a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
  281. </div>
  282. </div>
  283. <div class="panel-body">
  284. <input type="text" class="form-control" id="domainaliastable-filter" data-action="filter" data-filters="#domainaliastable" placeholder="Filter" />
  285. </div>
  286. <div class="table-responsive">
  287. <table class="table table-striped sortable-theme-bootstrap" data-sortable id="domainaliastable">
  288. <thead>
  289. <tr>
  290. <th class="sort-table" style="min-width: 67px;"><?=$lang['mailbox']['alias'];?></th>
  291. <th class="sort-table" style="min-width: 127px;"><?=$lang['mailbox']['target_domain'];?></th>
  292. <th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
  293. <th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
  294. </tr>
  295. </thead>
  296. <tbody>
  297. <?php
  298. foreach (mailbox_get_domains() as $domain) {
  299. $alias_domains = mailbox_get_alias_domains($domain);
  300. if (!empty($alias_domains)) {
  301. foreach ($alias_domains as $alias_domain) {
  302. $aliasdomaindata = mailbox_get_alias_domain_details($alias_domain);
  303. ?>
  304. <tr id="data">
  305. <td><?=htmlspecialchars($aliasdomaindata['alias_domain']);?></td>
  306. <td><?=htmlspecialchars($aliasdomaindata['target_domain']);?></td>
  307. <td><?=$aliasdomaindata['active'];?></td>
  308. <td style="text-align: right;">
  309. <div class="btn-group">
  310. <a href="/edit.php?aliasdomain=<?=urlencode($aliasdomaindata['alias_domain']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  311. <a href="/delete.php?aliasdomain=<?=urlencode($aliasdomaindata['alias_domain']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
  312. </div>
  313. </td>
  314. </tr>
  315. <?php
  316. }
  317. }
  318. else {
  319. ?>
  320. <tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
  321. <?php
  322. }
  323. }
  324. ?>
  325. </tbody>
  326. <tfoot>
  327. <tr id="no-data">
  328. <td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
  329. <a href="/add.php?aliasdomain"><?=$lang['mailbox']['add_domain_alias'];?></a>
  330. </td>
  331. </tr>
  332. </tfoot>
  333. </table>
  334. </div>
  335. </div>
  336. </div>
  337. </div>
  338. <div class="row">
  339. <div class="col-md-12">
  340. <div class="panel panel-default">
  341. <div class="panel-heading">
  342. <h3 class="panel-title"><?=$lang['mailbox']['aliases'];?> <span class="badge" id="numRowsAlias"></span></h3>
  343. <div class="pull-right">
  344. <span class="clickable filter" data-toggle="tooltip" title="<?=$lang['mailbox']['filter_table'];?>" data-container="body">
  345. <i class="glyphicon glyphicon-filter"></i>
  346. </span>
  347. <a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
  348. </div>
  349. </div>
  350. <div class="panel-body">
  351. <input type="text" class="form-control" id="aliastable-filter" data-action="filter" data-filters="#aliastable" placeholder="Filter" />
  352. </div>
  353. <div class="table-responsive">
  354. <table class="table table-striped sortable-theme-bootstrap" data-sortable id="aliastable">
  355. <thead>
  356. <tr>
  357. <th class="sort-table" style="min-width: 67px;"><?=$lang['mailbox']['alias'];?></th>
  358. <th class="sort-table" style="min-width: 119px;"><?=$lang['mailbox']['target_address'];?></th>
  359. <th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
  360. <th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
  361. <th style="text-align: right; min-width: 200px;" data-sortable="false"><?=$lang['mailbox']['action'];?></th>
  362. </tr>
  363. </thead>
  364. <tbody>
  365. <?php
  366. foreach (array_merge(mailbox_get_domains(), mailbox_get_alias_domains()) as $domain) {
  367. $aliases = mailbox_get_aliases($domain);
  368. if (!empty($aliases)) {
  369. foreach ($aliases as $alias) {
  370. $aliasdata = mailbox_get_alias_details($alias);
  371. ?>
  372. <tr id="data">
  373. <td>
  374. <?= ($aliasdata['is_catch_all'] == "1") ? '<span class="glyphicon glyphicon-pushpin" aria-hidden="true"></span> Catch-all ' . htmlspecialchars($aliasdata['address']) : htmlspecialchars($aliasdata['address']); ?>
  375. </td>
  376. <td>
  377. <?php
  378. foreach(explode(",", $aliasdata['goto']) as $goto) {
  379. echo nl2br(htmlspecialchars($goto.PHP_EOL));
  380. }
  381. ?>
  382. </td>
  383. <td><?=htmlspecialchars($aliasdata['domain']);?></td>
  384. <td><?=$aliasdata['active'];?></td>
  385. <td style="text-align: right;">
  386. <div class="btn-group">
  387. <a href="/edit.php?alias=<?=urlencode($aliasdata['address']);?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['mailbox']['edit'];?></a>
  388. <a href="/delete.php?alias=<?=urlencode($aliasdata['address']);?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['mailbox']['remove'];?></a>
  389. </div>
  390. </td>
  391. </tr>
  392. <?php
  393. }
  394. }
  395. else {
  396. ?>
  397. <tr id="no-data"><td colspan="8" style="text-align: center; font-style: italic;"><?=sprintf($lang['mailbox']['no_record'], $domain);?></td></tr>
  398. <?php
  399. }
  400. }
  401. ?>
  402. </tbody>
  403. <tfoot>
  404. <tr id="no-data">
  405. <td colspan="8" style="text-align: center; border-top: 1px solid #e7e7e7;">
  406. <a href="/add.php?alias"><?=$lang['mailbox']['add_alias'];?></a>
  407. </td>
  408. </tr>
  409. </tfoot>
  410. </table>
  411. </div>
  412. </div>
  413. </div>
  414. </div>
  415. </div> <!-- /container -->
  416. <script src="js/sorttable.js"></script>
  417. <script src="js/mailbox.js"></script>
  418. <?php
  419. require_once("inc/footer.inc.php");
  420. } else {
  421. header('Location: /');
  422. exit();
  423. }
  424. ?>