diff --git a/mo/web/acct.py b/mo/web/acct.py
index e4b8d5f0dab497222410729b07e48e8a8e1181f8..1051ecc72efca5d12d133a245a6bcfcb0af0660f 100644
--- a/mo/web/acct.py
+++ b/mo/web/acct.py
@@ -780,6 +780,30 @@ def user_validate_email():
     return render_template('acct_validate_email.html', form=form)
 
 
+def make_dsn_check_token(rr: db.RegRequest) -> str:
+    return mo.tokens.sign_token([str(rr.reg_id)], 'dsn-check')
+
+
+@app.route('/acct/dsn-check/<token>')
+def dsn_check(token):
+    # Jelikož nevyžadujeme login, nechceme předávat v URL přímo IDčka do databáze.
+    # Místo toho předáváme podepsaný token obsahující IDčko.
+    fields = mo.tokens.verify_token(token, 'dsn-check')
+    if not fields:
+        raise werkzeug.exceptions.NotFound()
+
+    reg_id = int(fields[0])
+    sess = db.get_session()
+    reg = sess.query(db.RegRequest).options(joinedload(db.RegRequest.dsn)).get(reg_id)
+    if not reg:
+        raise werkzeug.exceptions.NotFound()
+
+    if reg.dsn is not None:
+        return render_template('acct_dsn_check.html', dsn=reg.dsn)
+    else:
+        return ""
+
+
 if getattr(config, 'INSECURE_TEST_LOGIN', False):
     @app.route('/test-login/<email>')
     def test_login(email: str):
diff --git a/mo/web/templates/acct_dsn_check.html b/mo/web/templates/acct_dsn_check.html
new file mode 100644
index 0000000000000000000000000000000000000000..5b14c3549c2429c01239a7e824e53dba3a705503
--- /dev/null
+++ b/mo/web/templates/acct_dsn_check.html
@@ -0,0 +1,22 @@
+<div class='alert alert-danger'>
+E-mail se nepodařilo doručit.
+
+<table class='dsn-check-err'>
+	<tr>
+		<th>Kód chyby:
+		<td>{{ dsn.status|dsn_status }}
+	<tr>
+		<th>Chybová zpráva:
+		<td>{{ dsn.diag_code|or_dash }}
+	<tr>
+		<th>Vzdálený server:
+		<td>{{ dsn.remote_mta|or_dash }}
+</table>
+</div>
+
+{#
+
+{% set dsns = [dsn] %}
+{% include "parts/dsn.html" %}
+
+#}
diff --git a/mo/web/templates/parts/wait_for_email.html b/mo/web/templates/parts/wait_for_email.html
new file mode 100644
index 0000000000000000000000000000000000000000..e281d29887cc83412582ee6b6fd3a8d684d18d8f
--- /dev/null
+++ b/mo/web/templates/parts/wait_for_email.html
@@ -0,0 +1,56 @@
+<div id='dsn-report'>
+<p>
+	Počkejte prosím, až vám přijde e-mail, a klikněte na odkaz v něm uvedený.
+</p>
+</div>
+
+{% if dsn_check_token %}
+
+<script type="text/javascript">
+let dsn_check_counter = 0;
+let dsn_stop = false;
+
+function schedule_dsn_check()
+{
+	if (dsn_stop)
+		return;
+
+	dsn_check_counter++;
+	if (dsn_check_counter > 100)
+		return;
+
+	let timeout = 30_000;
+	if (dsn_check_counter < 10)
+		timeout = 5_000;
+
+	window.setTimeout(function() {
+		console.log('DSN: Checking');
+		fetch("{{ url_for('dsn_check', token=dsn_check_token) }}")
+		.then(response => {
+			if (response.status >= 400 && response.status <= 499)
+				dsn_stop = true;
+			if (response.ok)
+				return response.text();
+			else
+				throw Error("Failed with status code " + response.status)
+		})
+		.then((value) => {
+			if (value != "") {
+				console.log('DSN: Received report')
+				const report_div = document.getElementById("dsn-report");
+				report_div.innerHTML = value;
+				dsn_stop = true;
+			}
+			schedule_dsn_check();
+		})
+		.catch(err => {
+			console.log('DSN: ' + err)
+			schedule_dsn_check();
+		});
+	}, timeout);
+}
+
+schedule_dsn_check();
+</script>
+
+{% endif %}
diff --git a/static/mo.css b/static/mo.css
index 58864bb1305709a845685cddd59266091a9c935a..655fbfecbd27b6eb226224ddfb72299156cd504e 100644
--- a/static/mo.css
+++ b/static/mo.css
@@ -596,6 +596,21 @@ table.data input.form-control {
 	margin: 2ex 2ex;
 }
 
+/* Upozornění na nedoručený mail v registraci */
+
+table.dsn-check-err {
+	border-collapse: collapse;
+	margin-top: 2ex;
+}
+
+table.dsn-check-err tr td, table.dsn-check-err tr th {
+	padding-top: 0.1ex;
+}
+
+table.dsn-check-err tr th {
+	padding-right: 2ex;
+}
+
 /* Vzhled pro mobily a úzké displeje */
 
 @media only screen and (max-width: 600px) {