我创建了一个脚本,每天晚上在我的Linux服务器上运行,使用mysqldump
将我的每个MySQL数据库备份到.sql文件,并将它们打包为一个压缩的.tar文件。我想要完成的下一步是通过电子邮件将该tar文件发送到远程电子邮件服务器以便妥善保管。我已经能够通过将备份文本文件传送到mailx
来发送电子邮件中的原始脚本,如下所示:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
回显备份文件的文本,该文本通过管道传输到mailx
程序,并以收件人的电子邮件地址作为参数传递。
虽然这可以完成我的需要,但我认为它可能更好一步,有没有办法,使用shell脚本或其他方式将压缩的.tar文件作为发送到外发电子邮件消息附件?这将不得不处理包含标题数据的非常长的电子邮件,并且通常会出现自动换行等问题。
答案 0 :(得分:287)
这些笨蛋都不适合我。它认为电子邮件地址是attachemnt的一部分。不得不这样做:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
答案 1 :(得分:78)
或者,失败的mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
答案 2 :(得分:41)
通过查看man mailx
,mailx程序没有附加文件的选项。你可以使用另一个程序,比如mutt。
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com
mutt的命令行选项可以显示mutt -h
。
答案 3 :(得分:40)
根据您的Linux版本,它可能被称为邮件。引用上面的@David:
mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
或者:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com
答案 4 :(得分:28)
我使用mpack。
mpack -s subject file user@example.com
不幸的是,mpack不会将' - '识别为stdin的别名。但是以下工作,可以很容易地包装在(shell)别名或脚本中:
mpack -s subject /dev/stdin loser@example.com < file
答案 5 :(得分:27)
我使用为此方案创建的SendEmail。它是为Ubuntu打包的,所以我认为它是可用的
sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip
答案 6 :(得分:22)
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
答案 7 :(得分:12)
您可以使用mutt发送带附件的电子邮件
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
答案 8 :(得分:11)
我曾在Solaris上为ksh写过这个函数(使用Perl进行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
}
答案 9 :(得分:9)
(
/usr/bin/uuencode attachfile.txt myattachedfilename.txt;
/usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com
下面是与上面相同的命令,没有换行符
( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com
确保您使用此内容定义了文件/home/el/attachfile.txt
:
<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>
如果你没有uuencode,请阅读:https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
确保已安装ksh:yum info ksh
确保已安装并配置了sendmail。
确保已安装uuencode且可用:https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
创建一个名为test.sh
的新文件并将其放在您的主目录中:/home/el
将以下代码放入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
更改test.sh
顶部的导出变量以反映您的地址和文件名。
下载测试pdf文档并将其放入/home/el
,名为pdf-test.pdf
创建一个名为/home/el/email_body.htm的文件,并将该行放入其中:
<html><body><b>this is some bold text</b></body></html>
确保pdf文件具有足够的755权限。
运行脚本./test.sh
检查您的电子邮件收件箱,文本应为HTML格式,pdf文件自动解释为二进制文件。小心不要在一天内使用此功能超过15次,即使您向自己发送电子邮件,gmail中的垃圾邮件过滤器也可以将滥用电子邮件的域名列入黑名单,而不会让您选择让他们通过。并且你会发现它不再有效,或者它只能通过附件,或者电子邮件根本没有通过。如果您必须对此进行大量测试,请将它们分散几天,否则您将被标记为垃圾邮件发送者,此功能将无法再使用。
答案 10 :(得分:6)
此处有几个答案提示mail
或mailx
,因此这更像是帮助您在上下文中解释这些内容的背景。
Unix mail
的起源可以追溯到贝尔实验室Unix™(1969年)早期历史的迷雾中,我们可能不希望在这里进入其完整的家谱。可以说有许多程序从mail
继承代码或重新实现(或继承重新实现的代码),并且没有单一的代码库可以明确地标识为“{”{{1} }。
然而,该位置的竞争者之一肯定是“伯克利邮件”,最初称为mail
,在2BSD中具有大写M(1978);但是在3BSD(1979)中,它也取代了小写的Mail
命令,导致了一些新的混乱。 SVR3(1986)包括一个名为mail
的衍生物。可能会添加mailx
以使其独特且独特;但是,这也已被复制,重新实现和删除,因此没有单一的个人版本是明确的。
当天,在电子邮件中发送二进制文件的事实上的标准是uuencode
。它仍然存在,但有许多可用性问题;如果可能的话,你应该发送MIME附件,除非你特别努力能够与20世纪80年代后期进行沟通。
MIME是在20世纪90年代初引入的,用于解决电子邮件的几个问题,包括支持单个字符集中除纯文本以外的各种类型的内容,这些内容仅适用于英语的一个子集(并且,我们被告知,夏威夷人)。这引入了对多部分消息,国际化,丰富内容类型等的支持,并在整个20世纪90年代迅速获得了关注。
(Heirloom mail
/mailx
history notes在撰写本文时最有帮助,如果您涉及到这类内容,当然值得一读。)
截至2018年,Debian有三个包,包括x
或mail
命令。 (您可以搜索mailx
。)
Provides: mailx
(我不是单独推荐Debian作为推荐;它是我使用的,所以我对它很熟悉;它提供了一种通过引用各自的包名来明确区分各种替代方法的方法。显然也是Ubuntu从中获取这些包的发行版。)
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
是一个相对简单的bsd-mailx
,不似乎支持发送MIME附件。请参阅其manual page并注意,默认情况下,这是您期望在* BSD系统上找到的,包括MacOS。mailx
现在被称为heirloom-mailx
, 支持使用s-nail
发送MIME附件。请参阅其manual page,更常见的是Heirloom project -a
又名GNU Mailutils包含mail
/mailx
compatibility wrapper 支持使用mailutils
发送MIME附件考虑到这些问题,如果您需要可移植代码并且可能依赖于某种复杂的程序包,则可移植地发送MIME附件的简单方法是使用-A
。
答案 11 :(得分:4)
另一种选择 - Swaks(瑞士军刀用于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
答案 12 :(得分:2)
metamail有工具metasend
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
答案 13 :(得分:2)
我用过
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
这对我有用....
答案 14 :(得分:1)
mailx
现在有附件的-a
选项。
答案 15 :(得分:1)
我通常只在RHEL上使用mail命令。我已经尝试过mailx,效率非常高。
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
This is the content of my msg.
.
答案 16 :(得分:1)
file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address
所以对于你的例子,它将是
file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com
好的部分是我可以使用Ctrl+r来回忆它以发送另一个文件......
答案 17 :(得分:1)
使用mailx命令
echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com
使用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 `;
答案 18 :(得分:1)
来自源计算机
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
在目标计算机上。将收到的邮件正文保存为 db.sql.gz.b64 ;然后.. 的
base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
答案 19 :(得分:0)
根据您的邮件命令选项(使用man mail
进行检查)和可以使用的版本
echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com
答案 20 :(得分:0)
Mailutils使这成为小菜一碟
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
-A file
附加文件-M
启用MIME,以便您可以具有附件和纯文本正文。如果尚未安装,请运行
sudo apt install mailutils
答案 21 :(得分:0)
这就是我在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
答案 22 :(得分:0)
不是发送电子邮件的方法,但您可以使用在线Git服务器(例如Bitbucket或类似服务)。
这样,您可以使用git push
命令,所有版本将以压缩和有组织的方式存储。
答案 23 :(得分:0)
答案 24 :(得分:-1)
如果mutt无效或未安装,请尝试此操作 -
*#!/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*
答案 25 :(得分:-1)
关于mutt
的另一件事:默认情况下,它会在“发件人:”字段中使用您的地址和名称。
如果它不是您需要的,您可以创建包含如下字符串的备用muttrc文件:
设置自=“我的邮件守护程序”
将此文件与-F
命令行选项一起使用。