
import csv
import os
import sys
import ssl
import smtplib
from getpass import getpass
from email.message import EmailMessage
from email.utils import formataddr

# --------------------------------------------------
# CONFIGURATION
# --------------------------------------------------

FICHIER = "tmp.txt"

EXPEDITEUR = 'courspasquet@mathweb.fr'
SERVEUR_SMTP = 'ssl0.ovh.net'
PORT_SMTP = 465

# Le mot de passe sera saisi sans être affiché.
MOT_DE_PASSE = 'guillaume$73'

# L'option --send permet d'envoyer réellement les emails.
ENVOI_REEL = "--send" in sys.argv

# --------------------------------------------------
# MESSAGE
# --------------------------------------------------

SUJET = "Demande d'attestation employeur CESU"

MODELE = """\
Madame, Monsieur,

Si vous recevez ce mail, c'est que vous avez fait appel à moi
pour vous donner des cours particuliers de mathématiques à partir
du mois de septembre 2021 (pour vous : période du {debut} à {fin}).

Je ne pensais pas en avoir besoin un jour, mais j'ai dû m'inscrire
comme demandeur d'emploi récemment, car il est de plus en plus
difficile de trouver des élèves.

Dans le cadre de cette démarche, afin de pouvoir bénéficier des
allocations chômage, je dois joindre l'attestation de chaque
employeur pour lequel j'ai travaillé depuis septembre 2021.

C'est la raison pour laquelle je suis contraint de vous demander
cette attestation, que je ne vous avais jamais demandée car je ne
pensais pas en avoir besoin un jour.

Cette attestation est, en théorie (s'il n'est pas trop tard),
disponible sur votre compte CESU. Vous trouverez des explications
sur la page suivante :

https://centreservices.fr/cesu/comment-faire-pour-obtenir-une-attestation-employeur-cesu

Il est assez fastidieux de remplir une attestation et, pour vous
aider, je me propose de la remplir pour vous si cela vous semble
trop compliqué. Dans ce cas, une fois remplie, je vous la retournerai
afin que vous en ayez un exemplaire.

Cependant, comme le nombre d'employeurs que j'ai eus est assez
conséquent (25 au total), je préférerais tout de même que vous la
remplissiez vous-même si cela vous est possible. Sinon, n'hésitez
pas à me le dire et nous pourrons nous arranger quoi qu'il en soit.

Je suis encore une fois navré de revenir vers vous pour cela.
Cette démarche est nécessaire pour mon dossier auprès de France
Travail. Je ne vous avais pas demandé cette attestation auparavant,
car je ne pensais pas en avoir besoin un jour. Je suis aujourd'hui
dans une situation difficile : je n'ai actuellement que deux élèves,
ce qui est insuffisant pour avoir un salaire convenable, et je
n'arrive pas à en trouver d'autres.

Vous avez également la possibilité de déposer directement votre
attestation sur le site de France Travail :

https://pro.francetravail.fr/accueil/choixauthentification

Rubrique « Pour accéder à mes démarches administratives /
réglementaires ». Cette procédure peut toutefois être assez
fastidieuse, puisqu'il faut créer un compte.

Je vous remercie par avance de l'attention que vous porterez à
cette démarche.

Bien cordialement,

Stéphane Pasquet
"""

# --------------------------------------------------
# LECTURE DU FICHIER
# --------------------------------------------------

destinataires = []

try:
    with open(FICHIER, "r", encoding="utf-8-sig", newline="") as fichier:
        lecteur = csv.reader(fichier, delimiter=";")

        for numero, ligne in enumerate(lecteur, start=1):
            if not ligne or all(not champ.strip() for champ in ligne):
                continue

            if len(ligne) != 4:
                print(
                    f"Ligne {numero} ignorée : "
                    f"4 champs attendus, {len(ligne)} trouvés."
                )
                continue

            nom, email, debut, fin = [
                champ.strip() for champ in ligne
            ]

            if not nom or not email or not debut or not fin:
                print(f"Ligne {numero} ignorée : champ vide.")
                continue

            if "@" not in email:
                print(f"Ligne {numero} ignorée : email invalide.")
                continue

            destinataires.append({
                "nom": nom,
                "email": email,
                "debut": debut,
                "fin": fin,
            })

except FileNotFoundError:
    print(f"Fichier introuvable : {FICHIER}")
    sys.exit(1)

if not destinataires:
    print("Aucun destinataire valide.")
    sys.exit(1)

print(f"\n{len(destinataires)} destinataire(s) trouvé(s).")

# --------------------------------------------------
# MODE TEST : AFFICHAGE SANS ENVOI
# --------------------------------------------------

if not ENVOI_REEL:
    for personne in destinataires:
        print("\n" + "=" * 60)
        print("Destinataire :", personne["nom"])
        print("Adresse :", personne["email"])
        print("Objet :", SUJET)
        print(
            MODELE.format(
                debut=personne["debut"],
                fin=personne["fin"],
            )
        )

    print("\nAucun email envoyé.")
    print("Après vérification, utilise l'option --send pour envoyer.")
    sys.exit(0)

# --------------------------------------------------
# CONNEXION SMTP ET ENVOI
# --------------------------------------------------

contexte_ssl = ssl.create_default_context()

envoyes = 0
echecs = 0

try:
    if PORT_SMTP == 465:
        serveur = smtplib.SMTP_SSL(
            SERVEUR_SMTP,
            PORT_SMTP,
            context=contexte_ssl,
            timeout=30,
        )
    else:
        serveur = smtplib.SMTP(
            SERVEUR_SMTP,
            PORT_SMTP,
            timeout=30,
        )
        serveur.ehlo()
        serveur.starttls(context=contexte_ssl)
        serveur.ehlo()

    with serveur:
        serveur.login(EXPEDITEUR, MOT_DE_PASSE)

        for personne in destinataires:
            message = EmailMessage()
            message["From"] = formataddr(
                ("Stéphane Pasquet", EXPEDITEUR)
            )
            message["To"] = personne["email"]
            message["Subject"] = SUJET

            message.set_content(
                MODELE.format(
                    debut=personne["debut"],
                    fin=personne["fin"],
                )
            )

            try:
                serveur.send_message(message)
                envoyes += 1
                print(
                    f"Envoyé à {personne['nom']} "
                    f"<{personne['email']}>"
                )

            except (smtplib.SMTPException, OSError) as erreur:
                echecs += 1
                print(
                    f"Échec pour {personne['email']} : {erreur}"
                )

except (smtplib.SMTPException, OSError, ValueError) as erreur:
    print(f"Erreur de connexion ou d'authentification SMTP : {erreur}")
    sys.exit(1)

print("\nBilan de l'envoi")
print(f"Emails acceptés par le serveur SMTP : {envoyes}")
print(f"Échecs : {echecs}")
