diff --git a/app/dashboard/templates/dashboard/setting.html b/app/dashboard/templates/dashboard/setting.html index bee5619e..dabfe490 100644 --- a/app/dashboard/templates/dashboard/setting.html +++ b/app/dashboard/templates/dashboard/setting.html @@ -166,6 +166,41 @@ +
+
+
Sender address format
+
+ When your alias receives an email, says from John Wick <john@wick.com>, + SimpleLogin forwards it to your mailbox.
+ + Due to some email constraints, SimpleLogin cannot keep the sender email address + in the original form and needs to transform it to one of the 2 below formats. +
+ +
+ + +
+ + +
+ +
+ + +
+ + +
+
+
+
@@ -183,7 +218,7 @@
-
+
Quarantine
diff --git a/app/dashboard/views/setting.py b/app/dashboard/views/setting.py index 9b95d807..4379300b 100644 --- a/app/dashboard/views/setting.py +++ b/app/dashboard/views/setting.py @@ -155,6 +155,15 @@ def setting(): db.session.commit() flash("Your preference has been updated", "success") return redirect(url_for("dashboard.setting")) + elif request.form.get("form-name") == "change-sender-format": + sender_format = int(request.form.get("sender-format")) + if sender_format == 0: + current_user.use_via_format_for_sender = False + else: + current_user.use_via_format_for_sender = True + db.session.commit() + flash("Your sender format preference has been updated", "success") + return redirect(url_for("dashboard.setting")) elif request.form.get("form-name") == "export-data": data = { diff --git a/app/email_utils.py b/app/email_utils.py index 7f2403e1..aec4de69 100644 --- a/app/email_utils.py +++ b/app/email_utils.py @@ -365,16 +365,22 @@ def get_orig_message_from_bounce(msg: Message) -> Message: return part -def new_addr(old_addr, new_email) -> str: +def new_addr(old_addr, new_email, user: User) -> str: """replace First Last by first@example.com by SimpleLogin `new_email` is a special reply address """ name, old_email = parseaddr(old_addr) - new_name = f"{old_email} via SimpleLogin" - new_addr = formataddr((new_name, new_email)).strip() + if user.use_via_format_for_sender: + new_name = f"{old_email} via SimpleLogin" + else: + name = name or "" + new_name = ( + name + (" - " if name else "") + old_email.replace("@", " at ") + ).strip() + new_addr = formataddr((new_name, new_email)).strip() return new_addr.strip() diff --git a/app/models.py b/app/models.py index 7999b28d..126bfad0 100644 --- a/app/models.py +++ b/app/models.py @@ -148,6 +148,12 @@ class User(db.Model, ModelMixin, UserMixin): profile_picture = db.relationship(File, foreign_keys=[profile_picture_id]) + # Use the "via" format for sender address, i.e. "name@example.com via SimpleLogin" + # If False, use the format "Name - name at example.com" + use_via_format_for_sender = db.Column( + db.Boolean, default=True, nullable=False, server_default="1" + ) + @classmethod def create(cls, email, name, password=None, **kwargs): user: User = super(User, cls).create(email=email, name=name, **kwargs) diff --git a/email_handler.py b/email_handler.py index 0c739661..aa0b3dea 100644 --- a/email_handler.py +++ b/email_handler.py @@ -290,7 +290,9 @@ def replace_header_when_forward(msg: Message, alias: Alias, header: str): ) db.session.commit() - new_addrs.append(new_addr(contact.website_from, contact.reply_email)) + new_addrs.append( + new_addr(contact.website_from, contact.reply_email, alias.user) + ) need_replace = True if need_replace: @@ -438,7 +440,7 @@ def handle_forward(envelope, smtp: SMTP, msg: Message, rcpt_to: str) -> (bool, s # replace the email part in from: header contact_from_header = msg["From"] contact_name, contact_email = parseaddr(contact_from_header) - new_from_header = new_addr(contact_from_header, contact.reply_email) + new_from_header = new_addr(contact_from_header, contact.reply_email, user) add_or_replace_header(msg, "From", new_from_header) LOG.d("new_from_header:%s, old header %s", new_from_header, contact_from_header) diff --git a/migrations/versions/2020_032822_224fd8963462_.py b/migrations/versions/2020_032822_224fd8963462_.py new file mode 100644 index 00000000..68cc18ca --- /dev/null +++ b/migrations/versions/2020_032822_224fd8963462_.py @@ -0,0 +1,29 @@ +"""empty message + +Revision ID: 224fd8963462 +Revises: 67c61eead8d2 +Create Date: 2020-03-28 22:30:19.428692 + +""" +import sqlalchemy_utils +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '224fd8963462' +down_revision = '67c61eead8d2' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('use_via_format_for_sender', sa.Boolean(), server_default='1', nullable=False)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'use_via_format_for_sender') + # ### end Alembic commands ###