studentenportal/deploy

Aktivierungsmails landen im Spam / inaktive Accounts

Opened this issue · 6 comments

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.

Welcome to the Microsoft Cloud...

Mit studentenportal/web#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.

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

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

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

Current state:

image

sowie studentenportal/web#398

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:

  • Wir haben immer noch 1089 unaktivierte Accounts, davon 1030 mit einer @hsr.ch-Adresse. Was stellen wir damit an? Ich könnte natürlich die Übung von oben nochmals mit all den Accounts wiederholen, aber keine Ahnung, ab wann ich da in ein Limit des Servers reinlaufe... (und ob der überhaupt was an @hsr.ch ausliefert, bzw. wie viele Adressen noch existieren)
  • Ggf. tritt das Problem künftig wieder auf. Das Einzige, was ich von unserer Seite aus verbessern konnte ist, einen SPF-Record zu setzen. https://www.mail-tester.com/ gibt uns nun 9 von 10 Punkten. DKIM/DMARC fehlt weiterhin, aber das wird nicht von Hostpoint unterstützt...

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