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.
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
Ou, à défaut mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
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
.
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
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
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
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
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
}
vous pouvez utiliser mutt pour envoyer l'email avec pièce jointe
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
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.
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 unmailx
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 comprendmail
/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
.
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
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 ça a bien marché pour moi....
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.
.
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...
à 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
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.
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.
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
si le fichier est du texte, vous pouvez l'envoyer plus facile dans le corps comme:
sendmail recipient@example.com < message.txt
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 `;
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
.
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*