IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Envois d'email comportant des accents avec python [Python 2.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Envois d'email comportant des accents avec python
    Bonjour,

    Je cherche à pouvoir faire simplement des envois de mail groupé, génériques, mais à la fois personnalisé selon certains critères. En fait, j'y arrive correctement, et facilement, si le mail ne comporte que des caractères ASCII. Or, mes mails étant en français, il n'y a que très peu de chance pour que je n'utilise que des caractères ascii...

    Avec le code suivant, j'arrive à envoyer un mail sur ma messagerie laposte.net. Mais les caractères non-ascii sont transformés en �

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        codage = 'utf-8'
        msg = MIMEMultipart()
        msg['From'] = 'mon_email@gmail.com'
        msg['To'] = 'destinataire@laposte.net'
        msg['Subject'] = 'sujet'
        msg['Charset'] = codage
        message = "J'espère que tu vas bien!"
        msg.attach(MIMEText(message))
        msg['Content-Type'] = 'text/' + message + '; charset=' + codage
        try:
            mailserver = smtplib.SMTP('smtp.gmail.com', 587)
            mailserver.ehlo()
            mailserver.starttls()
            mailserver.ehlo()
            mailserver.login('mon_email@gmail.com', 'mon_mot_de_passe')
            try:
                mailserver.sendmail('mon_email@gmail.com', 'destinataire@laposte.net', msg.as_string())
            finally:
                mailserver.quit()
        except Exception, exc:
            sys.exit( "mail failed; %s" % str(exc) )
    Qu'ais-je fait de travers, n'ai pas fait ou n'ai pas compris ?

    Milles mercis d'avance pour toutes idées et vos réponses

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ah, ces problèmes d'encodage avec Python 2! Heureusement, il y a toujours une solution.

    A noter cependant que Python 3 est tout de même sorti en décembre 2008, et ses concepteurs avaient prévu 5 ans pour la transition...

    Revenons au code.

    En en-tête du code, il faut indiquer à Python comment seront encodées les chaines de caractères codées en dur dans la page. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    Mais il ne faut pas oublier que l'éditeur de texte doit alors enregistrer le code avec le même encodage, c'est à dire ici utf-8.

    Ceci étant fait, on est sûr que Python saura que les chaines en question seront en utf-8, mais ça ne changera pas le fait que Python continuera à travailler en ASCII par défaut. C'est à dire qu'à chaque fois qu'une conversion sera nécessaire mais non codée (avec .encode/.decode), la conversion sera faite en ASCII et... génèrera une erreur en cas de caractère accentué.

    Donc: dans un 1er temps, vérifie que ton code est bien enregistré en utf-8.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Bonjour Tyrtamos, et merci pour ta réponse !

    Je crois bien t'avoir écris sur ton site pour le même problème...

    Bon, bien sur, je pourrais passer à python 3, et c'est même prévu, mais je cherche d'abord à avoir quelque chose de fonctionnel pour l'envoi de mail. Le passage ne sera pas compliqué, en plus.

    dans un 1er temps, vérifie que ton code est bien enregistré en utf-8.
    J'ai donc vérifier cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ file -I pipotron.py
    pipotron.py: text/x-java; charset=utf-8
    Je ne sais pas trop ce que signifie le "text/x-java". Par contre, c'est bien encodé en utf-8, sachant que j'ai bien en haut de fichier ce que tu indiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    D'autres idées ?

    Encore merci, tyrtamos, et merci d'avance aux autres personnes.

  4. #4
    Membre régulier
    Avatar de mohamedAziz
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2014
    Messages : 42
    Points : 84
    Points
    84
    Billets dans le blog
    2
    Par défaut
    salut,

    J'ai pas essaye mais pourquoi pas faire

    message = u"J'espère que tu vas bien!"


  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci mohamedAziz pour la proposition,

    J'aurais du le mentionner, car j'ai effectivement fait le test, mais cela ne change rien.

    Je pense que :
    1. ou l'encodage du mail n'est pas le bon
    2. ou la messagerie laposte.net ne gère pas les mails comme gmail.

    En effet, dans les mails envoyé de gmail (messagerie utilisée pour envoyer mes mails lors de ce test), les accents apparaissent bien. Pourtant, sur laposte (messagerie du destinataire de mes mails tests), il y a ces fameux points d'intérrogations...

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà ton code un peu corrigé qui fonctionne:
    - j'ai mis le message (le corps de l'email) en unicode avec le u"..."
    - j'ai ajouté le type de texte ('plain')
    - j'ai modifié la ligne msg.attach en y ajoutant les instructions concernant l'encodage de l'email.

    En fait, je crois que c'est la raison principale du problème: il ne faut pas mélanger l'encodage des chaines dans le programme avec l'encodage de l'email: il faut traiter les 2!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    import sys
     
    from smtplib import SMTP
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
     
    codage = 'utf-8'
    msg = MIMEMultipart()
    msg['From'] = 'emeteur@toto.com'
    msg['To'] = 'destinataire@titi.com'
    msg['Subject'] = 'sujet'
    msg['Charset'] = codage
    message = u"J'espère que tu vas bien!" # <= modif
    typetexte = 'plain' # <= modif
    msg.attach(MIMEText(message.encode(codage), typetexte, _charset=codage)) # <= modif
     
    msg['Content-Type'] = 'text/' + message + '; charset=' + codage
    try:
        mailserver = SMTP('mail.serveur.com', 587)
        mailserver.ehlo()
        mailserver.starttls()
        mailserver.ehlo()
        mailserver.login('emeteur@toto.com', 'motdepasse')
        try:
            mailserver.sendmail('emeteur@toto.com', 'destinataire@titi.com', msg.as_string())
        finally:
            mailserver.quit()
    except Exception, exc:
        sys.exit( "mail failed; %s" % str(exc) )
    Essaie!

    Tu m'avais écrit à partir de mon site, mais je n'ai pas pu te répondre hier parce que mon serveur email avait des problèmes (résolus maintenant). Par contre, le code de mon site (http://python.jpvweb.com/mesrecettes...xpedition_mail) fonctionne, tant en Python 2 qu'en Python 3, parce que je l'utilise tous les ans pour envoyer plusieurs centaines d'emails dans le monde entier (40 pays) dans le cadre d'un concours international. Mais il est possible que certains serveurs aient des particularités que je n'ai pas pris en compte.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Incroyable !!!!!

    Mille mercis tyrtamos !!!

    J'imagine que c'est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msg.attach(MIMEText(message.encode(codage), typetexte, _charset=codage))
    qui fait tout le boulot.

    C'est absolument parfait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Crypter/Decrypter en CESAR avec des accents en PYTHON
    Par pito2901 dans le forum Général Python
    Réponses: 6
    Dernier message: 18/11/2014, 13h13
  2. [ODBC] Requete sql vers access impossible avec champ comportant des accents
    Par roxxsuxx dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2012, 11h17
  3. exécuter des programmes avec python
    Par piotrgavriloff dans le forum Général Python
    Réponses: 1
    Dernier message: 24/06/2007, 01h09
  4. Envoie d'email en mode console avec indy
    Par luchoadvance dans le forum Delphi
    Réponses: 3
    Dernier message: 14/03/2007, 08h49
  5. [RegEx] Remplacement des accents avec une regex
    Par benohit dans le forum Langage
    Réponses: 7
    Dernier message: 07/09/2006, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo