Enregistrement de l'e-mail en tant que fichier dans mutt?

28

Lorsque j'appuie sur Smutt, il enregistre le courrier dans un format de dossier de messagerie ( cur/ tmp/ new/), mais je veux qu'un seul fichier soit enregistré, tout comme la façon dont les pièces jointes sont enregistrées.

Est-ce configurable?

Marguerite
la source

Réponses:

23

Le message réel s'affiche également en tant que pièce jointe, vous pouvez donc l'enregistrer à partir de la liste des pièces jointes. À partir de l'index ou du message lui-même, appuyez sur vpour ouvrir les pièces jointes et spour enregistrer

Michael Mrozek
la source
Juste une note: si votre e-mail contient des pièces jointes, enregistrer uniquement la première entrée de la liste des pièces jointes enregistrera le message - mais sans les pièces jointes incluses à l'intérieur.
sdaau
3
Autre remarque: cela n'enregistre aucun en-tête, y compris l'expéditeur, le destinataire et le sujet.
Sparhawk
31

La scommande enregistre dans une boîte aux lettres, qui pour vous est au format maildir. Malheureusement, il n'y a pas de commande d'enregistrement dans un fichier, peut-être parce que dans le format mbox historique, une boîte aux lettres qui contient un seul courrier n'est qu'un fichier contenant ce courrier.

La muttcommande pipe-message (raccourci par défaut |) peut être utilisée pour cela. Il ouvre une ligne de commande et vous écrivez cat > DESIRED-FILE-PATH.

L'option "pipe-decode" contrôle ce qui arrive aux en-têtes et aux parties MIME lorsque vous enregistrez un message de cette façon.

On pourrait probablement écrire une macro pour cette fonctionnalité.

Kai von Fintel
la source
Cool, cela peut également enregistrer les en-têtes, mais pour l'instant, j'utiliserais la manière de Michael, merci!
daisy
1
Cela fonctionne bien et fournit un moyen efficace d'enregistrer plus de 50 e-mails (en utilisant le marquage de correspondance de modèles) dans un fichier. J'ai dû creuser un peu pour découvrir qu'en ajoutant set pipe_decode=yesà mon muttrc, c'était ce sur quoi Kai von Fintel écrivait.
Screenack
cela permet également d'enregistrer les pièces jointes dans le fichier e-mail exporté.
sdaau
c'est très bien, mais je vois des sauts de ligne non traités avec =cela.
Jack Wasey
Impressionnant. Cela a très bien fonctionné pour moi. Je voulais juste extraire plus de 20 e-mails d'un Maildir obsolète. À votre santé!
prageeth
10

Si vous touchutilisez un fichier, puis essayez d'enregistrer ou de copier un message, mutt l'utilisera comme mbox.

Vous pouvez également utiliser la copie au lieu de la sauvegarder. Mutt suppose qu'un courrier ne devrait exister qu'en une seule copie et l'enregistrement d'un message dans une autre boîte aux lettres le supprimera de la première, tandis que la copie fera une copie appropriée.

kyrias
la source
1
J'avais besoin d'obtenir le message avec les en-têtes complets pour le coller dans un script de test de filtre, et cela a parfaitement fonctionné.
Soren Bjornstad
2

La réponse de Kai von Fintel fonctionne parfaitement, mais je pensais juste partager une macro pour rationaliser ce processus.

Premièrement, dans muttrc:

macro index,pager S "| ~/.local/bin/file_email /tmp<enter>"

Cela redirige l'e-mail complet (y compris les en-têtes et les pièces jointes) vers le script suivant. Créez un fichier exécutable à ~/.local/bin/file_email.

#!/usr/bin/env bash
# Save piped email to "$1/YYMMDD SUBJECT.eml"

# Don't overwrite existing file
set -o noclobber

message=$(cat)

mail_date=$(<<<"$message" grep -oPm 1 '^Date: ?\K.*')
formatted_date=$(date -d"$mail_date" +%y%m%d)
# Get the first line of the subject, and change / to ∕ so it's not a subdirectory
subject=$(<<<"$message" grep -oPm 1 '^Subject: ?\K.*' | sed 's,/,∕,g')

if [[ $formatted_date == '' ]]; then
  echo Error: no date parsed
  exit 1
elif [[ $subject == '' ]]; then
  echo Warning: no subject found
fi

echo "${message}" > "$1/$formatted_date $subject.eml" && echo Email saved to "$1/$formatted_date $subject.eml"

Ce script enregistre le fichier dans le premier argument (c'est-à-dire dans l' muttrcexemple ci-dessus, l'e-mail sera enregistré dans /tmp). Le format du nom de fichier est YYMMDD SUBJECT.eml. Il se convertit également /en pour empêcher la création de sous-répertoires.

Sparhawk
la source
Ce ne serait pas plus facile à utiliser formaildans le script?
0andriy
@ 0andriy que je ne connais pas formail, j'ai donc lu. Cependant, je ne sais pas exactement à quelle partie de mon script vous faisiez référence? Vous utilisez formailpour extraire le sujet et la date? Si oui, probablement une bonne idée. Je vous exhorte à écrire une réponse; Je le voterais sans aucun doute.
Sparhawk
0

J'ai essayé toutes les réponses suggérées, mais je n'ai pas pu enregistrer le courrier électronique brut en plusieurs parties (texte / texte + texte / html) dans un fichier, y compris ses en-têtes et tout le reste. J'en avais besoin pour alimenter mon filtre anti-spam avec l'e-mail pour lui apprendre qu'un mail spécifique est du spam ou non ...

La solution que j'ai trouvée consiste à appuyer e(c'est-à-dire "modifier le message") sur le message ouvert, ce qui ouvre le message brut dans l'éditeur de votre choix. Raw signifie ici que vous obtenez le message exactement tel qu'il est arrivé dans mutt, vous avez donc tous les en-têtes et tous les octets qui composent le message.

Après avoir frappé e, j'écris simplement le tampon (j'ai défini l'éditeur sur vim ) dans un fichier avec :w <path_to_file>/<file_name>et c'est tout.

PS: j'aurais ajouté ceci comme commentaire mais vous avez besoin d'un certain niveau de réputation pour ce faire. De plus, je sais que la question est très ancienne mais comme le neomutt est encore utilisé par beaucoup de gens, j'ai pensé que cela pourrait aider quelqu'un.

Mise à jour: j'ai ignoré l' pipe-decodeoption dont Kai parlait. Avec cette option correctement définie, cela aurait également fonctionné via |. Ma solution fonctionne toujours aussi ;-)

m4110c
la source