Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/10/2016, à 18:08

JujuLand

[Résolu] Impression automatique de mails en pdf

[edit]
Pour une solution complète, voir cd post

[/edit]

Bonjour, ayant un grand nombre de mails à imprimer en pdf, j'ai trouvé une méthode plus rapide que de choisir 'Imprimer dans un fichier', car cette dernière nécessite de changer le nom du fichier pdf, et est lourdingue à la longue.

J'ai téléchargé mutt, et muttprint et j'ouvre mes dossiers mails avec mutt.
Pour imprimer directement en pdf, j'utilise un script que j'ai trouvé sur le netet que j'ai nommé mailprint

#!/bin/bash

if ! [ -e "$HOME/Bureau/Archives_GADEL/muttprint.pdf" ]
then
    FILE="$HOME/Bureau/Archives_GADEL/muttprint.pdf"
else
    count=1

    while [ -e "$HOME/Bureau/Archives_GADEL/muttprint-${count}.pdf" ]
    do
        count=$(( $count + 1 ))
    done
    FILE="$HOME/Bureau/Archives_GADEL/muttprint-${count}.pdf"
fi
muttprint -p - |ps2pdf - "${FILE}'

et ma ligne de commande pour lancer mutt est la suivante:

mutt -f A20 -e 'set print_command="mailprint"'

Cà fonctionne très bien, au détail près de l'encodage, pour les mails que je reçois en ISO-8859-1 au lieu de UTF-8.
Et donc ces mail donnenet un pdf avec de ce style :

bonjour Muriel
Comme je te l'ai dit j'essais de voir les problà ̈mes engendrés par le
passage du désenclavement du nord du département (projet CG) et voudrais

J'ai bien essayé d'utiliser recode en remplaçant la dernière ligne du script par ce qui suit, mais c'est du ps ,et non du texte, et recode ne fait rien.

muttprint -p - > ./pmail
recode ISO-8859-1..UTF-8 < ./pmail > ./umail
cat ./umail | ps2pdf - "${FILE}"

Y aurait-il un moyen de faire le travail de recode avant le passage de muttprint ?
Ou toute autre solution ... ?

Merci
A+

Dernière modification par JujuLand (Le 16/10/2016, à 16:47)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#2 Le 02/10/2016, à 18:19

pingouinux

Re : [Résolu] Impression automatique de mails en pdf

Bonjour,
À tout hasard, essaye de remplacer

muttprint -p - |ps2pdf - "${FILE}'

par

muttprint -p - | iconv -f ISO-8859-1 | ps2pdf - "${FILE}'

Édité : Correction de l'erreur signalée par JujuLand en #3

Dernière modification par pingouinux (Le 02/10/2016, à 20:01)

Hors ligne

#3 Le 02/10/2016, à 19:32

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Non, c'est pas mieux, même en corrigeant le typo | |
Mais j'ai trouvé la solution:

cat - > ./pmail
recode UTF-8..ISO-8859-1 < ./pmail > ./umail
muttprint -f ./umail -p - |ps2pdf - "${FILE}"

Çà modifie bien l'encodage, mais avec un petit effet de bord:
Dans le titre du mail, il y a un accent aigü.
Je ne sais pas pourquoi il n'est pas encodé comme le corps du mail, et il est transformé en :

Sujet ; projet d[U+FFFD]enclavement CG

C'est mineur, mais en fait je ne pourrai pas utiliser une telle solution, car je viens de m'apercevoir que le pdf généré n'est pas du texte, mais de l'image, ce qui ne me convient pas.

Je vais essayer d'utiliser lp, avec une syntaxe du style :

lp -d PDF mon_fichier.txt

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#4 Le 02/10/2016, à 19:36

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Bon, le LP -d ne fonctionne pas ...

Y aurait-il une possibilité d'imprimer en ligne de commande avec thunderbird ?

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#5 Le 04/10/2016, à 17:44

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Bon, j'ai décidé d'abandonner cette voie, vu que les pdf générés étaient des pdf-image, et non des pdf-texte, et donc non indexables par un outil de recherche comme Recoll

J'ai donc décidé de faire un script qui s'appuie sur l'outil xdotool.
Le réglage n'a pas été très évident, mais avec un peu de patience j'y suis arrivé smile
Voici donc le script

###!/bin/bash

# mail2pdf : Imprimer en pdf tous les mails d'un dossier thunderbird
progvers=0.17
progdate=2016-10-06
progdev="Alain Aupeix"

# Variables à régler avant toute utilisation
folder_out="/home/alain/Bureau/Archives_GADEL/Archives_GADEL"
folder_in="/home/alain/.thunderbird/crtothve.default/Mail/Local\ Folders/Archives_GADEL.sbd"
where="Dossiers locaux"
abscisse="300"
ordonnee="545"

#messages en couleur
. colors

# Test paramètre
if [ "x$1" = "x" ]
then
   echo " "
   echo -e "mail2pdf${gCya} v${progvers}${gGre} (c)${gYel}${progdate} ${gRed}${progdev}${noColor}"
   echo " "
   echo -e "Syntaxe : ${gGre}mail2pdf ${gCya}dossier ${gRed}[rang du 1er mail à traiter]${noColor}"
   echo " "
   exit
fi

if [ "x$2" = "x" ]
then
   rang=0
else
   rang=`expr $2 - 1`
fi

# Test existence et éventuelle creation du dossier de sortie
if test -d "${folder_out}/$1";then
   echo ""
else
   mkdir "${folder_out}/$1"
fi

# Calcul du nombre de mails à traiter
#cat /home/alain/.thunderbird/crtothve.default/Mail/Local\ Folders/Archives_GADEL.sbd/$1 | grep "From - "
nombre=$(cat /home/alain/.thunderbird/crtothve.default/Mail/Local\ Folders/Archives_GADEL.sbd/$1 | grep "From - " | wc -l)
echo -e "$1 : ${gGre}${nombre}${noColor} mails à imprimer"

# repérage des fenêtres utilisées
# terminal
myconsole=$(xdotool getactivewindow)
# thunderbird
mythun=$(wmctrl -l|grep "$1 - Dossiers locaux - Mozilla Thunderbird"| awk '{print $1}')
#echo $mythun
# C'est parti ... on traite
while [ "$rang" != "$nombre" ]; do
   sleep 1
   xdotool windowactivate $mythun
   echo -e "Mail${gGre} `expr ${rang} + 1`${noColor} sur ${gYel}${nombre}${noColor}"
   sleep 0.5
   # positionne la souris sur le sujet su mail
   xdotool mousemove 350 545
   # copie du sujet qui deviendra le titre du pdf
   xdotool click 3
   sleep 1
   xdotool type p
   xclip -o |sed 's|: |_|g'|sed 's|/|_|g'>title.txt
   sleep 1
   size=$(ls -ail title.txt| awk '{print $6}')
   if [ $size = 0 ]
   then
      xdotool windowactivate $myconsole
      echo -e "Donnez un titre au mail :"
      read title
      echo $title > title2.txt
      tr -d "\n" < title2.txt >title.txt
      xdotool windowactivate $mythun
   else
      # remplacement de ": " et "/" dans le titre par "_"
      xclip -o |sed 's|: |_|g'|sed 's|/|_|g'|sed 's|)|_|g'|sed 's|(|_|g'|sed 's|+|_|g'>title.txt
      if [ -f "${folder_out}/$1/$(cat title.txt).pdf" ];then
         xclip -i title.txt -selection clipboard
         xclip -o |sed 's|: |_|g'|sed 's|/|_|g'|sed 's|(|_|g'|sed 's|)|_|g'|sed 's|+|_|g'>title.txt
         title=$(cat title.txt)
         myprint=$(xdotool getactivewindow)
         xdotool windowactivate $myconsole
         echo -e "Donnez un titre différent (${gYel}Shift+Ctrl+V${noColor})"
         read title
         echo $title > title2.txt
         tr -d "\n" < title2.txt >title.txt
         xdotool windowactivate $mythun
      fi
   fi
   sleep 0.2
   xclip -i title.txt -selection clipboard
   echo "$(cat title.txt)"
   sleep 1
   # Imprimer
   xdotool key Ctrl+p
   sleep 4
   # Dans un fichier
   xdotool key Tab
   sleep 0.1
   xdotool key Up
   sleep 0.5
   xdotool key Up
   sleep 0.5
   xdotool key Up
   sleep 0.5
   xdotool key Tab
   sleep 1
   # changement du nom du pdf de sortie
   xdotool key Ctrl+v
   sleep 0.5
   xdotool type .pdf
   sleep 1
   # déplacement dans le dossier de sortie
   xdotool key Tab
   xdotool key Page_Down
   sleep 0.5
   xdotool key Return
   sleep 0.5
   xdotool key Down
   xdotool key Down
   xdotool key Down
   sleep 1
   xdotool key Return
   sleep 1
   xdotool key Down
   sleep 1
   xdotool key Return
   sleep 1
   xdotool key Down
   sleep 1
   xdotool key Return
   sleep 1
   # Validation du dossier de sortie
   xdotool key Alt+o
   sleep 1
   # Imprimer
   xdotool key Alt+i
   sleep 0.1
   myprint=$(xdotool getactivewindow)
   sleep 1
   # Attente de la fin de la création du pdf ( à modifier si problème évoqué)
#   sleep 6
   while [ $(xdotool getactivewindow) = $myprint ]
   do
     sleep 0.4
   done   
   # repositionnement dans la liste des messages
   sleep 2
   xdotool windowactivate $mythun
   xdotool key Shift+Tab
   xdotool key Shift+Tab
   xdotool key Shift+Tab
   sleep 2
   # Mail suivant
   xdotool key Down
   rang=`expr $rang + 1`
   if [ "$rang" = "$nombre" ];then
      break
   fi
   sleep 2
done
echo " "

Dernière modif appliquée dans la fenêtre code:
----------------------------------------------------------------
2016-10-04 v0.12  : J'ai du remplacer ${folder_in} par sa valeur, car il ne comptait plus les mails (ligne 37)
.                             - J'ai du remplacer $abscisse et $ordonnee par leur valeurs, xdotool n'aimait pas !!!

2016-10-05 v0.13  : Ajout de la modification du titre du mail dans le presse-papier (caractère : => _)
.                               Source corrigé dans le post
.                               Ajout du script colors ( à mettre dans /usr/local/bin)

2016-10-05 v0.14  : Ajout du paramètre '-selection clipboard' oubliée

2016-10-05 v0.15  : Ajout de la modification du titre du mail dans le presse-papier (caractère / => _)
.                               Traitement des mails sans titre (demande de saisie)
.                               Augmentation de l'attente pour creation du pdf, un peu juste pour les gros mails
                               Deuxième paramètre pour commencer ailleurs qu'au premier mail du dossier (rang dans le dossier du premier mail à traiter)
.                               Source corrigé dans le post

2016-10-06 v0.16  : Ajout du traitement des mails avec le même titre (demande de modification du nom)

2016-10-06 v0.17  : Attente de fin de création du pdf améliorée, et automatique. Toutefois, sur des gros mails, ce n'est pas correct.
.                               Différentes petites retouches sur le attentes.

Prérequis à installer :
-----------------------------
xdotool
wmctrl
xclip (normalement déjà installé)
colors

#!/bin/bash

# Définition des couleurs

# Arrière-plan
export bBla='\033[40m'
export bRed='\033[41m'
export bGre='\033[42m'
export bYel='\033[43m'
export bBlu='\033[44m'
export bMag='\033[45m'
export bCya='\033[46m'
export bWhi='\033[47m'

# Normal
export fBla='\033[30m'
export fRed='\033[31m'
export fGre='\033[32m'
export fYel='\033[33m'
export fBlu='\033[34m'
export fMag='\033[35m'
export fCya='\033[36m'
export fWhi='\033[37m'

# Normal
export gBla='\033[1;30m'
export gRed='\033[1;31m'
export gGre='\033[1;32m'
export gYel='\033[1;33m'
export gBlu='\033[1;34m'
export gMag='\033[1;35m'
export gCya='\033[1;36m'
export gWhi='\033[1;37m'

# Sans couleur
export noColor='\033[0m'

# Déplacements sur l'écran:
export mho='\033[0H'
export men='\033[0F'
export mle='\033[0D'
export mri='\033[0C'
export mup='\033[0A'
export mdo='\033[0B'

Conseils:
=========

1) # Variables à régler avant toute utilisation

- Définir les variables (dossiers d'entrée, dossiers de sortie, titre de la fenêtre thunderbird, position du sujet) à vos besoins
- adaptez abscisse et ordonne à votre config
- attention, il faut avoir le panneau de visualisation du mail activé (F8)
- pour éviter d'avoir la position de Sujet qui change, ne pas mettre thunderbird en mode maximisé, mais en mode fenêtre, et agrandir (en largeur) de manière à ce que l'affichage de l'expéditeur du mail dans l'entête, ne fasse pas jamais descendre la position du champ Sujet.
- where est le nom du dossier de Thunderbird dans lequel vous allez travailler

2) # déplacement dans le dossier de sortie

- Adaptez le nombre de down en fonction de la position du dossier dans la liste des dossiers qui sera proposées, et le nombre de positionnement en fonction de la profondeur de l'arborescence (faire donc des essais manuels pour déterminer tout çà)

3) Ayant eu quelques soucis avec les noms de dossiers thunderbird comportant des espaces et des apostrophes, j'ai renommé mes dossiers en remplaçant ces caractères pas des underscores. Je pense qu'en quotant bien où il faut, çà ne devrait pas poser de problème. Je ne suis pas sur d'avoir fait tout çà bien, à essayer ...

4) Le dossier de sortie de plus bas niveau, devra toujours être le premier, et donc par voie de conséquence, il faudra traiter les dossiers de même niveau en commençant pas celui le plus bas dans l'ordre alphabétique.

5) Toujours lancer le programme avec thunderbird ouvert et en ayant fixé le dossier et mail de départ (en se positionnant dans la liste), pas nécessairement sur le premier de la liste, mais sur le premier à traiter

6) # Calcul du nombre de mails à traiter
- En forçant nombre après le calcul, il est possible de limiter le nombre de mails à traiter

7) On pourrait imaginer traiter plusieurs dossiers de même niveau , tout çà dans une boucle de niveau supérieure. J'ai eu la flemme, et me contente de les traiter un par un.

8) Important: çà semble évident, mais il ne faut pas toucher à la souris et au clavier pendant tout le traitement, à moins de vouloir l'interrompre, et dans ce cas là cliquer sur le terminal et Ctrl-C rapide devrait le faire.

Conclusion: ce script automatise donc l'impression dans des pdf, et c'est un vrai bonhaur que de le laisser traiter plusieurs centaines de pdf ...

Voilà, je pense avoir tout dit ...

Si toutefois vous aviez des difficultés, ou que vous trouviez des bugs, n'hésitez pas à rapporter ici

A+

Dernière modification par JujuLand (Le 06/10/2016, à 16:30)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#6 Le 05/10/2016, à 23:18

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Quand les mails sont un peu gros, notamment lorsqu'il y a des images en pièces jointes, la tempo est un peu limite, et des fois, çà déraille un peu ... et çà propose le nom du mail précédent, et confirmation est demandée de l'écraser.

Il suffit alors que killer le script, et de reprendre à ce mail avec le deuxième paramètre positionné.

On pourrait augmenter l'attente après la création du pdf, mais çà rallongera notablement le temps de traitement ...
Et globalement, çà ne fonctionne pas trop mal ...

A+

Dernière modification par JujuLand (Le 05/10/2016, à 23:20)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#7 Le 06/10/2016, à 09:37

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Pour illustrer un problème qui peut surgir en cas de mail dont l'impression en pdf est trop longue:

alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./mail2pdf Toirac
From - Wed Mar 30 18:16:09 2016
From - Wed Mar 30 18:16:09 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
Toirac : 6 mails à imprimer
Mail 1 sur 6
EP hydro Toirac (12 46)
Mail 2 sur 6
Enquête centrale de TOIRAC
Mail 3 sur 6
Fwd_Toirac - Usine hydroélectrique
Mail 4 sur 6
Observations - Toirac - Usine hydroélectrique
Mail 5 sur 6
Observations - Toirac - Usine hydroélectrique
Mail 6 sur 6
Donnez un titre au mail :

Le mail 4 a pris trop de temps, et le script n'a pas le temps de changer le mail actif dans la liste des mails.
Celui-ci est repris par le script, et demande confirmation de l'éécrasement du pdf précédent.
Mais le script continue, demandant alors un titre.
Cet égarement du script est le bienvenu, car il bloque le script.
Il suffit alors de tuer le script par un Ctrl-C, et de refuser l'écrasement.
Le dernier pdf créé est ok.
Il suffira alors de relancer le script avec le second paramètre (ici 5)

alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ ./mail2pdf Toirac 5

From - Wed Mar 30 18:16:09 2016
From - Wed Mar 30 18:16:09 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
From - Wed Mar 30 18:16:10 2016
Toirac : 6 mails à imprimer
Mail 5 sur 6
Enquête Toirac
Mail 6 sur 6
Barrage de Toirac - Rapport d'enquête publique t
 
alain@Gramps-JujuLand:~/Bureau/Archives_GADEL$ 

Une solution pour éviter ce problème est d'augmenter l'attente (vers la ligne 135)
Une autre sera peut-être de vérifier le titre de la fenêtre active.

A+

Dernière modification par JujuLand (Le 06/10/2016, à 16:31)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#8 Le 06/10/2016, à 16:35

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Tentative d'automatiser l'attente de fin de création du pdf.

Cà fonctionne globalement pas trop mal, simplement, sur des gros mails, çà peut foirer ...

Qaund pour des raisons diverses, çà foire :
1) se positionner systématiquement sur le bon mail dans la liste.
2) relancer la commande avec le deuxième paramètre qui devrait être donné par les derniers messages du script.
3) si çà attend sans raison, Ctrl-C dans la console, et relancer comme dit juste au-dessus.

A+

Dernière modification par JujuLand (Le 06/10/2016, à 16:35)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#9 Le 07/10/2016, à 00:53

LeoMajor

Re : [Résolu] Impression automatique de mails en pdf

bonjour,
1/ variante avec mutt, pour imprimer, les messages from tata, sujet cron et inférieurs à 1 jour. fonctionne très bien

mutt -e 'push <limit>~ftata~scron~d<1d<enter><tag-pattern>~A<enter><tag-prefix><print-message>o<enter><pipe-entry>"export DISPLAY=:0; notify-send message\ imprimé"<enter><quit>' -f imaps://toto@domain.tld:secret@imap.domain.tld:993/Inbox

l'avantage est de profiter de la pleine puissance des motifs de recherche

2/ tu peux partir aussi sur
a/archivemail  (un fetchmail mode simple )

archivemail --prefix '%Y%m%d' --all --copy --no-compress -o /tmp/archive imaps://martin.pierre@orange.fr:mot_de_passe@imap.orange.fr/INBOX 
->archive type mbox

b/ /mbox-extract-attachments.py
pour les pièces jointes, à partir d'une archive mbox, tu as mbox-extract-attachments.py. Efficace. https://github.com/PabloCastellano/pabl … chments.py

c/ git-mailsplit   (paquets git,git-doc)

/usr/lib/git-core/git-mailsplit -o/tmp/test /tmp/archive/INBOX_archive

pour extraire message par message, text-plain, html, ou *d/

ensuite, tu as l'embarras du choix.
a/renommer en "*.eml"  pour les reinjecter par glisser/déposer ou utiliser  ImportExportTools
b/ pandoc,  wkhtmltopdf,  pdfunite ...  txt,html -> book.pdf
cela dépend comment tu conserves l'archive, ce que tu veux en faire

c/  lp pour imprimer, est très efficace. imprime n'importe quoi. pdf, txt, image, odt, ...

lsptat -p  # get printer
sudo adduser toto lp
sudo adduser toto lpadmin
lp -d HP_LaserJet_100_colorMFP_M175nw -o media=A4,tray1 -o fit-to-page -o position=top -o scaling=100  item.pdf

d/ (compatibles maildir, si tu veux construire un dossier maildir temporaire (maildirmake /opt/toto/Maildir), mutt -f /opt/toto/Maildir

Hors ligne

#10 Le 07/10/2016, à 13:07

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Merci pour ce post interessant.

Toutefois, il semble que les diverses solution ne s'adaptent exactement pas à ce que je veux faire.
Je précise ici ce que je désire:

1) Dans des fichiers mbox alimentés par les utilisateurs (donc choix des mails préalablement fait), imprimer tous les mails en pdf mode texte (pas image) pour pouvoir ensuite indexer les pdf sur des mots avec recoll.

Donc, sauf erreur de ma part, mutt, que je trouve par ailleurs très bien, ne permet l'impression pdf qu'en mode image.

2) Avoir un encodage utf-8 dans le pdf, même si les messages sont encodée en iso_8859-1.
Cà pour le moment, c'est ce qui me gêne le plus, car je ne sais pas faire avec thunderbird qui se tamponne du choix affichage/unicode lors de l'impression.

3) récupérer les pièces jointes, donc mbox-extract-attachments.py devrait fonctionner.

Mais le plus prometteur concernant l'encodage pourrait être une utilisation de git-mailsplit et recode.

Quand au lp , les options scaling, position ou fit-to-page me font penser à de l'impression d'image.

Bon, je vais tester tout çà ...

Merci
A+

Dernière modification par JujuLand (Le 07/10/2016, à 13:07)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#11 Le 07/10/2016, à 16:48

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Bon, j'ai fait quelques essais, et notamment pour ne plus être emmerdé par l'encodage.
En effet, Thunderbird positionne par défaut l'affichage Unicode/Occidental en fonction du paramètre charset présent dans le mail.
J'ai donc fait un test sur un fichier mbox entier sans splitter:

sed "s|^o’|'|g" < $1 | sed "s|ISO-8859-1|UTF-8|g" -> ${1}_a

Le premier sed a pour effet de remplacer les ' encodés en ISO8859-1 (char 00 92) en une apostrophe '
Dans la ligne j'ai mis ^o, car le caractère tel quel n'est pas affichable, mais ^o ne fonctionne pas (vu en edition avec nano) il faut créer la ligne aved gedit, mousepad, ... et faire un copier coller depuis un mbox ouvert avec le mêm type d'éditeur.

Le second sed a pour effet de berner Thunderbird pour lui faire croire que c'est de l'UTF-8

Et çà marche smile

Dans Thunderbird, il se positionne automatiquement sur unicode et affiche correctement, et l'impression est correcte.

Bon, reste maintenant à voir comment, si possible, automatiser l'impression dans des pdf sans utiliser l'usine à gaz, qui fonctionne à peu près, par une solution plus robuste.

Si quelqu'un à une idée ...

A+

Dernière modification par JujuLand (Le 07/10/2016, à 16:50)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#12 Le 07/10/2016, à 19:10

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Je viens d'essayer mbox-extract-attachments.

J'ai trouvé un bug, lorsque le champ From: est absent (je ne sais pas comment çà peut se produire, mais j'ai quelques mails comme çà.
J'ai corrigé le source pour éviter le crash, et donner la valeur 'Expéditeur inconnu' lorsque c'est le cas.

De plus, j'y ai mis quelques couleurs pour le rendre plus lisible.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# mbox-extract-attachments.py - Extract attachments from mbox files - 16/March/2012
# Copyright (C) 2012 Pablo Castellano <pablo@anche.no>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# Notes (RFC 1341):
# The use of a Content-Type of multipart in a body part within another multipart entity is explicitly allowed. In such cases, for obvious reasons, care must be taken to ensure that each nested multipart entity must use a different boundary delimiter. See Appendix C for an example of nested multipart entities. 
# The use of the multipart Content-Type with only a single body part may be useful in certain contexts, and is explicitly permitted. 
# The only mandatory parameter for the multipart Content-Type is the boundary parameter, which consists of 1 to 70 characters from a set of characters known to be very robust through email gateways, and NOT ending with white space. (If a boundary appears to end with white space, the white space must be presumed to have been added by a gateway, and should be deleted.) It is formally specified by the following BNF

# Related RFCs: 2047, 2044, 1522


__author__ = "Pablo Castellano <pablo@anche.no>"
__license__ = "GNU GPLv3+"
__version__ = 1.2
__date__ = "12/04/2012"


import mailbox
import base64
import os
import sys
import email

# Normal
gBla='\033[1;30m'
gRed='\033[1;31m'
gGre='\033[1;32m'
gYel='\033[1;33m'
gBlu='\033[1;34m'
gMag='\033[1;35m'
gCya='\033[1;36m'
gWhi='\033[1;37m'
# Sans couleur
noColor='\033[0m'


BLACKLIST = ('signature.asc', 'message-footer.txt', 'smime.p7s')
VERBOSE = 1

attachments = 0 #Count extracted attachment
skipped = 0

# Search for filename or find recursively if it's multipart
def extract_attachment(payload):
	global attachments, skipped
	filename = payload.get_filename()

	if filename is not None:
		print "\n%sPièce(s) jointe(s) trouvée(s)!%s" %(gGre, noColor)
		if filename.find('=?') != -1:
			ll = email.header.decode_header(filename)
			filename = ""
			for l in ll:
				filename = filename + l[0]
			
		if filename in BLACKLIST:
			skipped = skipped + 1
			if (VERBOSE >= 1):
				print "%sNon traitée %s%s%s (liste noire)%s\n" %(gCya, gYel, filename, gCya, noColor)
			return

		# Puede no venir especificado el nombre del archivo??		
	#	if filename is None:
	#		filename = "unknown_%d_%d.txt" %(i, p)

		content = payload.as_string()
		# Skip headers, go to the content
		fh = content.find('\n\n')
		content = content[fh:]

		# if it's base64....
		if payload.get('Content-Transfer-Encoding') == 'base64':
			content = base64.decodestring(content)
		# quoted-printable
		# what else? ...

		print "%sExtraction de %s%s%s (%s%d%s octets)%s" %(gGre, gYel, filename, gGre, gYel, len(content), gGre, noColor)

		n = 1
		orig_filename = filename
		while os.path.exists(filename):
			filename = orig_filename + "." + str(n)
			n = n+1

		try:
			fp = open(filename, "w")
#			fp = open(str(i) + "_" + filename, "w")
			fp.write(content)
		except IOError:
			print "%sAbandon, %Erreur d'entrée-sortie!!!%s" %(gRed, gCya, noColor)
			sys.exit(2)
		finally:
			fp.close()	

		attachments = attachments + 1
	else:
		if payload.is_multipart():
			for payl in payload.get_payload():
				extract_attachment(payl)


###
print "\n%smbox-extract-attachments %s1.2%s" %(gMag, gRed, noColor)
print "%sExtraire les pièces jointes des fichiers mbox%s" %(gGre, noColor)
print "%sCopyright (C) 2012 Pablo Castellano%s" %(gBlu, noColor)
print

if len(sys.argv) < 2 or len(sys.argv) > 3:
	print "%sUsage: %s%s%s %s<fichier_mbox>%s %s[répertoire_destination]%s" %(gMag, gYel, sys.argv[0], noColor, gGre, noColor, gCya, noColor)
        print
	sys.exit(0)

filename = sys.argv[1]
directory = os.path.curdir

if not os.path.exists(filename):
	print "%sFichier inexistant: %s%s%s\n" %(gYel, gRed, filename, noColor) 
	sys.exit(1)

if len(sys.argv) == 3:
	directory = sys.argv[2]
	if not os.path.exists(directory) or not os.path.isdir(directory):
		print "%sRépertoire inexistant: %s%s%s\n" %(gYel, gRed, directory, noColor)
		sys.exit(1)

mb = mailbox.mbox(filename)
nmes = len(mb)

os.chdir(directory)

for i in range(len(mb)):
	if (VERBOSE >= 1):
		print "--------------\n%sAnalyse du message numéro :%s%d%s"  %(gWhi, gCya, i, noColor)

	mes = mb.get_message(i)
	em = email.message_from_string(mes.as_string())

	subject = em.get('Subject')
	if subject.find('=?') != -1:
		ll = email.header.decode_header(subject)
		subject = ""
		for l in ll:
			subject = subject + l[0]

	em_from = em.get('From')
        if em_from is None:
           em_from = 'Expéditeur inconnu'
        else:
		if em_from.find('=?') != -1:
			ll = email.header.decode_header(em_from)
			em_from = ""
			for l in ll:
				em_from = em_from + l[0]

	if (VERBOSE >= 1):
		print "%s%s%s - \nDe: %s%s%s" %(gGre, subject, noColor, gRed, em_from, noColor)

	filename = mes.get_filename()
	
	# Puede tener filename siendo multipart???
	if em.is_multipart():
		for payl in em.get_payload():
			extract_attachment(payl)
	else:
		extract_attachment(em)

print "\n--------------"
print "%sTotal des pièces jointes extraites:%s %d%s" %(gYel, gCya, attachments, noColor)
print "%sTotal des pièces jointes non traitées:%s %d%s" %(gYel, gCya, skipped, noColor)
print

Cet outil est bien pratique ...

Je continue à chercher pour la fabrication automatique de pdf, mais il me semble que le plus simple serait d'utiliser les librairies déjà existantes avec python. Ce serait plus efficient pour décoder les mails, à savoir ensuite s'il existe une librarie python qui permette d'imprimer dans un pdf. Le contraire serait étonnant ...

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#13 Le 07/10/2016, à 19:21

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Ben oui, çà existe, et çà semble déjà installé sous Ubuntu : python-reportlab

Y'a plus qu'à ...

Je vais utiliser la trame de mbox-extract-attachments

Voilou ...

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#14 Le 10/10/2016, à 00:38

LeoMajor

Re : [Résolu] Impression automatique de mails en pdf

je ne pense pas, que tu peux appliquer à l'emporte pièce de l'utf-8, sur le message, qui est plutôt vu comme un conteneur, avec les métadonnées, les sections du mime, et les pièces jointes.
pour le mime, il y a reformime pour déstructurer, extraire, les sections du mime, et makemime, pour le reconstruire, et faire un message valide vu par postfix. Le pdf déduit est plutôt un aperçu, et le considérer comme tel.

quelques tests avec reformime  à partir de git-mailsplit, avant de boucler les messages

msg=/opt/toto/test/mailsplit/0042
echo "$msg"
dir=$(dirname "$msg")
name=$(basename "$msg")

# metadata
awk 'BEGIN {RS="\n\t |\n"} ;NR==1,/MIME/' "$msg" | sed  '/MIME/Id' > /tmp/metadata

# mime

mime_index=( $(cat "$msg" |reformime) )
ctype=0
for((j=0;j<${#mime_index[@]};j++));
 do section=$(cat "$msg" |reformime -s ${mime_index[$j]} -i)
 echo "$section"
 body=$(awk '/content-type: text\/plain/{tg=2};/content-type: text\/html/{tg=4};END{printf("%i",tg)}' <<< "$section")
 if [ $body -eq 2 ]; then
 charst=$(awk '/charset/{printf("%s",$NF)}' <<< "$section")
 # echo ":$charst:"
 cat "$msg" | reformime -s ${mime_index[$j]} -x"${msg}-txt-"
 target=$(find "$dir" -iname "*${name}-txt*" -type f -print -quit)
  	if [ "x$charst" != "xutf-8" ]; then
	recode $charst..utf-8 "$target"
	echo "recode $charst..utf-8"

	fi
	#pdf
	echo "$target"
	cat "$target" >> /tmp/metadata
	unoconv -o "${msg}.pdf" -f pdf /tmp/metadata 2>/dev/null

 fi
 
 #2 html -eq 4
 #3 attachments énumération filename seulement

 ctype=$(($ctype + $body))
 echo "ctype:$ctype"

done

le pdf obtenu est rétrocompatible avec pdftotext et aussi indexable avec recoll.

Hors ligne

#15 Le 10/10/2016, à 18:10

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Je suis donc parti de mbox-extract-attachements, comme je l'annonçais, et j'arrive à un résultat très convenable, et donc j'abandonne l'utilisation d'un script.

En effet, quelque soit le contenu, ISO-8859-1 ou UTF-8 les accents sont correctements mis dans le fichier mbox, et c'est ensuite uniquement dans le navigateur que l'encodage du mail est utilisé. Donc, en prenant le texte tel quel, c'est correct.

La seule exception est l'apostrophe, qui, dans les mails encodés en ISO-8859-1, est le caractèe 0x0092. Problème que je n'ai pas si je transforme tous les charset en UTF-8, mais j'aurai voulu ne pas avoir à modifier le fichier mbox.

Pour avoir un pdf nickel, il faudrait remplacer ce caractère par une apostrophe, maiheureusement, je n'ai pas trouvé comment faire çà en python, car :

re.sub("<chr 0x0092>,"'",para)

ne fait rien ...
J'ai remplacé ici le caractère par <chr 0x0092>, car le copier/coller ici le supprime ...

Il ne me reste, en plus de ce détail, qu'à traiter les mails html.

Les pdfs sont évidemment indexables, et cerise sur le gateau, les pièces jointes de type images ne sont pas incluses dans le pdf, ce qui fait des pdf plus légers ...

La version modifiée de ce script python parmet d'extraire les pièces jointes ou de générer des pdfs ou les deux.

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#16 Le 16/10/2016, à 16:22

JujuLand

Re : [Résolu] Impression automatique de mails en pdf

Bon, jai terminé le premier jet d'un outil en python et qui fait tout çà ...

Voir le thread suivant.

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne