Comment puis-je envoyer un fichier en pièce jointe par email en utilisant la ligne de commande Linux?

j'ai créé un script qui tourne chaque nuit sur mon serveur Linux qui utilise mysqldump pour sauvegarder chacune de mes bases de données MySQL .sql les classe et les empaquette ensemble sous forme compressée .fichier tar. La prochaine étape que je veux accomplir est d'envoyer ce fichier tar par courriel à un serveur de courriel distant pour le garder en sécurité. J'ai été en mesure d'envoyer le script brut dans le corps d'un e-mail en pipant le fichier de texte de sauvegarde à mailx comme ainsi:

$ cat mysqldbbackup.sql | mailx backup@email.com

cat echoue le texte du fichier de sauvegarde qui est acheminé dans le programme mailx avec l'adresse e-mail du destinataire passée comme argument.

bien que cela accomplisse ce dont j'ai besoin, je pense qu'il pourrait y avoir un pas de mieux, est-il possible, en utilisant des scripts shell ou autrement, d'envoyer le comprimé .fichier tar sortant e-mail comme un attachement ? cela éviterait d'avoir à traiter de très longs messages électroniques qui contiennent données d'en-tête et ont souvent des problèmes de Word-wrapping, etc.

267
demandé sur Braiam 2008-08-20 06:48:50

25 réponses

aucun des bâtards n'a travaillé pour moi. Il pensait que l'adresse email faisait partie de l'attaché. Devait faire:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
279
répondu rynop 2012-03-01 21:26:21

Ou, à défaut mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com
78
répondu Daniel Fone 2008-08-20 04:48:25

D'après man mailx , le programme mailx n'a pas d'option pour joindre un fichier. Vous pourriez utiliser un autre programme comme mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com
Les options de ligne de commande

pour mutt peuvent être affichées avec mutt -h .

40
répondu Chris N 2011-02-03 13:27:40

Selon votre version de linux, il peut être appelé mail. Pour citer @David ci-dessus:

mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

ou aussi:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 
38
répondu Nathan Fellman 2012-11-29 07:56:25

j'utilise mpack.

mpack -s subject file user@example.com

malheureusement mpack ne reconnaît pas ' - ' comme alias pour stdin. Mais le travail suivant, et peut facilement être enveloppé dans un alias (shell) ou un script:

mpack -s subject /dev/stdin loser@example.com < file
28
répondu 2009-09-24 07:00:08

j'utilise SendEmail, qui a été créé pour ce scénario. Il est emballé pour Ubuntu donc je suppose qu'il est disponible

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail /

26
répondu Fredrik Wendt 2016-12-18 19:44:27
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
22
répondu Sourabh Potnis 2015-05-22 09:52:27

j'ai écrit une fois cette fonction pour ksh sur Solaris (utilise Perl pour encodage base64):

# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
    to=""
    cc=""
    subject=""
    body=""
    filename="${5:-''}"
    boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
    {
        print -- "To: $to"
        print -- "Cc: $cc"
        print -- "Subject: $subject"
        print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
        print -- "Mime-Version: 1.0"
        print -- ""
        print -- "This is a multi-part message in MIME format."
        print -- ""
        print -- "--$boundary"
        print -- "Content-Type: text/plain; charset=ISO-8859-1"
        print -- ""
        print -- "$body"
        print -- ""
        if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
            print -- "--$boundary"
            print -- "Content-Transfer-Encoding: base64"
            print -- "Content-Type: application/octet-stream; name=$filename"
            print -- "Content-Disposition: attachment; filename=$filename"
            print -- ""
            print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
            print -- ""
        fi
        print -- "--${boundary}--"
    } | /usr/lib/sendmail -oi -t
}
11
répondu glenn jackman 2011-02-03 14:48:42

vous pouvez utiliser mutt pour envoyer l'email avec pièce jointe

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
10
répondu David Schlosnagle 2017-11-15 08:12:45

envoyer un courriel en clair avec une pièce jointe en clair avec mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com

ci-dessous est la même commande que ci-dessus, sans les nouvelles lignes

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com

assurez-vous d'avoir un fichier /home/el/attachfile.txt défini avec ce contenu:

<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's information free, while bankers that pilfer 
trillions in citizens assets through systematic inflation get the nod and 
walk free among us.
</body></html>

si vous n'avez pas uuencode lire: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

sur Linux, envoyer un courriel HTML corps avec une pièce jointe PDF avec sendmail:

assurez-vous d'avoir installé ksh: yum info ksh

assurez-vous que vous avez installé et configuré sendmail.

assurez-vous d'avoir uuencode installé et disponible: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

créer un nouveau fichier appelé test.sh et mettez - le dans votre répertoire personnel: /home/el

mettre le code suivant dans test.sh :

#!/usr/bin/ksh
export MAILFROM="el@defiant.com"
export MAILTO="youremail@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID

(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/plain; charset=ISO-8859-1"
 echo "You need to enable HTML option for email"
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html; charset=ISO-8859-1"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "--$MAILPART_BODY--"

 echo "--$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: uuencode"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 echo ""
 uuencode $ATTACH $(basename $ATTACH)
 echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

changez les variables d'exportation au haut de test.sh pour refléter votre adresse et vos noms de fichier.

téléchargez un document PDF test et mettez-le dans /home/el appelé pdf-test.pdf

crée un fichier appelé /home/el/email_body.htm et mettre cette ligne:

<html><body><b>this is some bold text</b></body></html>

assurez-vous que le fichier pdf a suffisamment de 755 permissions.

Exécuter le script ./test.sh

Vérifiez votre boîte mail, le texte doit être en format HTML et le fichier pdf automatiquement interprété comme un fichier binaire. Prenez soin de ne pas utiliser cette fonction plus de 15 fois par jour, même si vous vous envoyez les e-mails vous-même, les filtres anti-spam de gmail peuvent mettre sur liste noire un domaine qui envoie des e-mails sans vous donner une option pour les laisser passer. Et vous constaterez que cela ne fonctionne plus, ou qu'il ne laisse passer que la pièce jointe, ou que l'e-mail ne passe plus du tout. Si vous devez faire beaucoup de tests sur ceci, étalez-les sur des jours ou vous serez étiqueté un spammer et cette fonction ne fonctionnera plus.

9
répondu user1651561 2017-04-13 12:36:30

il y a plusieurs réponses ici suggérant mail ou mailx donc c'est plus un contexte pour vous aider à les interpréter en contexte.

Notes Historiques

les origines de La Unix mail revenir en arrière dans les brumes de l'histoire des débuts de Bell Labs d'Unix™ (1969?), et nous ne pouvons probablement pas espérer entrer dans sa généalogie complète ici. Il suffit de dire qu'Il ya de nombreux programmes qui héritent code mail et qu'il n'existe pas de base de code unique qui puisse être identifiée sans ambiguïté comme" le " mail .

cependant, l'un des candidats à ce poste est certainement "Berkeley Mail" qui a été appelé à l'origine Mail avec un Majuscule M dans 2BSD (1978); mais dans 3BSD (1979), il a remplacé le minuscule mail commande ainsi, conduisant à une nouvelle confusion. SVR3 (1986) incluait une dérivé appelé mailx . Le x a probablement été ajouté pour le rendre unique et distinct; mais cela aussi, a maintenant été copié, réimplémenté, et mutilé de sorte qu'il n'y a pas une seule version individuelle qui est définitive.

à l'époque, la norme de facto pour l'envoi de binaires par courrier électronique était uuencode . Il existe encore, mais présente de nombreux problèmes d'utilisabilité; si à dans la mesure du possible, vous devriez plutôt envoyer des pièces jointes MIME, à moins que vous ne vous efforciez spécifiquement d'être en mesure de communiquer avec la fin des années 1980.

MIME a été introduit au début des années 1990 pour résoudre plusieurs problèmes avec le courrier électronique, y compris le soutien de divers types de contenu autre que le texte simple dans un jeu de caractères qui ne convient vraiment pour un sous-ensemble de L'anglais (et, nous dit-on, Hawai'Ian). Ceci introduit la prise en charge des messages multipartis, l'internationalisation, les types de contenu riches, etc., et a rapidement gagné en popularité tout au long des années 1990.

(les Heirloom mail / mailx history notes ont été les plus utiles lors de la composition de CE, et sont certainement une valeur une lecture si vous êtes dans ce genre de chose.)

Offrandes Courantes

depuis 2018, Debian a trois paquets qui comprennent une commande mail ou mailx . (Vous pouvez cherche Provides: mailx .)

debian$ aptitude search ~Pmailx
i   bsd-mailx                       - simple mail user agent
p   heirloom-mailx                  - feature-rich BSD mail(1)
p   mailutils                       - GNU mailutils utilities for handling mail

(Je ne désigne pas Debian comme une recommandation; c'est ce que j'utilise, donc je le connais; et cela fournit un moyen de distinguer les différentes alternatives sans ambiguïté en se référant à leurs noms de paquets respectifs. C'est évidemment aussi la distro à partir de laquelle Ubuntu obtient ces paquets.)

  • bsd-mailx est un mailx relativement simple qui ne pas semble supporter l'envoi de pièces jointes MIME. Voir sa page de manuel et noter que c'est celui que vous vous attendez à trouver sur un système *BSD, y compris MacOS, par défaut.
  • heirloom-mailx est maintenant appelé s-nail et does support envoi de pièces jointes MIME avec -a . Voir sa page de manuel et plus généralement le projet Heirloom
  • mailutils alias GNU Mailutils comprend mail / mailx compatibilité wrapper which does support sending MIME attachments with -A

avec ces préoccupations, si vous avez besoin de votre code pour être portable et peut dépendre d'un paquet quelque peu complexe, le moyen simple d'envoyer facilement des pièces jointes MIME est d'utiliser mutt .

6
répondu tripleee 2018-02-02 17:35:21

une autre alternative - Swaks (couteau suisse pour SMTP).

swaks -tls \
    --to ${MAIL_TO} \
    --from ${MAIL_FROM} \
    --server ${MAIL_SERVER} \
    --auth LOGIN \
    --auth-user ${MAIL_USER} \
    --auth-password ${MAIL_PASSWORD} \
    --header "Subject: $MAIL_SUBJECT" \
    --header "Content-Type: text/html; charset=UTF-8" \
    --body "$MESSAGE" \
    --attach mysqldbbackup.sql
4
répondu Alexander Yancharuk 2017-09-05 09:57:15

metamail a l'outil metasend

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
2
répondu Gunstick 2008-09-17 15:18:03

j'ai utilisé

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

et ça a bien marché pour moi....

2
répondu poncho 2015-08-04 15:17:06

mailx a une -a option pour les pièces jointes.

1
répondu Allan Pinto 2013-12-28 19:40:50

j'utilise habituellement la commande mail sur RHEL. J'ai essayé mailx et c'est assez efficace.

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com

This is the content of my msg.

.
1
répondu Alejandro Santillan 2014-10-28 16:22:20

le chemin le plus court pour moi est

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

donc pour votre exemple ce sera

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com

la bonne partie est que je peux le rappeler avec CTRL+r pour envoyer un autre fichier...

1
répondu Pipo 2015-04-14 22:37:55

à Partir de la source de la machine

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com

sur la machine de Destination. Enregistrez le corps du courrier reçu comme db.SQL.gz.b64 ; puis..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
1
répondu Konchog 2017-01-22 13:23:24

juste pour ajouter mes 2 cents, j'écrirais mon propre Script PHP:

http://php.net/manual/en/function.mail.php

il y a plusieurs façons de faire la pièce jointe dans les exemples sur cette page.

0
répondu Mike Graf 2012-09-24 18:34:06

N'est pas une méthode pour envoyer des e-mails, mais vous pouvez utiliser un serveur Git en ligne (par exemple Bitbucket ou un service similaire) pour cela.

de cette façon, vous pouvez utiliser les commandes git push , et toutes les versions seront stockées de manière compressée et organisée.

0
répondu Ben-Uri 2014-10-28 16:22:35

C'est ce que je fais avec un gros fichier journal dans CentOS:

MAIL="`whereis mail | awk '{print }'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename ""151900920""`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    cd ${LOGDIR}
    # This works too. The message content will be taken from text file below
    # echo 'Hello!' >/root/scripts/audit_check.sh.txt
    # echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    /bin/rm "${LOGDIR}/${LOGNAME}.log"
fi
0
répondu dagorv 2015-10-06 11:23:29

si le fichier est du texte, vous pouvez l'envoyer plus facile dans le corps comme:

sendmail recipient@example.com < message.txt
0
répondu nurp 2017-02-23 11:33:39

utilisant la commande mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com

utilisant sendmail

#!/bin/ksh

fileToAttach=data.txt

`(echo "To: user@company.com"
  echo "Cc: user@company.com"
  echo "From: Application"
  echo "Subject: your subject"
  echo  your body
  uuencode $fileToAttach $fileToAttach
  )| eval /usr/sbin/sendmail -t `;
0
répondu Girdhar Singh Rathore 2017-09-19 11:21:07

autre chose à propos de mutt : par défaut, il utilise votre adresse et votre nom dans le champ" From:". Si ce n'est pas ce dont vous avez besoin, vous pouvez créer un fichier muttrc alternatif contenant une chaîne de caractères comme celle-ci.: set from= "mon démon mail "

utilisez ce fichier avec l'option de ligne de commande -F .

-1
répondu arilou 2012-10-09 16:35:39

si mutt ne fonctionne pas ou n'est pas installé,essayez ceci-

*#!/bin/sh

FilePath=
FileName=
Message=
MailList=

cd $FilePath

Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*
-1
répondu Paras Singh 2017-05-16 09:47:22