Jolis courriers imprimés de mutt?

16

Je sais que je peux configurer une commande d'impression dans Mutt via .muttrc, par exemple:

set print=ask-yes
set print_command="..."

Mais quelle commande d'impression dois-je utiliser pour une jolie impression?

Eh bien, la a2pssortie semble un peu spartiate, même avec le -=mailraccourci. Il ne prend pas en charge UTF8 . Il y en a un papsqui est décrit comme ' Convertisseur UTF-8 vers PostScript utilisant Pango ' et qui n'inclut pas actuellement la prise en charge des marges, de la mise en page des e-mails ou quelque chose du genre.

mp: joli en-tête par défaut. Encore une fois, aucun support UTF8. Les marges par défaut sont ridiculement petites - si vous spécifiez des marges plus larges, le texte du corps est imprimé derrière le pied de page.

enscript: -Gpour les en-têtes de page fantaisie est en effet fantaisie. Pas de support UTF8 .

Qu'utilisez-vous au 21e siècle pour imprimer vos courriers à partir de Mutt?

(Il doit prendre en charge la sortie UTF8, DIN A4 en PS et / ou PDF)

maxschlepzig
la source
J'ai supprimé les notes sur MIME car mutt ne redirige pas les informations MIME vers print_command. Ainsi, il ne suffit pas de tester print_commands via la |commande (pipe) dans mutt.
maxschlepzig
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
terdon

Réponses:

19

Il y a aussi Muttprint . Il prend en charge UTF-8 et sa sortie semble décente par défaut. Muttprint utilise LaTeX et fournit des crochets pour la personnalisation.

Étant donné que j'imprime des e-mails à partir d'environnements différents, je ne peux pas utiliser une imprimante par défaut. Ainsi, je l'ai configuré (via ~/.muttrc) pour utiliser une visionneuse PDF où je peux sélectionner dynamiquement une imprimante:

set print_command='set -e; f=`mktemp`; \
        muttprint -P A4 -p TO_FILE:"$f"; evince "$f"; rm "$f"'

Mktemp utilise /tmp, par défaut. Pour utiliser un répertoire de cache personnalisé:

set print_command='set -e; f=`mktemp -p "$HOME"/.cache/mutt`; \
        muttprint -P A4 -p TO_FILE:"$f"; evince "$f"; rm "$f"'

Btw, vous pouvez définir à l' print_decodeintérieur de muttrc pour configurer si la commande print_command est capable de décoder MIME, encodages, etc. par elle-même. Par défaut, il est défini sur yesle paramètre approprié pour des commandes telles que muttprint, enscriptetc.

En ce qui concerne les problèmes UTF-8 de a2ps, enscript et mp, on peut simplement conclure qu'ils doivent être considérés comme obsolètes. En effet, en regardant les pages du projet, elles ne semblent pas être maintenues (par exemple, la dernière nouvelle de la page mp date de 2002 et mentionne une liste de diffusion située chez Sun).

maxschlepzig
la source
Cela conduit à une faille de sécurité: /tmp/$USER.psest hautement prévisible par les autres utilisateurs. Utilisez mktempcréer des fichiers temporaires! (Voir ma réponse ).
F.Hauri
@ F.Hauri, oui, compter sur /tmp/$USER.psest idiot. J'ai mis à jour ma réponse.
maxschlepzig
mktemp échouera si le fichier existe déjà ou si le répertoire n'existe pas. En cas d'échec, votre répertoire de cache se remplira de courriers imprimés indésirables. C'est la principale raison pour laquelle /tmp/*est supprimé au redémarrage.
F.Hauri
@ F.Hauri, mktempla raison d'être est d'éviter les collisions de noms de fichiers. Il peut cependant échouer pour d'autres raisons. J'ai changé la commande de telle sorte que muttprint n'est exécuté que si mktemp a réussi (je soupçonne que muttprint serait par défaut sur un autre nom de fichier lorsqu'il fest vide). Ainsi, vous ne vous retrouvez maintenant avec un fichier temporaire résiduel que si evince ou rm échoue. Je considère cela peu probable - et s'ils le font, je considère que le fichier problématique a conservé une aide pour le débogage du problème. Bien sûr, /tmpest automatiquement nettoyé. Mais $HOMEest avantageux pour les documents sensibles lorsqu'il est chiffré mais /tmpne l'est pas.
maxschlepzig
Utilisez mktemp -p $HOME/.cache/mutt-XXXXXXXXXXdans ce cas, mais mktempc'est l'outil correct.
F.Hauri
3

Vous pouvez également envisager d'utiliser paps , qui lit un fichier codé UTF-8 et génère un rendu en langage PostScript du fichier. Le rendu se fait en créant des courbes de contour via le backend pango ft2.

Aaron Massey
la source
3

Plus sûr et utilisant moins de papier, créez un wrapper:

Il y a ma commande d'impression pour .muttrc:

set print_command="$HOME/bin/print_preview-wrapper.sh"

Et il y a le contenu de "$HOME/bin/print_preview-wrapper.sh"

#!/bin/bash

read tmpdir < <(mktemp -d /tmp/print_preview-$USER-XXXXXXXX)
cd $tmpdir || exit 1

trap "cd && rm -fR $tmpdir;exit" 0 1 2 3 6 9 15

cat >file.eml
muttprint -P A4 -p TO_FILE:file.ps <file.eml 

read numPages < <(sed '/^%%Pages/{s/%%Pages: //;q;};d' file.ps)
(( numPages > 1 )) &&
    muttprint -2 -P A4 -p TO_FILE:file.ps <file.eml 

gv file.ps

Cette volonté

  • créer en toute sécurité un répertoire temporaire pour stocker le courrier d'impression en cours,
  • les convertir en postscript, mais
    • s'il y a plus d'une page,
    • les convertir à nouveau, mais en mettant 2 pages par feuille.
  • exécuter gvparce que je l'aime, mais vous pouvez exécuter n'importe quel autre outil.
  • supprimer le répertoire temporaire à la sortie.
F. Hauri
la source
A read tmpdir < <(mktemp -d /tmp/print_preview-$USER-XXXXXXXX)un avantage sur tmpdir=$(mktemp -d /tmp/print_preview-$USER-XXXXXXXX)?
maxschlepzig
@maxschlepzig pour seulement 1 variable, pas vraiment. Cette syntaxe pourrait être utile pour assigner plusieurs variables à la fois:read host foo foo ip < <(host google.com); echo $ip $host
F. Hauri
1

Voici une recette simple que j'utilise sur différents UNIX:

set print_command="iconv --unicode-subst="_" -f utf-8 -t iso-8859-1 | enscript -P ••My_printer••"

••My_printer••est le nom de l'imprimante.

dan
la source
Écraser tous les caractères Unicode en dehors du répertoire de base Latin-1 ne semble probablement pas ce que l'OP recherche, et donc le dernier millénaire.
tripleee