Comment puis-je envoyer un fichier comme pièce jointe d'un email à l'aide de ligne de commande de Linux?
-
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.
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
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 simplemailx
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 projetmailutils
aka GNU Mailutils comprend unmail
/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*