[Web] Add relay host testing tool
This commit is contained in:
		
							
								
								
									
										74
									
								
								data/web/inc/relay_check.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								data/web/inc/relay_check.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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 = "relay@example.org"; | ||||
|   } | ||||
|   $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."; | ||||
| } | ||||
| @@ -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(){ | ||||
|   | ||||
| @@ -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"; | ||||
|   | ||||
| @@ -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"; | ||||
| $lang['success']['relayhost_added'] = "Relayhost %s has been added"; | ||||
| $lang['admin']['relay_from'] = '"From:" address'; | ||||
| $lang['admin']['relay_run'] = "Run test"; | ||||
|   | ||||
| @@ -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="relay@example.org"> | ||||
|               </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 --> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user