NobGit
public nobgit read

NobMail

Based on mailcow: dockerized

Languages

Repository composition by tracked source files.

PHP
PHP 49% JavaScript 35% HTML 9% CSS 4% Shell 2% Python 1% Lua 0% Perl 0% Ruby 0% SCSS 0%
Create file Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git

Commit

Merge remote-tracking branch 'origin/feature/bootstrap5' into staging

41d56a86
moo <[email protected]> 3 years, 7 months ago
data/Dockerfiles/dockerapi/Dockerfile              |    11 +-
 data/Dockerfiles/dockerapi/docker-entrypoint.sh    |     9 +
 data/Dockerfiles/dockerapi/dockerapi.py            |   854 +-
 data/Dockerfiles/rspamd/Dockerfile                 |     1 +
 data/Dockerfiles/rspamd/set_worker_password.sh     |    12 +
 data/web/admin.php                                 |     3 +-
 data/web/css/build/001-bootstrap.min.css           |    11 -
 data/web/css/build/002-breakpoint.min.css          |     2 +-
 data/web/css/build/003-bootstrap-select.css        |   487 +
 data/web/css/build/003-bootstrap-select.min.css    |     6 -
 data/web/css/build/006-footable.bootstrap.min.css  |   323 -
 data/web/css/build/007-languages.min.css           |     2 +-
 .../{009-animate.min.css => 008-animate.min.css}   |    20 +-
 ...xtarea.min.css => 009-numberedtextarea.min.css} |     0
 ...ry.jqplot.min.css => 010-jquery.jqplot.min.css} |     0
 data/web/css/build/011-datatables.css              |   693 +
 data/web/css/build/012-Chart.min.css               |     1 -
 ...bootstrap-icons.css => 012-bootstrap-icons.css} |   281 +-
 .../css/build/{008-mailcow.css => 013-mailcow.css} |   136 +-
 data/web/css/build/014-responsive.css              |   220 +-
 data/web/css/build/015-datatables.css              |    80 +
 data/web/css/site/admin.css                        |     1 -
 data/web/css/site/debug.css                        |     1 -
 data/web/css/site/edit.css                         |     1 -
 data/web/css/site/mailbox.css                      |     1 -
 data/web/css/site/quarantine.css                   |     1 -
 data/web/css/site/user.css                         |     1 -
 data/web/css/themes/lumen-bootstrap.css            | 11560 ++++++++++++
 data/web/css/themes/mailcow-darkmode.css           |   360 +
 data/web/debug.php                                 |     9 +
 data/web/edit.php                                  |   104 +-
 data/web/fonts/bootstrap-icons.woff                |   Bin 111976 -> 137124 bytes
 data/web/fonts/bootstrap-icons.woff2               |   Bin 83304 -> 102536 bytes
 .../img/{rspamd_logo.png => rspamd_logo_dark.png}  |   Bin
 data/web/img/rspamd_logo_light.png                 |   Bin 0 -> 7567 bytes
 data/web/inc/ajax/dns_diagnostics.php              |     2 +-
 data/web/inc/functions.customize.inc.php           |    29 +
 data/web/inc/functions.docker.inc.php              |    46 +
 data/web/inc/functions.inc.php                     |     9 +-
 data/web/inc/functions.mailbox.inc.php             |   585 +-
 data/web/inc/header.inc.php                        |     2 +-
 data/web/inc/init_db.inc.php                       |   107 +-
 data/web/inc/prerequisites.inc.php                 |    43 +-
 data/web/inc/vars.inc.php                          |    10 +-
 data/web/index.php                                 |     2 +-
 data/web/js/build/000-jquery-3.6.0.min.js          |     2 +
 data/web/js/build/000-jquery.min.js                |     4 -
 data/web/js/build/001-bootstrap.bundle.min.js      |     7 +
 data/web/js/build/001-bootstrap.min.js             |     7 -
 .../build/{003-slider.min.js => 002-slider.min.js} |     0
 data/web/js/build/003-bootstrap-select.js          |  3603 ++++
 data/web/js/build/004-bootstrap-select.min.js      |     8 -
 data/web/js/build/004-moment.min.js                |     7 +
 data/web/js/build/005-datatables.js                | 18694 +++++++++++++++++++
 data/web/js/build/006-datetime-moment.js           |    70 +
 data/web/js/build/006-notifications.min.js         |     1 -
 data/web/js/build/007-notifications.min.js         |     1 +
 data/web/js/build/008-Chart.min.js                 |     7 -
 data/web/js/build/008-Chartjs-plugin-datalabels.js |     7 -
 .../{007-formcache.min.js => 008-formcache.min.js} |     0
 data/web/js/build/009-chart.js                     | 13269 +++++++++++++
 data/web/js/build/010-chartjs-plugin-datalabels.js |     7 +
 ...textarea.min.js => 011-numberedtextarea.min.js} |     0
 data/web/js/build/011-u2f-api.js                   |   778 -
 .../js/build/{010-sha1.min.js => 012-sha1.min.js}  |     0
 data/web/js/build/{012-api.js => 013-api.js}       |    23 +-
 data/web/js/build/013-bootstrap-tabcollapse.js     |   239 -
 data/web/js/build/013-footable.min.js              |    10 -
 data/web/js/build/014-markdown-it.min.js           |     3 +
 .../js/build/{014-mailcow.js => 015-mailcow.js}    |   161 +-
 data/web/js/site/admin.js                          |   660 +-
 data/web/js/site/debug.js                          |  1576 +-
 data/web/js/site/edit.js                           |   162 +-
 data/web/js/site/index.js                          |     2 +
 data/web/js/site/mailbox.js                        |  2553 ++-
 data/web/js/site/qhandler.js                       |    10 +-
 data/web/js/site/quarantine.js                     |   183 +-
 data/web/js/site/queue.js                          |   123 +
 data/web/js/site/user.js                           |   513 +-
 data/web/json_api.php                              |   138 +-
 data/web/lang/lang.ca-es.json                      |    22 +-
 data/web/lang/lang.cs-cz.json                      |    45 +-
 data/web/lang/lang.da-dk.json                      |    42 +-
 data/web/lang/lang.de-de.json                      |   100 +-
 data/web/lang/lang.en-gb.json                      |   102 +-
 data/web/lang/lang.es-es.json                      |    33 +-
 data/web/lang/lang.fi-fi.json                      |    39 +-
 data/web/lang/lang.fr-fr.json                      |    45 +-
 data/web/lang/lang.hu-hu.json                      |    19 +-
 data/web/lang/lang.it-it.json                      |    43 +-
 data/web/lang/lang.ko-kr.json                      |    43 +-
 data/web/lang/lang.lv-lv.json                      |    23 +-
 data/web/lang/lang.nl-nl.json                      |    43 +-
 data/web/lang/lang.pl-pl.json                      |    22 +-
 data/web/lang/lang.pt-pt.json                      |    24 +-
 data/web/lang/lang.ro-ro.json                      |    45 +-
 data/web/lang/lang.ru-ru.json                      |    45 +-
 data/web/lang/lang.sk-sk.json                      |    45 +-
 data/web/lang/lang.sv-se.json                      |    45 +-
 data/web/lang/lang.uk-ua.json                      |    34 +-
 data/web/lang/lang.zh-cn.json                      |    36 +-
 data/web/lang/lang.zh-tw.json                      |    13 +
 data/web/mailbox.php                               |     2 +
 data/web/quarantine.php                            |     1 +
 data/web/queue.php                                 |    26 +
 data/web/templates/admin.twig                      |   114 +-
 data/web/templates/admin/tab-config-admins.twig    |   385 +-
 data/web/templates/admin/tab-config-customize.twig |    76 +-
 data/web/templates/admin/tab-config-dkim.twig      |   135 +-
 data/web/templates/admin/tab-config-f2b.twig       |    57 +-
 data/web/templates/admin/tab-config-fwdhosts.twig  |    40 +-
 data/web/templates/admin/tab-config-oauth2.twig    |    34 +-
 .../admin/tab-config-password-policy.twig          |    27 +-
 .../web/templates/admin/tab-config-quarantine.twig |    62 +-
 data/web/templates/admin/tab-config-quota.twig     |    28 +-
 data/web/templates/admin/tab-config-rsettings.twig |    36 +-
 data/web/templates/admin/tab-config-rspamd.twig    |    41 +-
 .../templates/admin/tab-globalfilter-regex.twig    |    33 +-
 data/web/templates/admin/tab-ldap.twig             |    13 +-
 data/web/templates/admin/tab-mailq.twig            |    44 -
 data/web/templates/admin/tab-routing.twig          |    94 +-
 data/web/templates/admin/tab-sys-mails.twig        |    49 +-
 data/web/templates/base.twig                       |   128 +-
 data/web/templates/debug.twig                      |   684 +-
 data/web/templates/domainadmin.twig                |    36 +-
 data/web/templates/edit.twig                       |    12 +-
 data/web/templates/edit/admin.twig                 |    20 +-
 data/web/templates/edit/alias.twig                 |    22 +-
 data/web/templates/edit/aliasdomain.twig           |    36 +-
 data/web/templates/edit/app-passwd.twig            |    18 +-
 data/web/templates/edit/bcc.twig                   |    14 +-
 data/web/templates/edit/domain-templates.twig      |   136 +
 data/web/templates/edit/domain.twig                |   123 +-
 data/web/templates/edit/domainadmin.twig           |    40 +-
 data/web/templates/edit/filter.twig                |    16 +-
 data/web/templates/edit/mailbox-templates.twig     |   169 +
 data/web/templates/edit/mailbox.twig               |   283 +-
 data/web/templates/edit/oauth2client.twig          |    14 +-
 data/web/templates/edit/recipient_map.twig         |    14 +-
 data/web/templates/edit/relayhost.twig             |    18 +-
 data/web/templates/edit/resource.twig              |    16 +-
 data/web/templates/edit/syncjob.twig               |    72 +-
 data/web/templates/edit/tls_policy_map.twig        |    16 +-
 data/web/templates/edit/transport.twig             |    22 +-
 data/web/templates/fido2.twig                      |     2 +-
 data/web/templates/index.twig                      |    87 +-
 data/web/templates/mailbox.twig                    |    86 +-
 data/web/templates/mailbox/page-size.twig          |     6 -
 data/web/templates/mailbox/tab-bcc.twig            |   155 +-
 data/web/templates/mailbox/tab-domain-aliases.twig |    72 +-
 data/web/templates/mailbox/tab-domains.twig        |    83 +-
 data/web/templates/mailbox/tab-filters.twig        |   157 +-
 .../templates/mailbox/tab-mailbox-defaults.twig    |    10 -
 data/web/templates/mailbox/tab-mailboxes.twig      |   322 +-
 data/web/templates/mailbox/tab-mbox-aliases.twig   |    94 +-
 data/web/templates/mailbox/tab-resources.twig      |    81 +-
 data/web/templates/mailbox/tab-syncjobs.twig       |    78 +-
 .../templates/mailbox/tab-templates-domains.twig   |    51 +
 data/web/templates/mailbox/tab-templates-mbox.twig |    51 +
 data/web/templates/mailbox/tab-tls-policy.twig     |    74 +-
 data/web/templates/modals/admin.twig               |   144 +-
 data/web/templates/modals/footer.twig              |   180 +-
 data/web/templates/modals/mailbox.twig             |   908 +-
 data/web/templates/modals/quarantine.twig          |    44 +-
 data/web/templates/modals/queue.twig               |    14 +
 data/web/templates/modals/user.twig                |   174 +-
 data/web/templates/oauth/authorize.twig            |    10 +-
 data/web/templates/qhandler.twig                   |    35 +-
 data/web/templates/quarantine.twig                 |    86 +-
 data/web/templates/queue.twig                      |    61 +
 data/web/templates/tfa_keys.twig                   |     8 +-
 data/web/templates/user.twig                       |    63 +-
 data/web/templates/user/AppPasswds.twig            |    68 +-
 data/web/templates/user/Pushover.twig              |   140 +-
 data/web/templates/user/SpamAliases.twig           |    75 +-
 data/web/templates/user/Spamfilter.twig            |   154 +-
 data/web/templates/user/Syncjobs.twig              |    66 +-
 data/web/templates/user/tab-user-auth.twig         |   108 +-
 data/web/templates/user/tab-user-details.twig      |    33 +-
 data/web/templates/user/tab-user-settings.twig     |    87 +-
 data/web/templates/user_domainadmin_common.twig    |     1 +
 data/web/user.php                                  |     1 +
 docker-compose.yml                                 |     7 +-
 183 files changed, 60010 insertions(+), 6834 deletions(-)
 create mode 100755 data/Dockerfiles/dockerapi/docker-entrypoint.sh
 create mode 100755 data/Dockerfiles/rspamd/set_worker_password.sh
 delete mode 100644 data/web/css/build/001-bootstrap.min.css
 create mode 100644 data/web/css/build/003-bootstrap-select.css
 delete mode 100644 data/web/css/build/003-bootstrap-select.min.css
 delete mode 100644 data/web/css/build/006-footable.bootstrap.min.css
 rename data/web/css/build/{009-animate.min.css => 008-animate.min.css} (99%)
 rename data/web/css/build/{010-numberedtextarea.min.css => 009-numberedtextarea.min.css} (100%)
 rename data/web/css/build/{011-jquery.jqplot.min.css => 010-jquery.jqplot.min.css} (100%)
 create mode 100644 data/web/css/build/011-datatables.css
 delete mode 100644 data/web/css/build/012-Chart.min.css
 rename data/web/css/build/{013-bootstrap-icons.css => 012-bootstrap-icons.css} (83%)
 rename data/web/css/build/{008-mailcow.css => 013-mailcow.css} (71%)
 create mode 100644 data/web/css/build/015-datatables.css
 create mode 100644 data/web/css/themes/lumen-bootstrap.css
 create mode 100644 data/web/css/themes/mailcow-darkmode.css
 rename data/web/img/{rspamd_logo.png => rspamd_logo_dark.png} (100%)
 create mode 100644 data/web/img/rspamd_logo_light.png
 create mode 100644 data/web/js/build/000-jquery-3.6.0.min.js
 delete mode 100644 data/web/js/build/000-jquery.min.js
 create mode 100644 data/web/js/build/001-bootstrap.bundle.min.js
 delete mode 100644 data/web/js/build/001-bootstrap.min.js
 rename data/web/js/build/{003-slider.min.js => 002-slider.min.js} (100%)
 create mode 100644 data/web/js/build/003-bootstrap-select.js
 delete mode 100644 data/web/js/build/004-bootstrap-select.min.js
 create mode 100644 data/web/js/build/004-moment.min.js
 create mode 100644 data/web/js/build/005-datatables.js
 create mode 100644 data/web/js/build/006-datetime-moment.js
 delete mode 100644 data/web/js/build/006-notifications.min.js
 create mode 100644 data/web/js/build/007-notifications.min.js
 delete mode 100644 data/web/js/build/008-Chart.min.js
 delete mode 100644 data/web/js/build/008-Chartjs-plugin-datalabels.js
 rename data/web/js/build/{007-formcache.min.js => 008-formcache.min.js} (100%)
 create mode 100644 data/web/js/build/009-chart.js
 create mode 100644 data/web/js/build/010-chartjs-plugin-datalabels.js
 rename data/web/js/build/{009-numberedtextarea.min.js => 011-numberedtextarea.min.js} (100%)
 delete mode 100644 data/web/js/build/011-u2f-api.js
 rename data/web/js/build/{010-sha1.min.js => 012-sha1.min.js} (100%)
 rename data/web/js/build/{012-api.js => 013-api.js} (91%)
 delete mode 100644 data/web/js/build/013-bootstrap-tabcollapse.js
 delete mode 100644 data/web/js/build/013-footable.min.js
 create mode 100644 data/web/js/build/014-markdown-it.min.js
 rename data/web/js/build/{014-mailcow.js => 015-mailcow.js} (66%)
 create mode 100644 data/web/js/site/queue.js
 create mode 100644 data/web/queue.php
 delete mode 100644 data/web/templates/admin/tab-mailq.twig
 create mode 100644 data/web/templates/edit/domain-templates.twig
 create mode 100644 data/web/templates/edit/mailbox-templates.twig
 delete mode 100644 data/web/templates/mailbox/page-size.twig
 delete mode 100644 data/web/templates/mailbox/tab-mailbox-defaults.twig
 create mode 100644 data/web/templates/mailbox/tab-templates-domains.twig
 create mode 100644 data/web/templates/mailbox/tab-templates-mbox.twig
 create mode 100644 data/web/templates/modals/queue.twig
 create mode 100644 data/web/templates/queue.twig

Diff

diff --cc data/web/templates/edit/mailbox.twig
index 7f5bc26e,73f75ab5..ce01a659
--- a/data/web/templates/edit/mailbox.twig
+++ b/data/web/templates/edit/mailbox.twig
@@@ -271,44 -270,33 +270,33 @@@
        <input type="hidden" value="0" name="active">
        <div class="row">
          <div class="col-sm-1">
-           <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
+           <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
          </div>
          <div class="col-sm-10">
-           <p class="help-block">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
-           <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}, <code>{MSG_ID}</code></p>
-           <div class="form-group">
-             <div class="row">
-               <div class="col-sm-6">
-                 <div class="form-group">
-                   <label for="token">API Token/Key (Application)</label>
-                   <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
-                 </div>
-               </div>
-               <div class="col-sm-6">
-                 <div class="form-group">
-                   <label for="key">User/Group Key</label>
-                   <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
-                 </div>
-               </div>
-               <div class="col-sm-6">
-                 <div class="form-group">
-                   <label for="title">{{ lang.edit.pushover_title }}</label>
-                   <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
-                 </div>
-               </div>
-               <div class="col-sm-6">
-                 <div class="form-group">
-                   <label for="text">{{ lang.edit.pushover_text }}</label>
-                   <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
-                 </div>
-               </div>
-               <div class="col-sm-12">
-                 <div class="form-group">
-                   <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
-                   <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
-                 </div>
-               </div>
-               <div class="col-sm-12">
+           <p class="text-muted">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
 -          <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p>
++          <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}, <code>{MSG_ID}</code></p>
+           <div class="row">
+             <div class="col-sm-6 mb-2">
+               <label for="token">API Token/Key (Application)</label>
+               <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+             </div>
+             <div class="col-sm-6 mb-2">
+               <label for="key">User/Group Key</label>
+               <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+             </div>
+             <div class="col-sm-6 mb-4">
+               <label for="title">{{ lang.edit.pushover_title }}</label>
+               <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+             </div>
+             <div class="col-sm-6 mb-4">
+               <label for="text">{{ lang.edit.pushover_text }}</label>
+               <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+             </div>
+             <div class="col-sm-12 mb-4">
+               <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
+               <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+             </div>
+             <div class="col-sm-12 mb-2">
                  <div class="form-group">
                    <label for="sound">{{ lang.edit.pushover_sound }}</label><br>
                    <select name="sound" class="form-control">
diff --cc data/web/templates/user/Pushover.twig
index 8a0a07d4,cf40c888..d3304dbe
--- a/data/web/templates/user/Pushover.twig
+++ b/data/web/templates/user/Pushover.twig
@@@ -1,48 -1,55 +1,55 @@@
- <div role="tabpanel" class="tab-pane" id="Pushover">
-   <form data-id="pushover" class="form well" method="post">
-     <input type="hidden" value="0" name="evaluate_x_prio">
-     <input type="hidden" value="0" name="only_x_prio">
-     <input type="hidden" value="0" name="active">
-     <div class="row">
-       <div class="col-sm-1">
-         <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
-       </div>
-       <div class="col-sm-10">
-         <p class="help-block">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p>
-         <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
-         <div class="form-group">
-           <div class="row">
-             <div class="col-sm-6">
-               <div class="form-group">
-                 <label for="token">API Token/Key (Application)</label>
-                 <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+ <div role="tabpanel" class="tab-pane fade" id="Pushover" role="tabpanel" aria-labelledby="Pushover">
+   <div class="card mb-4">
+     <div class="card-header d-flex fs-5">
+       <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-Pushover" data-bs-toggle="collapse" aria-controls="collapse-tab-Pushover">
+         Pushover API
+       </button>
+       <span class="d-none d-md-block">Pushover API
+     </div>
+     <div id="collapse-tab-Pushover" class="card-body collapse" data-bs-parent="#user-content">
+       <form data-id="pushover" class="form well" method="post">
+         <input type="hidden" value="0" name="evaluate_x_prio">
+         <input type="hidden" value="0" name="only_x_prio">
+         <input type="hidden" value="0" name="active">
+         <div class="row">
+           <div class="col-sm-1">
+             <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
+           </div>
+           <div class="col-sm-10">
+             <p class="text-muted">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p>
 -            <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p>
++            <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
+             <div class="row">
+               <div class="col-sm-6 mb-2">
+                 <div class="form-group">
+                   <label for="token">API Token/Key (Application)</label>
+                   <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+                 </div>
                </div>
-             </div>
-             <div class="col-sm-6">
-               <div class="form-group">
-                 <label for="key">User/Group Key</label>
-                 <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+               <div class="col-sm-6 mb-2">
+                 <div class="form-group">
+                   <label for="key">User/Group Key</label>
+                   <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+                 </div>
                </div>
-             </div>
-             <div class="col-sm-6">
-               <div class="form-group">
-                 <label for="title">{{ lang.user.pushover_title }}</label>
-                 <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+               <div class="col-sm-6 mb-2">
+                 <div class="form-group">
+                   <label for="title">{{ lang.user.pushover_title }}</label>
+                   <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+                 </div>
                </div>
-             </div>
-             <div class="col-sm-6">
-               <div class="form-group">
-                 <label for="text">{{ lang.user.pushover_text }}</label>
-                 <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+               <div class="col-sm-6 mb-2">
+                 <div class="form-group">
+                   <label for="text">{{ lang.user.pushover_text }}</label>
+                   <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+                 </div>
                </div>
-             </div>
-             <div class="col-sm-12">
-               <div class="form-group">
-                 <label for="text">{{ lang.user.pushover_sender_array|raw }}</label>
-                 <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+               <div class="col-sm-12 mb-4">
+                 <div class="form-group">
+                   <label for="text">{{ lang.user.pushover_sender_array|raw }}</label>
+                   <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+                 </div>
                </div>
-             </div>
-             <div class="col-sm-12">
+               <div class="col-sm-12 mb-2">
                <div class="form-group">
                  <label for="sound">{{ lang.edit.pushover_sound }}</label><br>
                  <select name="sound" class="form-control">