add mailbox.disabled column. Disable a mailbox if it fails tests for 10 days consecutive.

This commit is contained in:
Son NK 2020-10-12 13:28:21 +02:00
parent 987d25263c
commit 8268568f08
8 changed files with 163 additions and 4 deletions

View File

@ -1568,6 +1568,9 @@ class Mailbox(db.Model, ModelMixin):
db.Integer, default=0, server_default="0", nullable=False
)
# a mailbox can be disabled if it can't be reached
disabled = db.Column(db.Boolean, default=False, nullable=False, server_default="0")
__table_args__ = (db.UniqueConstraint("user_id", "email", name="uq_mailbox_user"),)
user = db.relationship(User, foreign_keys=[user_id])

34
cron.py
View File

@ -293,7 +293,11 @@ def sanity_check():
Different sanity checks
- detect if there's mailbox that's using a invalid domain
"""
mailbox_ids = db.session.query(Mailbox.id).filter(Mailbox.verified == True).all()
mailbox_ids = (
db.session.query(Mailbox.id)
.filter(Mailbox.verified == True, Mailbox.disabled == False)
.all()
)
mailbox_ids = [e[0] for e in mailbox_ids]
# iterate over id instead of mailbox directly
@ -310,13 +314,35 @@ def sanity_check():
if not email_domain_can_be_used_as_mailbox(mailbox.email):
mailbox.nb_failed_checks += 1
nb_email_log = nb_email_log_for_mailbox(mailbox)
log_func = LOG.warning
# send a warning
if mailbox.nb_failed_checks == 5:
if mailbox.user.email != mailbox.email:
send_email(
mailbox.user.email,
f"Mailbox {mailbox.email} is disabled",
render(
"transactional/disable-mailbox-warning.txt", mailbox=mailbox
),
render(
"transactional/disable-mailbox-warning.html",
mailbox=mailbox,
),
)
# alert if too much fail and nb_email_log > 100
if mailbox.nb_failed_checks > 10 and nb_email_log > 100:
log_func = LOG.exception
mailbox.verified = False
else:
log_func = LOG.warning
mailbox.disabled = True
if mailbox.user.email != mailbox.email:
send_email(
mailbox.user.email,
f"Mailbox {mailbox.email} is disabled",
render("transactional/disable-mailbox.txt", mailbox=mailbox),
render("transactional/disable-mailbox.html", mailbox=mailbox),
)
log_func(
"issue with mailbox %s domain. #alias %s, nb email log %s",

View File

@ -533,6 +533,10 @@ def forward_email_to_mailbox(
) -> (bool, str):
LOG.d("Forward %s -> %s -> %s", contact, alias, mailbox)
if mailbox.disabled:
LOG.debug("%s disabled, do not forward")
return False, "550 SL E21 Disabled mailbox"
# sanity check: make sure mailbox is not actually an alias
if get_email_domain_part(alias.email) == get_email_domain_part(mailbox.email):
LOG.warning(

View File

@ -0,0 +1,29 @@
"""empty message
Revision ID: b17afc77ba83
Revises: 32b00d06d892
Create Date: 2020-10-12 13:24:36.666256
"""
import sqlalchemy_utils
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b17afc77ba83'
down_revision = '32b00d06d892'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('mailbox', sa.Column('disabled', sa.Boolean(), server_default='0', nullable=False))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('mailbox', 'disabled')
# ### end Alembic commands ###

View File

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block content %}
{% call text() %}
<h1>
Issues with {{ mailbox.email }}.
</h1>
{% endcall %}
{% call text() %}
We have detected that your mailbox can't reliably receive emails from SimpleLogin for a consecutive period of time. <br>
The mailbox will be disabled in 5 days if the problem isn't solved by then.
{% endcall %}
{% call text() %}
Please note that a mailbox must be a <b>final</b> email address and cannot be
another email alias or a disposable email address.
{% endcall %}
{% call text() %}
If you have any question, you can reach out to us by replying to this email.
{% endcall %}
{% call text() %}
Best, <br/>
SimpleLogin Team.
{% endcall %}
{% endblock %}

View File

@ -0,0 +1,16 @@
Issues with {{ mailbox.email }}.
We have detected that your mailbox cannot reliably receive emails from SimpleLogin for a consecutive period of time.
The mailbox will be disabled in 5 days if the problem isn't solved by then.
Please note that a mailbox must be a "final" email address and cannot be
another email alias or a disposable email address.
If you have any question, you can reach out to us by replying to this email.
Best,
SimpleLogin Team.

View File

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block content %}
{% call text() %}
<h1>
{{ mailbox.email }} is disabled.
</h1>
{% endcall %}
{% call text() %}
We have detected that your mailbox can't reliably receive emails from SimpleLogin for a consecutive period of time. <br>
The mailbox has been therefore disabled.
{% endcall %}
{% call text() %}
Please note that a mailbox must be a <b>final</b> email address and cannot be
another email alias or a disposable email address.
{% endcall %}
{% call text() %}
If you have any question, you can reach out to us by replying to this email.
{% endcall %}
{% call text() %}
Best, <br/>
SimpleLogin Team.
{% endcall %}
{% endblock %}

View File

@ -0,0 +1,17 @@
{{ mailbox.email }} is disabled.
We have detected that your mailbox cannot reliably receive emails from SimpleLogin for a consecutive period of time.
The mailbox has been therefore disabled.
You can re-enable it by going to the mailbox page.
Please note that a mailbox must be a "final" email address and cannot be
another email alias or a disposable email address.
If you have any question, you can reach out to us by replying to this email.
Best,
SimpleLogin Team.