mirror of
https://github.com/simple-login/app.git
synced 2025-02-25 00:03:03 +08:00
handle yahoo complaint
This commit is contained in:
parent
b3012376c3
commit
106358da5f
6 changed files with 119 additions and 2 deletions
|
@ -333,6 +333,7 @@ AlERT_WRONG_MX_RECORD_CUSTOM_DOMAIN = "custom_domain_mx_record_issue"
|
||||||
ALERT_DIRECTORY_DISABLED_ALIAS_CREATION = "alert_directory_disabled_alias_creation"
|
ALERT_DIRECTORY_DISABLED_ALIAS_CREATION = "alert_directory_disabled_alias_creation"
|
||||||
|
|
||||||
ALERT_HOTMAIL_COMPLAINT = "alert_hotmail_complaint"
|
ALERT_HOTMAIL_COMPLAINT = "alert_hotmail_complaint"
|
||||||
|
ALERT_YAHOO_COMPLAINT = "alert_yahoo_complaint"
|
||||||
|
|
||||||
# <<<<< END ALERT EMAIL >>>>
|
# <<<<< END ALERT EMAIL >>>>
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ E208 = "250 SL E208 Hotmail complaint handled"
|
||||||
|
|
||||||
E209 = "250 SL E209 Email Loop"
|
E209 = "250 SL E209 Email Loop"
|
||||||
|
|
||||||
|
E210 = "250 SL E210 Yahoo complaint handled"
|
||||||
|
|
||||||
# 4** errors
|
# 4** errors
|
||||||
# E401 = "421 SL E401 Retry later"
|
# E401 = "421 SL E401 Retry later"
|
||||||
E402 = "421 SL E402 Encryption failed - Retry later"
|
E402 = "421 SL E402 Encryption failed - Retry later"
|
||||||
|
|
|
@ -592,7 +592,6 @@ def get_orig_message_from_bounce(msg: Message) -> Message:
|
||||||
|
|
||||||
|
|
||||||
def get_orig_message_from_outlook_complaint(msg: Message) -> Message:
|
def get_orig_message_from_outlook_complaint(msg: Message) -> Message:
|
||||||
"""parse the original email from Bounce"""
|
|
||||||
i = 0
|
i = 0
|
||||||
for part in msg.walk():
|
for part in msg.walk():
|
||||||
i += 1
|
i += 1
|
||||||
|
@ -604,6 +603,18 @@ def get_orig_message_from_outlook_complaint(msg: Message) -> Message:
|
||||||
return part
|
return part
|
||||||
|
|
||||||
|
|
||||||
|
def get_orig_message_from_yahoo_complaint(msg: Message) -> Message:
|
||||||
|
i = 0
|
||||||
|
for part in msg.walk():
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
# 1st part is the container
|
||||||
|
# 2nd part is the empty body
|
||||||
|
# 6th is original message
|
||||||
|
if i == 6:
|
||||||
|
return part
|
||||||
|
|
||||||
|
|
||||||
def get_header_from_bounce(msg: Message, header: str) -> str:
|
def get_header_from_bounce(msg: Message, header: str) -> str:
|
||||||
"""using regex to get header value from bounce message
|
"""using regex to get header value from bounce message
|
||||||
get_orig_message_from_bounce is better. This should be the last option
|
get_orig_message_from_bounce is better. This should be the last option
|
||||||
|
|
|
@ -81,6 +81,7 @@ from app.config import (
|
||||||
NEWRELIC_CONFIG_PATH,
|
NEWRELIC_CONFIG_PATH,
|
||||||
POSTMASTER,
|
POSTMASTER,
|
||||||
ALERT_HOTMAIL_COMPLAINT,
|
ALERT_HOTMAIL_COMPLAINT,
|
||||||
|
ALERT_YAHOO_COMPLAINT,
|
||||||
)
|
)
|
||||||
from app.email import status
|
from app.email import status
|
||||||
from app.email.rate_limit import rate_limited
|
from app.email.rate_limit import rate_limited
|
||||||
|
@ -118,6 +119,7 @@ from app.email_utils import (
|
||||||
should_ignore_bounce,
|
should_ignore_bounce,
|
||||||
get_orig_message_from_outlook_complaint,
|
get_orig_message_from_outlook_complaint,
|
||||||
parse_full_address,
|
parse_full_address,
|
||||||
|
get_orig_message_from_yahoo_complaint,
|
||||||
)
|
)
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.log import LOG, set_message_id
|
from app.log import LOG, set_message_id
|
||||||
|
@ -1314,7 +1316,7 @@ def handle_hotmail_complaint(msg: Message) -> bool:
|
||||||
alias = Alias.get_by(email=alias_address)
|
alias = Alias.get_by(email=alias_address)
|
||||||
|
|
||||||
if not alias:
|
if not alias:
|
||||||
LOG.d("No alias for %s", alias_address)
|
LOG.w("No alias for %s", alias_address)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
user = alias.user
|
user = alias.user
|
||||||
|
@ -1339,6 +1341,46 @@ def handle_hotmail_complaint(msg: Message) -> bool:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def handle_yahoo_complaint(msg: Message) -> bool:
|
||||||
|
"""
|
||||||
|
Handle yahoo complaint sent to postmaster
|
||||||
|
Return True if the complaint can be handled, False otherwise
|
||||||
|
"""
|
||||||
|
orig_msg = get_orig_message_from_yahoo_complaint(msg)
|
||||||
|
to_header = orig_msg["To"]
|
||||||
|
if not to_header:
|
||||||
|
LOG.e("cannot find the alias")
|
||||||
|
return False
|
||||||
|
|
||||||
|
_, alias_address = parse_full_address(get_header_unicode(to_header))
|
||||||
|
alias = Alias.get_by(email=alias_address)
|
||||||
|
|
||||||
|
if not alias:
|
||||||
|
LOG.w("No alias for %s", alias_address)
|
||||||
|
return False
|
||||||
|
|
||||||
|
user = alias.user
|
||||||
|
LOG.w("Handle yahoo complaint for %s %s %s", alias, user, alias.mailboxes)
|
||||||
|
|
||||||
|
send_email_with_rate_control(
|
||||||
|
user,
|
||||||
|
ALERT_YAHOO_COMPLAINT,
|
||||||
|
user.email,
|
||||||
|
f"Yahoo abuse report",
|
||||||
|
render(
|
||||||
|
"transactional/yahoo-complaint.txt.jinja2",
|
||||||
|
alias=alias,
|
||||||
|
),
|
||||||
|
render(
|
||||||
|
"transactional/yahoo-complaint.html",
|
||||||
|
alias=alias,
|
||||||
|
),
|
||||||
|
max_nb_alert=2,
|
||||||
|
)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def handle_bounce_reply_phase(envelope, msg: Message, email_log: EmailLog):
|
def handle_bounce_reply_phase(envelope, msg: Message, email_log: EmailLog):
|
||||||
"""
|
"""
|
||||||
Handle reply phase bounce
|
Handle reply phase bounce
|
||||||
|
@ -1758,6 +1800,17 @@ def handle(envelope: Envelope) -> str:
|
||||||
if handle_hotmail_complaint(msg):
|
if handle_hotmail_complaint(msg):
|
||||||
return status.E208
|
return status.E208
|
||||||
|
|
||||||
|
if (
|
||||||
|
len(rcpt_tos) == 1
|
||||||
|
and mail_from == "feedback@arf.mail.yahoo.com"
|
||||||
|
and rcpt_tos[0] == POSTMASTER
|
||||||
|
):
|
||||||
|
LOG.w("Handle yahoo complaint")
|
||||||
|
|
||||||
|
# if the complaint cannot be handled, forward it normally
|
||||||
|
if handle_yahoo_complaint(msg):
|
||||||
|
return status.E210
|
||||||
|
|
||||||
# Handle bounce
|
# Handle bounce
|
||||||
if (
|
if (
|
||||||
len(rcpt_tos) == 1
|
len(rcpt_tos) == 1
|
||||||
|
|
33
templates/emails/transactional/yahoo-complaint.html
Normal file
33
templates/emails/transactional/yahoo-complaint.html
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% call text() %}
|
||||||
|
This is SimpleLogin team. <br>
|
||||||
|
Yahoo has informed us about an email sent to <b>{{ alias.email }}</b> that might have been marked as spam.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call text() %}
|
||||||
|
Putting a forwarded email into Spam affects SimpleLogin email delivery, has a negative effect for all users and
|
||||||
|
is a violation of our terms and condition.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call text() %}
|
||||||
|
If that’s the case, please disable the alias instead if you don't want to receive the emails sent to this alias.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call text() %}
|
||||||
|
If SimpleLogin isn’t useful for you, please know that you can simply delete your account on the Settings page.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call text() %}
|
||||||
|
Looking to hear back from you.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call text() %}
|
||||||
|
Best, <br/>
|
||||||
|
SimpleLogin Team.
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
17
templates/emails/transactional/yahoo-complaint.txt.jinja2
Normal file
17
templates/emails/transactional/yahoo-complaint.txt.jinja2
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
This is SimpleLogin team.
|
||||||
|
|
||||||
|
Yahoo has informed us about an email sent to {{ alias.email }} that might have been marked as spam.
|
||||||
|
|
||||||
|
Putting a forwarded email into Spam affects SimpleLogin email delivery, has a negative effect for all users and
|
||||||
|
is a violation of our terms and condition.
|
||||||
|
|
||||||
|
If that’s the case, please disable the alias instead if you don't want to receive the emails sent to this alias.
|
||||||
|
|
||||||
|
If SimpleLogin isn’t useful for you, please know that you can simply delete your account on the Settings page.
|
||||||
|
|
||||||
|
Looking to hear back from you.
|
||||||
|
|
||||||
|
Best,
|
||||||
|
SimpleLogin Team.
|
Loading…
Reference in a new issue