存放

在我的若干个Gmail帐号中,有一两个被我用来用于存放多年来搜罗的一些电子版的图书。而我发现,用具有良好搜索功能的Gmail管理这如同汗牛充栋般的图书资料库,最方便的方法莫过于将每个图书文件以其实际标题(以及作者版本年代等)命名,每个文件作为附件对应唯一一封邮件,而邮件标题和图书文件名等同,而邮件内容无关紧要。譬如,一本叫做《SN语录》的PDF格式的书籍,依此方法将被命名为“SN语录.pdf”,然后作为附件,被添加到一个标题为“SN语录.pdf”的Gmail邮件当中。利用bash和一个叫做smtp-cli的Perl脚本,咱们可以把此上传图书的过程自动化。具体过程如下。

首先,去http://www.logix.cz/michal/devel/smtp-cli/搞一份smtp-cli脚本,并安装它所依赖的模块,其中包括IO:Socket:SSL, Net::SSLeay, MIME::Lite等(运行perl smtp-cli会提示缺失模块信息)。对于有些系统,譬如Ubuntu,这些模块有相应的软件包可对应安装。而一般情况下咱们也能通过CPAN安装模块(perl -MCPAN -e shell, 然后install {module-name}),或者直接下载模块本地安装。

时至今日(2010年),Gmail对于邮件附件有大概20M字节的上限。这也许对大多数图书文件都已足够。但即使某些图书文件大于20M,咱们也可以用split工具把它分割为小于20M的小块,然后作为单独的邮件发送,待需要时可以分别下载再用cat工具将其合并还原。以下bash脚本就描述了这个过程。这里我们将小于或等于19M的文件直接加入一个邮件发送,跳过超大文件(大于1900M)并将其记录与一个叫做largefiles.txt的日志文件,把其余中等大小的文件分割并单独上传。这里我们假设所有图书文件都存放于一个名为“BOOKS”的目录的根目录,而且smtp-cli和BOOKS位于同一目录(或者也可将smtp-cli加入路径,这样我们就不需要此相对路径假设)。

#!/usr/bin/bash
# Upload all files 19M to trunks of 19M and upload them.
# Write file names to log file for huge files.
#
# Configuration
echo -n "Enter your Gmail user name: ";
read SMTP_USR;
echo -n "Enter your Gmail password: ";
stty -echo;
read SMTP_PASS;
stty echo;
#
LOG_FILE=largefiles.txt;
SMTP_SVR=smtp.gmail.com;
SMTP_PORT=587;
FROM_ADDR=$SMTP_USR;
TO_ADDR=$SMTP_USR;
LIMIT_PER_FILE_SIZE=19922944;
LIMIT_FILE_SIZE=1992294400;
#
# create largefiles.txt for logging
if test -f $LOG_FILE;
then
mv $LOG_FILE "$LOG_FILE".old;
fi;
touch $LOG_FILE;
#
#
for i in BOOKS/*;
do
size=`du -b $i | awk '{ print $1 }'`;
if [ $size -le $LIMIT_PER_FILE_SIZE ];
then
echo "Uploading $i";
perl smtp-cli --verbose --host $SMTP_SVR --port $SMTP_PORT \
--from $FROM_ADDR --to $TO_ADDR --subject $i --body-plain `echo "\"$i\""` \
--attach ./"$i" --enable-auth --user $SMTP_USR --pass $SMTP_PASS;
elif [ $size -ge $LIMIT_FILE_SIZE ];
then
echo $i >> $LOG_FILE;
else
split -d -b $LIMIT_PER_FILE_SIZE -a 2 $i "$i".;
num=`ls "$i".* | wc -l`;
count=0;
for j in `ls "$i".*`;
do
echo "Uploading $j";
if [ $count -eq 0 ];
then
SUBJECT="$i";
else
SUBJECT="Re: $i";
fi;
perl smtp-cli --verbose --host $SMTP_SVR --port $SMTP_PORT \
--from "$FROM_ADDR" --to "$TO_ADDR" --subject "$SUBJECT" --body-plain "Split $count of $num" \
--attach ./"$j" --enable-auth --user $SMTP_USR --pass $SMTP_PASS;
count=$[$count+1];
done;
rm -f "$i".*;
fi;
done
# Unset username and password
SMTP_USR=
SMTP_PASS=
FROM_ADDR=
TO_ADDR=

在以上脚本的末尾,用户敏感信息被清除。这是出于安全考虑。另外需要注意的是,如果在较短的时间内流量过大(据估计大概是几百M左右),Gmail会将相关邮件帐号标识为“行为异常”并将其锁定一段时间(一半小于24小时)。所以我们最好不要一次发送过多的邮件。

Advertisements

2 Comments on “存放”

  1. Yuan Mang says:

    请问那本宝典哪儿有下的啊,filestube上找不到!

    • syncom says:

      是不是可以尝试访问https://syncom.wordpress.com和使用浏览器的“打印”功能?


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s