studentenportal / deploy

:ship: The studentenportal.ch deployment
https://studentenportal.ch
0 stars 0 forks source link

Aktivierungsmails landen im Spam / inaktive Accounts #28

Open The-Compiler opened 3 years ago

The-Compiler commented 3 years ago

Unsere Aktivierungsmails an @ost.ch scheinen im Spam zu landen. Ich habe das grad kurz getestet.

Wir scheinen auch einige Leichen in der Datenbank zu haben, die nie aktiviert wurden - die meisten allerdings noch zu HSR-Zeiten:

studentenportal=# select count(*) from front_user where is_active = 'f';
 count 
-------
  1014
(1 row)

studentenportal=# select count(*) from front_user where is_active = 'f' and email like '%@ost.ch';
 count 
-------
    15
(1 row)

Zwei Leute haben sich dazu im Januar schon auf team@studentenportal.ch gemeldet - ich habe diese zwei Accounts jetzt mal von Hand in der DB aktiviert.

fabianhauser commented 3 years ago

Welcome to the Microsoft Cloud...

Mit https://github.com/studentenportal/web/issues/116 wäre das mit der Registrierung kein Problem mehr. Evtl. würde es helfen, den E-Mails DKIM-Signaturen und im DNS einen SPF hinzuzufügen, oder die E-Mails über einen Dienstleister rauszulassen.

The-Compiler commented 3 years ago

Sofern am Setup in der Zwischenzeit nix verändert wurde, lassen wir die bereits via Hostpoint raus.

fabianhauser commented 3 years ago

Sofern am Setup in der Zwischenzeit nix verändert wurde, lassen wir die bereits via Hostpoint raus.

Ah stimmt, das hat sich ja mit dem neuen Setup geändert...

dbrgn commented 3 years ago

DKIM und SPF sind definitiv hilfreich, falls das nicht schon eingerichtet ist.

The-Compiler commented 2 years ago

Current state:

image

sowie https://github.com/studentenportal/web/issues/398

The-Compiler commented 2 years ago

Alle nicht aktivierten Accounts mit einer @ost.ch-Adresse haben soeben eine neue Aktivierungsmail bekommen. Dazu habe ich via python3 manage.py shell erst alle betroffenen Accounts rausgesucht:

>>> affected = registration.models.RegistrationProfile.objects.filter(activated=False, user__email__endswith="ost.ch")
>>> len(affected)
65

dann habe ich das Registrierungsdatum aktualisiert, damit die betroffenen Personen nochmals eine Woche Zeit haben:

>>> import datetime
>>> for reg in affected:
...     reg.user.date_joined = datetime.datetime.now()
...     reg.user.save()
...     assert not reg.activation_key_expired()

und schliesslich alle Aktivierungs-Keys rausgesucht:

>>> {reg.user.name(): reg.activation_key for reg in affected}

Mit dieser Info habe ich dann ein Skript gefüttert, was via OST-SMTP-Server (via VPN ohne Authentifizierung nutzbar) nochmals eine Nachricht an alle betroffenen Personen verschickt:

import email.message
import time
import smtplib

data = {
    ...,
    "florian.bruhin": 'fc99714de40aac37ae57026e0bb734ba540c3f1cb4a002fef313c4185731ddd9',
}

SERVER = "smtp02.ost.ch"
TIMEOUT = 5
COOLDOWN = 10
FROMNAME = "Florian Bruhin"
FROMADDR = "florian.bruhin@ost.ch"
REPLY_TO = "team@studentenportal.ch"

CONTENT = """
Hallo {name},

Du erhältst diese Nachricht, da du dich (vermutlich schon vor einiger Zeit) für
studentenportal.ch registriert hast, deinen Account {username} jedoch nie
aktiviert hast.

Vermutlich hast du die Aktivierungsmail nie bekommen. Leider scheinen die
OST-Mailserver einen deutlich agressiveren Spamfilter zu besitzen als damals
die der HSR, der die Mails gerne auch gleich komplett entsorgt, anstatt sie
wenigstens als Junk-Mail auszuliefern...

Jedenfalls: Sorry für die Umstände und die lange Wartezeit. Bisher fühlte sich
leider niemand dafür zuständig, dies hat sich nun geändert.

Du hast nun nochmals eine Woche Zeit, um deinen Account mit folgendem Link zu
aktivieren:

https://studentenportal.ch/accounts/activate/{key}

Sollte es wider Erwarten trotzdem noch Probleme geben, melde dich bitte bei
team@studentenportal.ch.

Liebe Grüsse,
Florian Bruhin
"""

def human_name(name: str) -> str:
    return " ".join(s.capitalize() for s in name.rstrip("1").split("."))

def name_to_email(name: str) -> str:
    return f"{name}@ost.ch"

messages = []

for name, actkey in data.items():
    msg = email.message.EmailMessage()
    msg["Subject"] = "Aktivierung Studentenportal"
    msg["From"] = f"{FROMNAME} <{FROMADDR}>"
    msg["To"] = name_to_email(name)
    msg["Reply-To"] = "team@studentenportal.ch"
    msg["Bcc"] = FROMADDR
    msg.set_content(CONTENT.format(name=human_name(name), username=name, key=actkey))
    messages.append(msg)

with smtplib.SMTP(SERVER, timeout=TIMEOUT) as smtp:
    for i, msg in enumerate(messages, start=1):
        print(f"{i:2}/{len(messages)} {msg['To']}")
        smtp.send_message(msg)
        time.sleep(COOLDOWN)

Zwei Baustellen bleiben momentan noch offen:

Momentan scheints so auszusehen, dass die Mails in der OST-Mailbox im Junk ausgeliefert werden. Das ist schon mal besser, als gar nicht...