Comment puis-je envoyer un fichier comme pièce jointe d'un email à l'aide de ligne de commande de Linux?

StackOverflow https://stackoverflow.com/questions/17359

  •  08-06-2019
  •  | 
  •  

Question

J'ai créé un script qui s'exécute tous les soirs sur mon serveur Linux qui utilise mysqldump pour sauvegarder chacun de mes bases de données MySQL pour .les fichiers sql et les paquets ensemble sous la forme d'un comprimé .fichier tar.La prochaine étape je veux accomplir consiste à envoyer ce fichier tar par e-mail à un serveur de messagerie à distance pour plus de sécurité.J'ai été en mesure d'envoyer le raw script dans le corps d'un email par la tuyauterie de la sauvegarde de fichier texte mailx comme suit:

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

cat les échos de la sauvegarde du fichier de texte qui est transmis dans le mailx programme avec l'adresse email du destinataire passée en argument.

Tout ceci accomplit ce dont j'ai besoin, je pense que ça pourrait être une étape mieux, Est-il possible, à l'aide de scripts shell ou autre, pour envoyer le comprimé .fichier tar sortant e-mail comme un pièce jointe? Ce serait battu d'avoir à traiter avec de très longs messages électroniques qui contiennent des données d'en-tête et ont souvent de la parole de l'habillage de problèmes, etc.

Était-ce utile?

La solution

Aucun des mutt ceux fonctionné pour moi.Il pensait à l'adresse e-mail a été une partie de la attachemnt.A faire:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

Autres conseils

Ou, à défaut mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com

En regardant man mailx, le programme mailx n'a pas une option pour joindre un fichier.Vous pouvez utiliser un autre programme tel que mutt.

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

Options de ligne de commande pour mutt peut être affichée avec mutt -h.

En fonction de 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 

J'utilise mpack.

mpack -s subject file user@example.com

Malheureusement mpack ne reconnaît pas " - " comme un alias pour l'entrée standard.Mais les travaux suivants, et peut facilement être enveloppé dans un (shell) alias ou un script:

mpack -s subject /dev/stdin loser@example.com < file

J'utilise SendEmail, qui a été créé pour ce scénario.Il est emballé pour Ubuntu donc je suppose que c'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/

 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

Vous pouvez utiliser mutt pour envoyer l'e-mail avec pièce jointe

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

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

# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
    to="$1"
    cc="$2"
    subject="$3"
    body="$4"
    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
}

Envoyer un texte en Clair corps e-mail avec un texte clair de l'attachement 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 retours à la ligne

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

Assurez-vous que vous avez un fichier /home/el/attachfile.txt définie 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 ceci: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

Sur Linux, Envoyez corps HTML e-mail avec une pièce jointe au format PDF avec sendmail:

Assurez-vous que vous avez ksh installé: yum info ksh

Assurez-vous que vous avez sendmail est installé et configuré.

Assurez-vous que vous avez uuencode installé et disponible: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

Faire un nouveau fichier appelé test.sh et la mettre dans votre répertoire home: /home/el

Placez 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

Modifier les exporter des variables sur le haut de test.sh pour refléter votre adresse et les noms de fichiers.

Télécharger un test de document pdf et de le mettre dans /home/el appelé pdf-test.pdf

Rendre un fichier appelé /home/el/email_body.htm et de mettre cette ligne:

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

Assurez-vous que le fichier pdf a suffisamment de 755 autorisations.

Exécuter le script ./test.sh

Vérifiez votre e-mail boîte de réception, 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 que dire 15 fois dans une journée, même si vous envoyez les e-mails pour vous-même, les filtres anti-spam dans gmail peut blacklister un domaine, crachant des e-mails sans vous donner une option pour les laisser passer.Et vous trouverez cela ne fonctionne plus, ou il ne laisse passer de la saisie, ou l'e-mail n'est pas accordé à tous.Si vous avez à faire beaucoup de tests sur ce, les étaler sur plusieurs jours ou vous serez étiqueté comme un spammeur et cette fonction ne fonctionnent plus du tout.

Il y a plusieurs réponses ici, ce qui suggère mail ou mailx donc, ce n'est plus un arrière-plan pour vous aider à les interpréter dans leur contexte.

Notes Historiques

Les origines de Unix mail revenir en arrière dans les brumes de l'histoire des débuts de Bell Labs d'Unix™ (1969?), et nous avons probablement ne peut pas espérer aller dans sa généalogie complète ici.Il suffit de dire qu'il y a de nombreux programmes qui héritent de code à partir de ou ré-écrire (ou d'hériter de code à partir d'une remise à plat de l') mail et qu'il n'y a pas qu'une seule base de code qui peut être identifié sans ambiguïté que "la" mail.

Cependant, l'un des prétendants à ce poste est certainement "Berkeley Mail", qui a été à l'origine appelé Mail avec un M majuscule dans 2BSD (1978);mais dans 3BSD (1979), il a remplacé les minuscules mail de commande, ce qui entraîne quelques nouvelles de la confusion.SVR3 (1986) inclus un dérivé qui a été appelé mailx.L' x a sans doute ajouté pour le rendre unique et distincte;mais cela, aussi, a été copié, réimplémentée, et mutilés de sorte qu'il n'existe pas de version individuelle qui est définitif.

Retour dans la journée, le de facto standard pour l'envoi de fichiers binaires à travers le courrier électronique a été uuencode.Il existe toujours, mais a de nombreux problèmes d'utilisabilité;si possible, vous devriez envoyer des pièces jointes MIME au lieu de cela, sauf si vous efforcer d'être en mesure de communiquer avec la fin des années 1980.

MIME a été introduit dans le début des années 1990 pour résoudre plusieurs des problèmes avec la messagerie électronique, y compris le soutien pour divers types de contenu autres que du texte brut en un seul jeu de caractères qui seul est vraiment adapté pour un sous-ensemble de l'anglais (et, nous dit-on, hawaii).Cela introduit la prise en charge des messages, l'internationalisation, riche des types de contenu, etc, et a rapidement gagné du terrain tout au long des années 1990.

(Le Héritage mail/mailx notes de l'histoire a été des plus utiles lors de la rédaction du présent, et sont vaut la peine d'être lu si vous êtes dans ce genre de chose).

Offres Actuelles

À compter de 2018, Debian a trois forfaits qui incluent une mail ou mailx commande.(Vous pouvez rechercher d' 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 suis pas singulariser Debian comme une recommandation;c'est ce que j'utilise, donc je suis familier avec elle;et il fournit un moyen de distinguer les diverses solutions de rechange sans ambiguïté en se référant à leurs noms de package.Il est évidemment également de la distribution d'Ubuntu qui reçoit de ces paquets.)

  • bsd-mailx est relativement simple mailx qui ne pas semblent en charge l'envoi de pièces jointes MIME.Voir sa page de manuel et notez que ce n'est celle que vous attendez à trouver sur un *BSD système, y compris MacOS, par défaut.
  • heirloom-mailx est maintenant appelé s-nail et n' prendre en charge l'envoi des pièces jointes MIME avec -a.Voir sa page de manuel et, plus généralement, l' Héritage de projet
  • mailutils aka GNU Mailutils comprend un mail/mailx compatibilité wrapper qui n' prendre en charge l'envoi des pièces jointes MIME avec -A

Avec ces préoccupations, si vous avez besoin de votre code pour être portable et peut dépendre un peu complexe paquet, la façon simple de façon portable envoyer des pièces jointes MIME est d' utilisation mutt.

Une autre alternative - Swaks (Couteau de l'Armée 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

metamail a l'outil metasend

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b

J'ai utilisé

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

et cela a bien fonctionné pour moi.....

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

J'ai l'habitude de seulement utiliser 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.

.

le chemin le plus court pour moi, c'est

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

donc pour ton exemple ça va être

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

la bonne nouvelle est que je me souviens d'elle avec Ctrl+r pour envoyer un autre fichier...

À 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.Enregistrer le courrier reçu le corps comme db.sql.gz.b64;alors..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

à l'aide de commande mailx

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

utilisation de 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 `;

Juste pour ajouter mon 2 cents, allais-je écrire mon propre Script PHP:

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

Il y a beaucoup de façons de faire de l'attachement dans les exemples sur cette page.

Pas une méthode pour l'envoi d'e-mail, mais vous pouvez utiliser en ligne un serveur Git (par ex.Bitbucket ou un service similaire) pour que les.

De cette façon, vous pouvez utiliser git push les commandes, et toutes les versions seront stockés dans un comprimé et de manière organisée.

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

MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`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

Si le fichier est de type texte, vous pouvez l'envoyer le plus facile dans le corps comme:

sendmail recipient@example.com < message.txt

Mailutils en fait un morceau de gâteau

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file attache un fichier
  • -M permet de MIME, de sorte que vous pouvez avoir une pièce jointe et en clair à corps.

Si pas encore installé, exécutez

sudo apt install mailutils

Encore une chose à propos de mutt:par défaut, il utilise votre adresse et votre nom dans le champ "De:".Si ce n'est pas ce dont vous avez besoin, vous pouvez créer d'autres muttrc fichier contenant une chaîne de caractères comme ceci:ensemble d'="Mon mail démon "

Utilisez ce fichier avec -F option de ligne de commande.

Si mutt ne fonctionne pas ou n'est pas installé,essayez ce-

*#!/bin/sh

FilePath=$1
FileName=$2
Message=$3
MailList=$4

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*
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top