public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
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
[Web] Add relay host testing tool
3bd7383b
data/web/inc/relay_check.php | 74 ++++++++++++++++++++++++++++++++++++++++++++
data/web/js/admin.js | 30 +++++++++++++++++-
data/web/lang/lang.de.php | 32 ++++++++++---------
data/web/lang/lang.en.php | 32 ++++++++++---------
data/web/modals/admin.php | 31 ++++++++++++++++++-
5 files changed, 167 insertions(+), 32 deletions(-)
create mode 100644 data/web/inc/relay_check.php
Diff
diff --git a/data/web/inc/relay_check.php b/data/web/inc/relay_check.php
new file mode 100644
index 00000000..575a8ad8
--- /dev/null
+++ b/data/web/inc/relay_check.php
@@ -0,0 +1,74 @@
+<?php
+require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';
+require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/vars.inc.php';
+
+error_reporting(0);
+if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") {
+ $relayhost_id = intval($_GET['relayhost_id']);
+ if (isset($_GET['mail_from']) && filter_var($_GET['mail_from'], FILTER_VALIDATE_EMAIL)) {
+ $mail_from = $_GET['mail_from'];
+ }
+ else {
+ $mail_from = "[email protected]";
+ }
+ $relayhost_details = relayhost('details', $relayhost_id);
+ if (!empty($relayhost_details)) {
+ // Remove [ and ]
+ $hostname_w_port = preg_replace('/\[|\]/', '', $relayhost_details['hostname']);
+ // Explode to hostname and port
+ list($hostname, $port) = explode(':', $hostname_w_port);
+ // Use port 25 if no port was given
+ $port = (empty($port)) ? 25 : $port;
+ $username = $relayhost_details['username'];
+ $password = $relayhost_details['password'];
+
+ $mail = new PHPMailer;
+
+ $mail->SMTPDebug = 3;
+ $mail->Debugoutput = function($str, $level) {
+ foreach(preg_split("/((\r?\n)|(\r\n?)|\n)/", $str) as $line){
+ if (empty($line)) { continue; }
+ if (preg_match("/SERVER \-\> CLIENT: 2\d\d.+/i", $line)) {
+ echo '<span style="color:darkgreen;font-weight:bold">' . htmlspecialchars($line) . '</span><br>';
+ }
+ elseif (preg_match("/SERVER \-\> CLIENT: 3\d\d.+/i", $line)) {
+ echo '<span style="color:lightgreen;font-weight:bold">' . htmlspecialchars($line) . '</span><br>';
+ }
+ elseif (preg_match("/SERVER \-\> CLIENT: 4\d\d.+/i", $line)) {
+ echo '<span style="color:yellow;font-weight:bold">' . htmlspecialchars($line) . '</span><br>';
+ }
+ elseif (preg_match("/SERVER \-\> CLIENT: 5\d\d.+/i", $line)) {
+ echo '<span style="color:red;font-weight:bold">' . htmlspecialchars($line) . '</span><br>';
+ }
+ elseif (preg_match("/CLIENT \-\> SERVER:.+/i", $line)) {
+ echo '<span style="color:#999;font-weight:bold">' . htmlspecialchars($line) . '</span><br>';
+ }
+ elseif (preg_match("/^(?!SERVER|CLIENT|Connection:|\)).+$/i", $line)) {
+ echo '<span> ↪ ' . htmlspecialchars($line) . '</span><br>';
+ }
+ else {
+ echo htmlspecialchars($line) . '<br>';
+ }
+ }
+ };
+ $mail->isSMTP();
+ $mail->Host = $hostname;
+ if (!empty($username)) {
+ $mail->SMTPAuth = true;
+ $mail->Username = $username;
+ $mail->Password = $password;
+ $mail->Port = $port;
+ }
+ $mail->setFrom($mail_from, 'Mailer');
+ $mail->Subject = 'A subject for a SMTP test';
+ $mail->addAddress($RELAY_TO, 'Joe Null');
+ $mail->Body = 'This is our test body';
+ $mail->send();
+ }
+ else {
+ echo "Unknown relayhost.";
+ }
+}
+else {
+ echo "Permission denied.";
+}
\ No newline at end of file
diff --git a/data/web/js/admin.js b/data/web/js/admin.js
index 9676bd5a..fb255437 100644
--- a/data/web/js/admin.js
+++ b/data/web/js/admin.js
@@ -337,7 +337,7 @@ jQuery(function($){
{"name":"username","title":lang.username,"breakpoints":"xs sm"},
{"name":"used_by_domains","title":lang.in_use_by, "type": "text","breakpoints":"xs sm"},
{"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+ {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"280px","width":"280px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"rows": $.ajax({
dataType: 'json',
@@ -349,6 +349,8 @@ jQuery(function($){
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
+ '<a href="#" data-toggle="modal" id="miau" data-target="#testRelayhostModal" data-relayhost-id="' + encodeURI(item.id) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-stats"></span> Test</a>' +
+ '<a href="/edit.php?relayhost=' + encodeURI(item.id) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-rlshost" data-api-url="delete/relayhost" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="rlyhosts" name="multi_select" value="' + item.id + '" />';
@@ -544,6 +546,32 @@ jQuery(function($){
draw_fwd_hosts();
draw_relayhosts();
draw_rspamd_history();
+
+ $('#testRelayhostModal').on('show.bs.modal', function (e) {
+ $('#test_relayhost_result').text("-");
+ button = $(e.relatedTarget)
+ if (button != null) {
+ $('#relayhost_id').val(button.data('relayhost-id'));
+ }
+ })
+
+ $('#test_relayhost').on('click', function (e) {
+ e.preventDefault();
+ prev = $('#test_relayhost').text();
+ $(this).prop("disabled",true);
+ $(this).html('<span class="glyphicon glyphicon-refresh glyphicon-spin"></span> ');
+ $.ajax({
+ type: 'GET',
+ url: 'inc/relay_check.php',
+ dataType: 'text',
+ data: $('#test_relayhost_form').serialize(),
+ complete: function (data) {
+ $('#test_relayhost_result').html(data.responseText);
+ $('#test_relayhost').prop("disabled",false);
+ $('#test_relayhost').text(prev);
+ }
+ });
+ })
});
$(window).load(function(){
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index 893f3d04..7a2378cf 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -349,35 +349,35 @@ $lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Aktiv';
$lang['add']['multiple_bookings'] = 'Mehrfaches Buchen möglich';
$lang['add']['save'] = 'Änderungen speichern';
-$lang['add']['description'] = 'Beschreibung:';
-$lang['add']['max_aliases'] = 'Max. mögliche Aliasse:';
-$lang['add']['max_mailboxes'] = 'Max. mögliche Mailboxen:';
-$lang['add']['mailbox_quota_m'] = 'Max. Speicherplatz pro Mailbox (MiB):';
-$lang['add']['domain_quota_m'] = 'Domain Speicherplatz gesamt (MiB):';
-$lang['add']['backup_mx_options'] = 'Backup MX Optionen:';
+$lang['add']['description'] = 'Beschreibung';
+$lang['add']['max_aliases'] = 'Max. mögliche Aliasse';
+$lang['add']['max_mailboxes'] = 'Max. mögliche Mailboxen';
+$lang['add']['mailbox_quota_m'] = 'Max. Speicherplatz pro Mailbox (MiB)';
+$lang['add']['domain_quota_m'] = 'Domain Speicherplatz gesamt (MiB)';
+$lang['add']['backup_mx_options'] = 'Backup MX Optionen';
$lang['add']['relay_all'] = 'Alle Empfänger-Adressen relayen';
$lang['add']['relay_domain'] = 'Relay Domain';
$lang['add']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
$lang['add']['alias'] = 'Alias(se)';
$lang['add']['alias_spf_fail'] = '<b>Hinweis:</b> Wählen Sie ein externes Postfach als Ziel-Adresse, kann es unter Umständen zu fehlerhaften Spam-Erkennungen <b>beim Empfänger</b> kommen. Weitere Informationen zu diesem Thema finden Sie <a href="https://www.heinlein-support.de/blog/news/gmx-de-und-web-de-haben-mail-rejects-durch-spf/" target="_blank">hier.</a>';
-$lang['add']['alias_address'] = 'Alias-Adresse(n):';
+$lang['add']['alias_address'] = 'Alias-Adresse(n)';
$lang['add']['alias_address_info'] = '<small>Vollständige E-Mail-Adresse(n) oder @example.com, um alle Nachrichten einer Domain weiterzuleiten. Getrennt durch Komma. <b>Nur eigene Domains</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Nur gültige Domains. Getrennt durch Komma.</small>';
-$lang['add']['target_address'] = 'Ziel-Adresse(n):';
+$lang['add']['target_address'] = 'Ziel-Adresse(n)';
$lang['add']['target_address_info'] = '<small>Vollständige E-Mail-Adresse(n). Getrennt durch Komma.</small>';
$lang['add']['alias_domain'] = 'Alias-Domain';
$lang['add']['select'] = 'Bitte auswählen';
-$lang['add']['target_domain'] = 'Ziel-Domain:';
+$lang['add']['target_domain'] = 'Ziel-Domain';
$lang['add']['mailbox'] = 'Mailbox';
$lang['add']['resource'] = 'Ressource';
$lang['add']['kind'] = 'Art';
-$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse):';
-$lang['add']['resource_name'] = 'Ressourcenname:';
-$lang['add']['full_name'] = 'Vor- und Zuname:';
-$lang['add']['quota_mb'] = 'Speicherplatz (MiB):';
+$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse)';
+$lang['add']['resource_name'] = 'Ressourcenname';
+$lang['add']['full_name'] = 'Vor- und Zuname';
+$lang['add']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['add']['select_domain'] = 'Bitte zuerst eine Domain auswählen';
-$lang['add']['password'] = 'Passwort:';
-$lang['add']['password_repeat'] = 'Passwort (Wiederholung):';
+$lang['add']['password'] = 'Passwort';
+$lang['add']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['add']['previous'] = 'Vorherige Seite';
$lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
@@ -502,3 +502,5 @@ $lang['success']['forwarding_host_removed'] = "Weiterleitungs-Host %s wurde entf
$lang['success']['forwarding_host_added'] = "Weiterleitungs-Host %s wurde hinzugefügt";
$lang['success']['relayhost_removed'] = "Relayhost %s wurde entfernt";
$lang['success']['relayhost_added'] = "Relayhost %s wurde hinzugefügt";
+$lang['admin']['relay_from'] = "Absenderadresse";
+$lang['admin']['relay_run'] = "Test durchführen";
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index f7af1b32..9c28de7b 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -354,35 +354,35 @@ $lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Active';
$lang['add']['multiple_bookings'] = 'Multiple bookings';
$lang['add']['save'] = 'Save changes';
-$lang['add']['description'] = 'Description:';
-$lang['add']['max_aliases'] = 'Max. possible aliases:';
+$lang['add']['description'] = 'Description';
+$lang['add']['max_aliases'] = 'Max. possible aliases';
$lang['add']['resource_name'] = 'Resource name';
-$lang['add']['max_mailboxes'] = 'Max. possible mailboxes:';
-$lang['add']['mailbox_quota_m'] = 'Max. quota per mailbox (MiB):';
-$lang['add']['domain_quota_m'] = 'Total domain quota (MiB):';
-$lang['add']['backup_mx_options'] = 'Backup MX options:';
+$lang['add']['max_mailboxes'] = 'Max. possible mailboxes';
+$lang['add']['mailbox_quota_m'] = 'Max. quota per mailbox (MiB)';
+$lang['add']['domain_quota_m'] = 'Total domain quota (MiB)';
+$lang['add']['backup_mx_options'] = 'Backup MX options';
$lang['add']['relay_all'] = 'Relay all recipients';
$lang['add']['relay_domain'] = 'Relay this domain';
$lang['add']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['add']['alias'] = 'Alias(es)';
$lang['add']['alias_spf_fail'] = '<b>Note:</b> If your chosen destination address is an external mailbox, the <b>receiving mailserver</b> may reject your message due to an SPF failure.</a>';
-$lang['add']['alias_address'] = 'Alias address/es:';
+$lang['add']['alias_address'] = 'Alias address/es';
$lang['add']['alias_address_info'] = '<small>Full email address/es or @example.com, to catch all messages for a domain (comma-separated). <b>mailcow domains only</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Valid domain names only (comma-separated).</small>';
-$lang['add']['target_address'] = 'Goto addresses:';
+$lang['add']['target_address'] = 'Goto addresses';
$lang['add']['target_address_info'] = '<small>Full email address/es (comma-separated).</small>';
$lang['add']['alias_domain'] = 'Alias domain';
$lang['add']['select'] = 'Please select...';
-$lang['add']['target_domain'] = 'Target domain:';
+$lang['add']['target_domain'] = 'Target domain';
$lang['add']['mailbox'] = 'Mailbox';
$lang['add']['resource'] = 'Resource';
$lang['add']['kind'] = 'Kind';
-$lang['add']['mailbox_username'] = 'Username (left part of an email address):';
-$lang['add']['full_name'] = 'Full name:';
-$lang['add']['quota_mb'] = 'Quota (MiB):';
+$lang['add']['mailbox_username'] = 'Username (left part of an email address)';
+$lang['add']['full_name'] = 'Full name';
+$lang['add']['quota_mb'] = 'Quota (MiB)';
$lang['add']['select_domain'] = 'Please select a domain first';
-$lang['add']['password'] = 'Password:';
-$lang['add']['password_repeat'] = 'Confirmation password (repeat):';
+$lang['add']['password'] = 'Password';
+$lang['add']['password_repeat'] = 'Confirmation password (repeat)';
$lang['add']['previous'] = 'Previous page';
$lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
@@ -514,4 +514,6 @@ $lang['delete']['remove_forwardinghost_warning'] = '<b>Warning:</b> You are abou
$lang['success']['forwarding_host_removed'] = "Forwarding host %s has been removed";
$lang['success']['forwarding_host_added'] = "Forwarding host %s has been added";
$lang['success']['relayhost_removed'] = "Relayhost %s has been removed";
-$lang['success']['relayhost_added'] = "Relayhost %s has been added";
\ No newline at end of file
+$lang['success']['relayhost_added'] = "Relayhost %s has been added";
+$lang['admin']['relay_from'] = '"From:" address';
+$lang['admin']['relay_run'] = "Run test";
diff --git a/data/web/modals/admin.php b/data/web/modals/admin.php
index 5c9a2256..cce43b47 100644
--- a/data/web/modals/admin.php
+++ b/data/web/modals/admin.php
@@ -4,8 +4,8 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
exit();
}
?>
-<div class="modal fade" id="addDomainAdminModal" tabindex="-1" role="dialog" aria-hidden="true">
<!-- add domain admin modal -->
+<div class="modal fade" id="addDomainAdminModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
@@ -62,3 +62,32 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
</div>
</div>
</div><!-- add domain admin modal -->
+<!-- test relayhost modal -->
+<div class="modal fade" id="testRelayhostModal" tabindex="-1" role="dialog" aria-hidden="true">
+ <div class="modal-dialog modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
+ <h3 class="modal-title"><span class="glyphicon glyphicon-stats"></span> Relayhost</h3>
+ </div>
+ <div class="modal-body">
+ <form class="form-horizontal" id="test_relayhost_form" role="form" method="post">
+ <input type="hidden" class="form-control" name="relayhost_id" id="relayhost_id">
+ <div class="form-group">
+ <label class="control-label col-sm-2" for="mail_from"><?=$lang['admin']['relay_from'];?></label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" name="mail_from" id="mail_from" placeholder="[email protected]">
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="col-sm-offset-2 col-sm-10">
+ <button class="btn btn-default" id="test_relayhost" href="#"><?=$lang['admin']['relay_run'];?></button>
+ </div>
+ </div>
+ </form>
+ <hr>
+ <div id="test_relayhost_result" style="font-size:10pt">-</div>
+ </div>
+ </div>
+ </div>
+</div><!-- test relayhost modal -->