Envoie sécurisé des corrections par gmail

Added by Alexis Flesch over 7 years ago

Bonjour,

Pour ceux que ça intéresse, j'ai écrit un petit script python pour envoyer les copies corrigées via gmail sans avoir à "autoriser les connexions non sécurisées". Il est disponible à cette adresse :

https://github.com/alexisflesch/AMC-mail

Si vous ne lisez pas l'anglais je peux rajouter les instructions d'utilisation en Français. Le script principal (sendmails.py) est commenté en français.

Comme je ne connais pas le fonctionnement interne d'AMC, l'utilisation de ce script n'est pas totalement souple (i.e. il faut exporter les copies annotés sous la forme "no.nimporte-quoi.pdf" où "no" est le numéro de l'étudiant et il faut que le fichier csv contiennent les colonnes "no" et "email").

En espérant que ça puisse servir à d'autres !


Replies (6)

RE: Envoie sécurisé des corrections par gmail - Added by f b over 7 years ago

Bonjour et tout d'abord merci pour ce script qui m'intéresse particulièrement mais que je n'arrive pas à faire fonctionner.
Comme j'utilise Python 3.5 et que le script est vraisemblablement pour python <3, j'ai dû modifier sendmails.py (print avec des parenthèses) et gmailAPI.py (except errors.HttpError as error).
D'autre part je n'arrive pas à faire sortir d'AMC autre chose qu'un fichier pdf par étudiant de la forme "numCopieAvec4chiffres-Nom Prénom.pdf", j'ai donc modifié aussi sendmails.py pour ne garder que les deux premiers chiffres dans le nom du fichier. Pas moyen par contre de mettre le numéro du candidat au lieu du numéro de la copie (je précise que j'utilise AMCubuntu sous virtualBox/windows et plus moyen de mettre quoi que ce soit à jour). Ce n'est pas le plus grave je pourrais me débrouiller autrement en renommant chaque fichier automatiquement avec python.
Mais mon plus gros problème vient de l'erreur suivante après lancement du script modifié sur un fichier au nom bien formaté:

Traceback (most recent call last):
File "C:...\sendmails.py", line 88, in <module>
sendMails(sender, scans_directory, codes, message_text)
File "C:...\sendmails.py", line 69, in sendMails
sendCorrection(sender, scans_directory, f, etudiant['email'], message_text)
File "C:...\sendmails.py", line 76, in sendCorrection
message = gmail.CreateMessageWithAttachment(sender, to, subject, message_text, file_dir, filename)
File "c:...\gmailAPI.py", line 136, in CreateMessageWithAttachment
return {'raw': base64.urlsafe_b64encode(message.as_string())}
File "c:...\anaconda3\lib\base64.py", line 119, in urlsafe_b64encode
return b64encode(s).translate(_urlsafe_encode_translation)
File "c:...\anaconda3\lib\base64.py", line 59, in b64encode
encoded = binascii.b2a_base64(s)[:-1]
TypeError: a bytes-like object is required, not 'str'

je comprends qu'il y a un problème de format (string/bin) mais j'avoue être perdu pour savoir ce qu'il faut faire (à part changer les 'rb' par 'r' dans les lectures de fichiers mais je n'ose pas).

Si quelqu'un peut m'aider je lui en serai très reconnaissant!

RE: Envoie sécurisé des corrections par gmail - Added by Alexis Flesch over 7 years ago

Bonjour !

Je n'ai pas bien compris le souci concernant les numéros de copies : pouvez-vous élaborer ? Le script est normalement assez simple à relire/modifier. Ça m'arrangeait d'écrire ce qu'AMC appelle "l'identifiant unique" des étudiants en premier suivi d'un point "." pour travailler, mais on peut évidemment changer tout ça en éditant "qcm.py". Il suffit de regarder la fonction "sendMails" :

code_corr = f.split('.')[0] # récupère l'identifiant unique de l'étudiant (en coupant la chaîne de caractère et en récupérant ce qu'il y a avant le premier point)
if etudiant['no'] == code_corr: # identifie l'étudiant à partir de la colonne 'no' présente dans le fichier csv.

Je peux réécrire le code avec une fonction bien en évidence qui s'occupe à partir d'un nom de fichier de trouver l'identifiant unique d'un étudiant, comme ça vous pourrez la modifier à votre guise ?

Je peux aussi mettre en variable globale le nom de la colonne contenant l'identifiant unique ainsi que la nom de la colonne contenant l'adresse mail.

Pour le reste : votre ubuntu ne dispose-t-il pas de python2 ? C'est une réponse de flemmard, mais surtout d'ignorant : j'ai décidé d'attendre de ne plus avoir le choix pour passer à python3 :)

Sinon, en fouillant un peu sur le net, je suis tombé là-dessus:
http://stackoverflow.com/questions/8908287/base64-encoding-in-python-3

Peut-être qu'il faut modifier la ligne :
return {'raw': base64.urlsafe_b64encode(message.as_string())}

en
message = bytes(message.as_string(), "utf-8")
return {'raw': base64.urlsafe_b64encode(message)}

peut-être même qu'il suffit de se passer du ".as_string()" ? (J'avoue avoir un peu la flemme d'aller vérifier les types de tous ces éléments dans un terminal, mais je veux bien m'y coller si vous ne vous en sortez pas).

Alexis.

RE: Envoie sécurisé des corrections par gmail - Added by f b over 7 years ago

Merci beaucoup pour la réponse.

Pour la numérotation des copies, j'ai trouvé comment faire dans AMC.
J'ai essayé la manip proposée pour le passage à python 3 et il semble que cela fonctionne car l'erreur précédente ne se présente plus mais je tombe sur une autre erreur qui serait liée au fichier .json :

raise TypeError(repr(o) + " is not JSON serializable")

Je m'avoue vaincu pour le moment et je crois que le plus simple est de travailler directement sur linux avec un python 2. Ce que je vais essayer de faire, je reviendrai vers vous si j'ai besoin d'aide.

Encore une fois merci.

F6

RE: Envoie sécurisé des corrections par gmail - Added by Alexis Flesch over 7 years ago

Voici une piste pour résoudre le problème :

http://stackoverflow.com/questions/37201250/sending-email-via-gmail-python

Elle fait référence à cette autre discussion dont l'objet semble être le même :

http://stackoverflow.com/questions/38633781/python-gmail-api-not-json-serializable

Si vous vous en sortez tenez-moi au courant, je ferai un fork "python3" :)

Alexis.

RE: Envoie sécurisé des corrections par gmail - Added by f b over 7 years ago

Ca y est, j'ai finalement réussi aujourd'hui à envoyer tous les mails en utilisant python 2, j'ai juste dû modifier la ligne 55 de sendmails.py en:

liste_codes = readCodes(codes,sep)

J'ai par contre le message d'avertissement à chaque mail:

file_cache is unavailable when using oauth2client >= 4.0.0
Traceback (most recent call last):
File "c:\python27\lib\site-packages\googleapiclient\discovery_cache\__init__.py", line 41, in autodetect
from . import file_cache
File "c:\python27\lib\site-packages\googleapiclient\discovery_cache\file_cache.py", line 41, in <module>
'file_cache is unavailable when using oauth2client >= 4.0.0')
ImportError: file_cache is unavailable when using oauth2client >= 4.0.0

qui ne gêne pas l'envoi.

Pas besoin de "fork" python 3 du coup et merci BEAUCOUP!

f6

RE: Envoie sécurisé des corrections par gmail - Added by Alexis Flesch over 7 years ago

Ah oui en effet il y avait une coquille dans le script (je ne l'ai pas testé après mes derniers ajouts) : j'ai fait la modif sur github.

Merci pour le retour !

Alexis.

Ps : pas d'avertissement de mon côté, peut-être est-ce dû à une version différente d'une librairie python (oauth2client).

(1-6/6)