Erreur avec "smtplib.SMTPDataError: (550, b'spam message rejected)."

Bonjour,

Ma femme est auto-entrepreneur et elle voulait créer une newsletter avec la base de clients qu’elle a. Elle m’a demandé si quelque chose était possible pour un peu m’entrainer à lire dans un dataset, extraire et mettre les emails dans une liste, et après envoyer tour à tour avec le script que j’ai trouvé ici :

Comment envoyer un email avec python Datascientest

J’ai donc fait un for loop avec le code parce que ma femme voulait voir quel mail fonctionnait, et quel mail ne fonctionnait pas, et ensuite compter le nombre de mails envoyés par rapport au nombre de mails de sa base de donnée. Je vous met un extrait du code pour plus de contexte :

  # creation of the connexion
  context = ssl.create_default_context()
  with smtplib.SMTP_SSL(smtp_address, smtp_port, context=context) as server:
    print("Connexion created with", smtp_address,",port :", smtp_port)
    # connexion to the account
    server.login(email_address, email_password)
    print("Connected to :", email_address)
    # sending the mail
    server.sendmail(email_address, email_receiver, message.as_string())
    print("Mail sent to :", mail)
    counter_mails += 1


print('\n')
print('Total mails sent : ', counter_mails)

En fait mon objectif est de passer outre l’erreur que j’ai :

Traceback (most recent call last):
File « C:\Users???\Documents\Newsletter\eMailing.py », line 371, in
server.sendmail(email_address, email_receiver, message.as_string())
File « C:\Users???\AppData\Local\Programs\Python\Python39\lib\smtplib.py », line 903, in sendmail
raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (550, b’spam message rejected.[après ils me demandent de contacter le support internet de l’adresse mail, ce que j’ai fait et ils n’ont pas trouvés d’erreur]’).

Ma ligne 371 est la ligne « server.sendmail(email_address, email_receiver, message.as_string()) ».
En fait je voudrais créer un if/else qui, dès qu’il voit l’erreur, il print le mail qui pose problème, et l’intègre à une liste, puis reprend à la boucle for comme si rien ne s’était passé. Mais à la place de ça, ça s’arrête. J’ai demandé sur Stack Overflow, ils sont pas très cordiaux comme personnes et m’ont un peu traité de naze donc je voulais demander ici pour fixer mon problème.

Par contre, si tout va bien, il continue avec :

    print("Mail sent to :", mail)
    counter_mails += 1

J’ai essayé avant de m’envoyer le mail sur mon adresse, après j’ai créé liste avec des mails que j’ai et avec les mails de mes potes qui étaient au courant qu’ils allaient recevoir des mails test. Et tout fonctionnait. Mais là, ça bloque parce que certains mails n’acceptent pas les mails venant de l’extérieur. J’ai essayé ça mais ça ne marche pas :

    try:
      smtpObject = smtplib.SMTP_SSL(smtp_address, smtp_port, context=context)
      smtpObjectserver.login(email_address, email_password)
      smtpObject.server.sendmail(email_address, email_receiver, message.as_string())
    except SMTPDataError:
      print("Mail not sent to :", mail)

En espérant qu’on trouvera une solution,
Je vous souhaite un bon weekend et de bonnes fêtes.

Bonjour Boris,

Pour résoudre votre erreur. Je pense qu’il pourrait être efficace d’utiliser la syntaxe du try/except. Pour chaque mail de votre liste, vous allez tester à l’aide du try, une action sur ce dernier. Si elle fonctionne, tant mieux. Dans le cas contraire, il faudra renseigner le type d’erreur dans le except et mener une action suite à cette condition du style : stocker le mail dans une liste.

Je vous conseille de reprendre le notebook Masterclass - Bonnes pratiques pour les DA sur votre plateforme. L’une des premières questions porte sur ce sujet.

Bien à vous,

Yohan