备份并利用mutt发送邮件

利用mutt邮件客户端,将备份文件发送至备份邮箱。按星期创建7个文件夹,每天备份放入本星期当天文件夹内,放入前清空历史文件,7天一个循环。

1.安装MUTT邮件客户端

# yum install mutt -y # mkdir 0 1 2 3 4 5 6 7

是由于超过系统默认发送附件大小,修改成如下大小即可(2G)

# postconf -e "message_size_limit = 2048000000"
# postconf -e "mailbox_size_limit = 2048000000"

建立当前用户的.muttrc文件

#vi ~/.muttrc
set envelope_from=yes
set from=noreply@unuw.com
set realname="unuwadmin"
set use_from=yes

2.创建脚本

[root@www backup]# cat backup.sh
#!/bin/sh
#File: /backup/backup.sh

# =========================================================
# 请输入,你想让备份数据放置到哪个独立的目录区
basedir=/backup

# =========================================================
export LANG=C

# 定义blog.unuw.com备份路径
uwuw_bak=$basedir
#[ ! -d "$basedir/blog.unuw.com" ] && mkdir -p $basedir/blog.unuw.com

# 定义邮件附件路径
mail_attach_www=$uwuw_bak/blog.unuw.com_$(date +%F_%H%M%S).tar.bz2
mail_attach_etc=$uwuw_bak/www.unuw.com_etc_$(date +%F_%H%M%S).tar.bz2

# 定义邮件标题
mail_subject="unuw.com_daily_backup"
# 注:这里的标题之间的字符不能有空格,如有空格会按照邮件名发出,例如daily@www.example.com,backup@www.example.com 本例以下划线代替

# 定义邮件内容
mail_content=/tmp/mail_content.txt
mail_code="send www.unuw.com to you at $(date +%F_%H%M)"

# 定义邮件地址
mail_address="wanghui3w@139.com"

# 2.备份:
cd /data
tar -jpcf $mail_attach_www /data/gitblog-2.3.2
tar -jpcf $mail_attach_etc /etc

# 3.邮件正文
cd /tmp
echo $mail_code > $mail_content

# 4.发送附件
#yum install mutt -y
cat $mail_content |mutt -s $mail_subject  -a $mail_attach_www -a $mail_attach_etc -- $mail_address

# 5.清除临时文件
cd /tmp
rm -rf $mail_content

rm -rf `ls /backup/$(date+%w)/*.bz2|egrep -v $(date +%F)`
mv $mail_attach_www /backup/$(date +%w)
mv $mail_attach_etc /backup/$(date +%w)

3.自动执行任务

[root@www backup]# crontab -l
0 0 * * * `sh -x /backup/backup.sh>>/backup/backup.log`

File too large错误处理

注:如果报如下错误
------------------
postdrop: warning: uid=0: File too large
sendmail: fatal: root(0): message file too big
Error sending message, child exited 75 (Deferred.).
Could not send the message.
------------------
是由于超过系统默认发送附件大小,修改成如下大小即可(2G)
# postconf -e "message_size_limit = 2048000000"
# postconf -e "mailbox_size_limit = 2048000000"

检查日志

tailf /var/log/mail.log

关于发送邮件日志显示450

最近发现邮件服务器在发送邮件的时候,出现很多

said: 450 Requested action not taken: AQAAf5ArtAMfEPFP7k0PAA--.42222S2, please try again (in reply to end of DATA command))

日志如下:

Dec 29 14:15:38 www postfix/qmgr[1259]: C5AEE21722: from=<root@www.unuw.com>, size=16441667, nrcpt=1 (queue active)
Dec 29 14:15:45 www postfix/smtp[14372]: C5AEE21722: host mx1.mail.139.com[221.176.66.188] said: 450 2f2b5a45dd87fbc-b5960 Mail rejected, please try again (in reply to end of DATA command)
Dec 29 14:15:54 www postfix/smtp[14372]: C5AEE21722: to=<wanghui3w@139.com>, relay=mx2.mail.139.com[221.176.66.188]:25, delay=17, delays=0.43/0.01/8.5/8, dsn=4.0.0, status=deferred (host mx2.mail.139.com[221.176.66.188] said: 450 2f2a5a45dd8fe35-b9a8b Mail rejected, please try again (in reply to end of DATA command))

接收方邮件系统使用了一种叫做“Hurdle”的反垃圾邮件技术 ,他的技术原理如下:

使用了“Hurdle”技术的系统,在收到一个陌生的邮箱发过来的一个邮件时,会把这个邮件暂时“扣押”(姑且这么说),并作上记号。同时,系统用退信的方式告诉发件方,我“现在繁忙”、“不能响应请求”,“请稍后再次尝试发送”。 如果,发送方是垃圾邮件发送器,则不会收到这个退信。如果是邮件服务器收到这个返回的信息,通常情况就会对这个退信中的4xx的错误代码做出响应,再次发送。 接收方服务器收到这个再次发来的邮件,就会和上次“扣押”的邮件进行比较,如果两者一样,那么接收方服务器就认为这个邮件不是垃圾邮件,并分发到用户邮箱中,同时,将此发信人列入白名单,下次直接放行。

这种方法显然能够阻挡很多垃圾邮件,但同时也具有比较严重的缺点: 1,会造成邮件的延迟。 2,误判有用邮件为垃圾邮件,即对于那些对4xx错误代码不在尝试发送的邮件服务器,将无法给这个系统发邮件。 (可以要接收服务器添加白名单解决)

知道原因后,等过一段时间再次查看日志发现:邮件还真发送出去了(判断理由:队列ID一样)

参考来源: http://www.showerlee.com/archives/570