提问的智慧SVN版 - 提问者必读
 22 12
发新话题
打印

[原创] 我的svn备份脚本

我的svn备份脚本

我所有的项目都放在f:\svn_repo目录下,备份目录为svndump,下面的三个文件都放在该目录下

文件1 svndump.bat
@echo off
rem set logfile=svndump.log
set SVN_HOME=D:\YHCM\svn\bin
set SVN_ADMIN=D:\YHCM\svn\bin\svnadmin.exe
set SVN_LOOK=D:\YHCM\svn\bin\svnlook.exe
set SVN_REPO=f:\svn_repo
set RAR="C:\Program Files\WinRAR\Rar.exe"
@chcp 850
if not exist z:\nul net use z: \\192.168.2.226\g$\svndump
FOR /f %%C IN (projectlist.conf) DO  @call dump.bat %%C

文件2 dump.bat
@ECHO OFF
if "%1"=="" goto no_args
set PROJECT=%1
if not exist %PROJECT% mkdir %PROJECT%
cd %PROJECT%
SET LOWER=0
if exist last_revision.txt FOR /f %%C IN (last_revision.txt) DO  set LOWER=%%C
FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPO%\%PROJECT%') DO set UPPER=%%D
IF %LOWER%==%UPPER% GOTO :N_EXIT
SET D=_
SET FILENAME=%PROJECT%%D%%LOWER%%D%%UPPER%
ECHO %FILENAME%
%SVN_ADMIN% dump %SVN_REPO%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
%RAR% a -df %FILENAME%.rar %FILENAME%.dmp
copy %FILENAME%.rar z:\%PROJECT%\
@echo %UPPER% > last_revision.txt
:N_EXIT
@CD..
@exit /B
:no_args
@ECHO ON
@echo "please use dump project_name"

文件3 projectlist.conf,需要备份的清单,每个项目一行
test1
test2
presales

我最后把svndump.bat设为每天晚上12点自动运行,最后svndump目录内,每个项目会生成一个文件夹,里面的内容如下
2006-11-21  00:00                 7 last_revision.txt
2006-10-11  17:01       172,322,257 presale_0_1038.rar
2006-10-11  17:01            44,534 presale_1038_1041.rar
2006-10-11  17:01            71,106 presale_1041_1049.rar
2006-10-11  17:01            30,979 presale_1049_1057.rar
2006-10-11  16:59             8,415 presale_1057_1058.rar
2006-10-11  16:59            41,255 presale_1058_1063.rar
2006-10-11  16:59             5,768 presale_1063_1064.rar
2006-09-29  00:00            10,268 presale_1064_1065.rar
2006-10-09  00:00            16,574 presale_1065_1068.rar
2006-10-10  00:04            23,291 presale_1068_1075.rar
2006-10-11  00:00           118,851 presale_1075_1080.rar
2006-10-12  00:00            57,249 presale_1080_1082.rar
2006-10-18  00:01           273,010 presale_1082_1086.rar
2006-10-19  00:00        11,062,588 presale_1086_1101.rar
2006-10-20  00:08           327,973 presale_1101_1103.rar
2006-10-21  00:00           692,018 presale_1103_1105.rar
2006-10-24  00:00           653,189 presale_1105_1112.rar
2006-10-25  00:00           659,009 presale_1112_1113.rar
2006-10-28  00:07           484,524 presale_1113_1116.rar
2006-10-31  00:00            50,011 presale_1116_1118.rar
2006-11-01  00:00            20,778 presale_1118_1119.rar
2006-11-02  00:00            11,006 presale_1119_1121.rar
2006-11-03  00:02            50,194 presale_1121_1127.rar
2006-11-07  00:02           392,659 presale_1127_1130.rar
2006-11-08  00:00            41,635 presale_1130_1131.rar
2006-11-10  00:00            23,159 presale_1131_1143.rar
2006-11-11  00:00            76,475 presale_1143_1149.rar
2006-11-14  00:00            54,993 presale_1149_1157.rar
2006-11-16  00:00            62,222 presale_1157_1164.rar
2006-11-18  00:00            91,973 presale_1164_1180.rar
2006-11-21  00:00             8,077 presale_1180_1181.rar

last_revision文件记录了上次备份到哪个版本。
本帖最近评分记录
  • PCplayer 威望 +3 精品文章 06-11-23 09:20

TOP

这个脚本不错,虽然每个项目库单独用一个目录,但是文件仍会很多,我继续完善了一下,主要使让每个项目库用一个压缩包,便于拷贝
文件1 svndump.bat
引用:
@echo off
@echo ================================================
@echo  说明:启动备份时,需要配置两个环境变量
@echo    1、SVN_HOME 指定svn的安装目录
@echo    2、RAR_CMD  指定RAR命令行压缩工具所在目录
@echo  另外,如果需要异地备份,可以指定为网络映射Z盘
@echo ================================================
rem set logfile=svndump.log
set SVN_HOME=C:\Progra~1\Subversion\bin
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
set SVN_LOOK=%SVN_HOME%\svnlook.exe
set SVN_REPOROOT=d:\svn\repository
set RAR_CMD="C:\Progra~1\WinRAR\Rar.exe"
rem if not exist z:\nul net use z: \\192.168.2.226\g$\svndump
FOR /f %%C IN (projectlist.conf) DO  @call dump.bat %%C
文件2 dump.bat (这个改动较多,使一个项目库用一个压缩包,并添加压缩包的注释)
引用:
@ECHO OFF
if "%1"=="" goto no_args
set PROJECT=%1
SET LOWER=0
if exist %PROJECT%_last_revision.txt FOR /f %%C IN (%PROJECT%_last_revision.txt) DO  set LOWER=%%C
FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%') DO set UPPER=%%D

rem 不需要备份,则跳转结束
IF %LOWER%==%UPPER% GOTO :N_EXIT
SET D=_
SET FILENAME=%PROJECT%%D%%LOWER%%D%%UPPER%
@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
%RAR_CMD% a -df %PROJECT%.rar %FILENAME%.dmp

rem 准备写备注信息
IF %LOWER% gtr 0 GOTO :COPYENOTE
@copy log.conf %PROJECT%_log.txt
GOTO :WRITENOTE
:COPYENOTE
%RAR_CMD% cw -y %PROJECT%.rar %PROJECT%_log.txt
:WRITENOTE
@ECHO %date% >> %PROJECT%_log.txt
@echo -- 添加备份文件 %FILENAME%.dmp,从[%LOWER%]到[%UPPER%] >> %PROJECT%_log.txt
%RAR_CMD% c -z%PROJECT%_log.txt %PROJECT%.rar

:COMPLETE
rem 下面一行用于拷贝备份文件到映射的驱动器上
rem copy %PROJECT%.rar z:\%PROJECT%\

@echo %UPPER% > %PROJECT%_last_revision.txt
:N_EXIT
@exit /B
:no_args
@ECHO ON
@echo "正确调用方法: dump 项目库名"
文件3不变!

文件4:log.conf(项目库压缩包的注释模版,文件最后一定要有个空行)
引用:
备份日志:
最后结果如下
引用:
2006-11-26  13:18    <DIR>          .
2006-11-26  13:18    <DIR>          ..
2006-11-26  13:18        35,744,475 dmgc.rar
2006-11-26  13:18                 5 dmgc_last_revision.txt
2006-11-26  13:18               144 dmgc_log.txt
2006-11-26  13:15             1,136 dump.bat
2006-11-26  12:47                12 log.conf
2006-11-26  13:09                 6 projectlist.conf
2006-11-26  12:47           329,728 Rar.exe
2006-11-26  13:15               567 svndump.bat
               8 个文件     36,076,073 字节
               2 个目录 20,457,914,368 可用字节
补充:这个备份脚本整体功能与上面的一样,大家可以自行完善,各取所需

[ 本帖最后由 bowa 于 2006-11-26 13:55 编辑 ]

附件

svn008.JPG (59.17 KB)

06-11-26 13:55

项目库压缩包

svn008.JPG

TOP

再看看备份脚本时,发现增量备份的算法不是很好,
例如第一次备份 0-189,第二次是 189-195,第三次是 195-211

看出什么来了?每次备份都重复了一个版本号!

正在找个DOS小工具,就是能够做简单四则运算的就行,每次备份开始从last_revision的版本号+1后再赋予LOWER,这样跳转比较就改为大于

TOP

再度完善备份脚本

这次完善,主要达成几点目标:
1、回归了继续采用按项目库名称分别建立目录单独保存的方式,这样对于项目库众多的时候便于管理
2、不再把增量备份和原始备份都压缩导一个包中,对于小项目这种方式还是好用的,但是对于上百兆的项目来说,看到RAR奋力压缩有种使不上劲的感觉(毕竟SVN服务器不是专用服务器,是个PC兼职而已),所以每次增量仍然采用独立压缩包,但是通过日志说明清楚
3、实现真正意义上的增量备份,解决每次重复一个版本号的问题(通过eval这个dos外部命令)
重要:虽然用eval达到了目的,其副作用就是会改变dos窗口的代码页为437,这样就无法看到中文,也无法在日志中正常写入中文了(只在增量备份时出现),不过不影响使用,也算小小的不足了!  以后再完善吧。。。

文件1:svndump.bat
引用:
@echo off
@echo ================================================
@echo  说明:启动备份时,需要配置两个环境变量
@echo    1、SVN_HOME     指定svn的安装目录
@echo    2、RAR_CMD      指定RAR命令行压缩工具所在目录
@echo    3、SVN_REPOROOT 指定项目库的根目录(多库模式)
@echo  另外,如果需要异地备份,可以指定为网络映射Z盘
@echo ================================================
rem set logfile=svndump.log
set SVN_HOME=C:\Progra~1\Subversion\bin
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
set SVN_LOOK=%SVN_HOME%\svnlook.exe
set SVN_REPOROOT=e:\svn\repository
set RAR_CMD="C:\Progra~1\WinRAR\Rar.exe"
rem if not exist z:\nul net use z: \\192.168.2.226\g$\svndump

rem 读取项目库列表文件,并忽略其中;开头的行
FOR /f "eol=;" %%C IN (projectlist.conf) DO  @call dump.bat %%C
文件2 dump.bat (增加了较多判断)
引用:
@ECHO OFF
if "%1"=="" goto no_args
set PROJECT=%1
if not exist %PROJECT% mkdir %PROJECT%
cd %PROJECT%
SET LOWER=0
SET UPPER=0
@FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%') DO set UPPER=%%D
if %UPPER%==0 GOTO :N_EXIT

if not exist %PROJECT%_last_revision.txt GOTO :BAKUP

rem 取出上次备份后的版本号,并做+1处理
@FOR /f %%C IN (%PROJECT%_last_revision.txt) DO @set LOWER=%%C
rem 特别注意delims== 后面(引号前)有个空格!
@FOR /F "tokens=2 delims== " %%i IN ('..\eval %LOWER%+1') DO @set LOWER=%%i
rem 不需要备份,则跳转结束
IF %LOWER% gtr %UPPER% GOTO :N_EXIT

:BAKUP
SET FILENAME=%PROJECT%_%LOWER%_%UPPER%
@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
%RAR_CMD% a -df %PROJECT%_%UPPER%.rar %FILENAME%.dmp

rem 准备写备份日志信息
IF %LOWER% gtr 0 GOTO :WRITENOTE
if not exist %PROJECT%_log.txt @copy ..\log.conf %PROJECT%_log.txt
@ECHO %date% >> %PROJECT%_log.txt
@echo  -- 添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %PROJECT%_log.txt
GOTO :COMPLETE
:WRITENOTE
@ECHO %date% >> %PROJECT%_log.txt
@echo  -- 添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %PROJECT%_log.txt

:COMPLETE
rem 下面一行用于拷贝备份文件到映射的驱动器上
rem copy %PROJECT%.rar z:\%PROJECT%\

@echo %UPPER% > %PROJECT%_last_revision.txt
:N_EXIT
@echo 项目库%PROJECT%处理结束...
@CD..
@exit /B
:no_args
@ECHO ON
附件是DOS计算器

[ 本帖最后由 bowa 于 2006-12-7 17:52 编辑 ]

附件

eval.rar (17.01 KB)

06-12-7 17:49, 下载次数: 246

DOS计算器

本帖最近评分记录
  • 小宇 威望 +5 梦寐以求的东西…… 07-1-15 11:38
  • 小宇 金币 +3 梦寐以求的东西…… 07-1-15 11:38

TOP

我用这个脚本的时候提示:
svnlook: Can't open file 'E:\project\project\format': The system cannot find the path specified.
The syntax of the command is incorrect.
请教一下这是在那里设置错了!
set SVN_HOME=E:\subversion\bin
set SVN_REPO=E:\project
set RAR="C:\Program Files\WinRAR\Rar.exe"
项目为project

TOP

这是一个多库模式下的备份脚本,“SVN_REPO”这个环境变量实为定义SVNPARENTPATH。
看你的样子好像你用的是单库模式,因为你的的project项目是创建在根目录下的吧?
所以会出现
引用:
Can't open file 'E:\project\project\format': The system cannot find the path specified.
如果你用“set SVN_REPO=E:\”估计没问题了

[ 本帖最后由 bowa 于 2007-1-12 21:43 编辑 ]

TOP

DOS下进行计算可以用set命令试一下
如:

set /a 1+2

set /a exp=(%exp1%+3)*6


更多的可以看一下 set /?
本帖最近评分记录
  • bowa 金币 +3 非常感谢提供帮助 07-1-22 19:44

TOP

请问 还原  是怎么实现 呢 ? 如果按照 这样 的方法 实现 增量 备份 的话 !!

TOP

我也出现与sfshliang一样的问题。
我的是这样:
@echo off
rem set logfile=svndump.log
set SVN_HOME=E:\subversion\bin
set SVN_ADMIN=E:\subversion\bin\svnadmin.exe
set SVN_LOOK=E:\subversion\bin\svnlook.exe
set SVN_REPO=E:\subdatabase\
set RAR="C:\Program Files\WinRAR\Rar.exe"
@chcp 850
FOR /f %%C IN (projectlist.conf) DO  @call dump.bat %%C
出错提示为:
svnlook: Can't open file '\projects_oclc\format': The system cannot find the file specifi
ed.
¤ˉ─┐┐?OCLC┤a└Y¢?╩°...

TOP


回复 #4 bowa 的帖子

我按照你列举的方法配置BAT,执行后,为什么仅仅只是将库的最外层目录给备份了,库里的子目录及内容都没有备份出来
     请再次赐教~~~
    希望能尽量详细................谢谢

TOP

回复 #10 alice_106 的帖子

还是将自己研究发现的问题告诉大家吧
svndump.bat文件中的
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
set SVN_LOOK=%SVN_HOME%\svnlook.exe
修改为:
set SVN_ADMIN="%SVN_HOME%\svnadmin.exe"
set SVN_LOOK="%SVN_HOME%\svnlook.exe"
_即加上引号即可 

TOP

谢谢楼主,我把我修改的也贴一下.

修改了版本的判断,从原来的大于改成了大于或等于,用SET命令代替了计算的那个外部程序等.
引用:
@ECHO OFF
if "%1"=="" goto no_args
if "%2"=="" goto no_args
rem echo "parm1:"%1
rem echo "parm2:"%2
rem goto no_args
set PROJECT=%2
if not exist %PROJECT% mkdir %PROJECT%
cd %PROJECT%
SET LOWER=0
SET UPPER=0
@echo 开始处理 项目库%PROJECT%...
@FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%') DO set UPPER=%%D
if %UPPER%==0 GOTO :N_EXIT

if not exist %PROJECT%_last_revision.txt GOTO :BAKUP

rem 取出上次备份后的版本号,并做+1处理
@FOR /f %%C IN (%PROJECT%_last_revision.txt) DO @set LOWER=%%C
rem 特别注意delims== 后面(引号前)有个空格!
rem @FOR /F "tokens=2 delims== " %%i IN ('..\eval %LOWER%+1') DO @set LOWER=%%i
@FOR /F "tokens=2 delims== " %%i IN ('set /a %LOWER%+1') DO @set LOWER=%%i
rem 不需要备份,则跳转结束
rem IF %LOWER% gtr %UPPER% GOTO :N_CONTINUE
IF %LOWER% geq %UPPER% GOTO :N_CONTINUE

:BAKUP
SET FILENAME=%PROJECT%_%LOWER%_%UPPER%
@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
%RAR_CMD% a -df %PROJECT%_%UPPER%.rar %FILENAME%.dmp

rem 准备写备份日志信息
IF %LOWER% gtr 0 GOTO :WRITENOTE
if not exist %PROJECT%_log.txt @copy ..\log.conf %PROJECT%_log.txt
@ECHO %date% >> %PROJECT%_log.txt
@echo  -- 添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %PROJECT%_log.txt
GOTO :COMPLETE
:WRITENOTE
@ECHO %date% >> %PROJECT%_log.txt
@echo  -- 添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %PROJECT%_log.txt

:COMPLETE
rem 下面一行用于拷贝备份文件到映射的驱动器上
rem copy %PROJECT%.rar z:\%PROJECT%\

@echo %UPPER% > %PROJECT%_last_revision.txt
goto :N_EXIT

:N_CONTINUE
@echo 项目库%PROJECT%  上次版本:%LOWER%  当前版本: %UPPER% 不需要备份,忽略
:N_EXIT
@echo 项目库%PROJECT%处理结束...
@CD..
@exit /B
:no_args
@ECHO ON

TOP

请教一下,我怎么用上面的脚本没有什么反应呢?

svndump.bat文件如下所示,其中的路径没有问题:
复制内容到剪贴板
代码:
@echo off
@echo ================================================
@echo  说明:启动备份时,需要配置两个环境变量
@echo    1、SVN_HOME     指定svn的安装目录
@echo    2、RAR_CMD      指定RAR命令行压缩工具所在目录
@echo    3、SVN_REPOROOT 指定项目库的根目录(多库模式)
@echo  另外,如果需要异地备份,可以指定为网络映射Z盘
@echo ================================================
rem set logfile=svndump.log
set SVN_HOME=d:\Program Files\Subversion\bin
set SVN_ADMIN="%SVN_HOME%\svnadmin.exe"
set SVN_LOOK="%SVN_HOME%\svnlook.exe"
set SVN_REPOROOT="E:\SVNRepository"
set RAR_CMD="d:\Program Files\WinRAR\Rar.exe"
rem if not exist x:\nul net use x: "\\192.168.1.16\temp files\程序\SVNRepository_bak"

rem 读取项目库列表文件,并忽略其中;开头的行
FOR /f "eol=;" %%C IN (projectlist.conf) DO  @call dump.bat %%C
版本库所在目录列表如下所示,存在两个版本库。projectlist.conf中也已经给出了版本库的名字。采用svnserve建立的svn服务。

E:\SVNRepository>tree
文件夹 PATH 列表
卷序列号码为 00000079 BC00:CE15
E:.
├─PaperWriting
│  ├─conf
│  ├─dav
│  ├─db
│  │  ├─revprops
│  │  ├─revs
│  │  └─transactions
│  ├─hooks
│  └─locks
└─repository
    ├─conf
    ├─dav
    ├─db
    │  ├─revprops
    │  ├─revs
    │  └─transactions
    ├─hooks
    └─locks

可是,运行svndump.bat却出现下面的结果(dump.bat最上面的命令改为了echo on)

E:\SVNRepository>svndump
================================================
说明:启动备份时,需要配置两个环境变量
   1、SVN_HOME     指定svn的安装目录
   2、RAR_CMD      指定RAR命令行压缩工具所在目录
   3、SVN_REPOROOT 指定项目库的根目录(多库模式)
另外,如果需要异地备份,可以指定为网络映射Z盘
================================================

E:\SVNRepository>if "PaperWriting" == "" goto no_args

E:\SVNRepository>if "" == "" goto no_args

E:\SVNRepository>if "repository" == "" goto no_args

E:\SVNRepository>if "" == "" goto no_args
E:\SVNRepository>

请教各位这是什么问题,谢谢。

TOP

to  luckyfox:
根据你给的错误提示 ==> if "aperWriting" == "" goto no_args
可以判定你的 projectlist.conf 文件设置错误(sorry,我上面没有给出我的这个脚本,不过应该和上面一样的),参考我外面写的帖子吧

TOP

谢谢bowa,采用你给处的新脚本,可以圆满完成任务了。
原来是采用的rambler网友的命令,不知道怎么回事在我这边居然不好用,呵呵。
再次感谢。

TOP

增量备份的脚本怎么不能用啊

我采用上面的脚本,运行后没有任何报错信息,但实际上也没有备份?

TOP

如果要恢复备份的话,哪些中文乱码会有影响不,楼主?

TOP

求教SVN

文件1 svndump.bat
@echo off
rem set logfile=svndump.log
set SVN_HOME=D:\YHCM\svn\bin
set SVN_ADMIN=D:\YHCM\svn\bin\svnadmin.exe
set SVN_LOOK=D:\YHCM\svn\bin\svnlook.exe
set SVN_REPO=f:\svn_repo
set RAR="C:\Program Files\WinRAR\Rar.exe"
@chcp 850
if not exist z:\nul net use z: \\192.168.2.226\g$\svndump
FOR /f %%C IN (projectlist.conf) DO  @call dump.bat %%C

文件2 dump.bat
@ECHO OFF
if "%1"=="" goto no_args
set PROJECT=%1
if not exist %PROJECT% mkdir %PROJECT%
cd %PROJECT%
SET LOWER=0
if exist last_revision.txt FOR /f %%C IN (last_revision.txt) DO  set LOWER=%%C
FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPO%\%PROJECT%') DO set UPPER=%%D
IF %LOWER%==%UPPER% GOTO :N_EXIT
SET D=_
SET FILENAME=%PROJECT%%D%%LOWER%%D%%UPPER%
ECHO %FILENAME%
%SVN_ADMIN% dump %SVN_REPO%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
%RAR% a -df %FILENAME%.rar %FILENAME%.dmp
copy %FILENAME%.rar z:\%PROJECT%\
@echo %UPPER% > last_revision.txt
:N_EXIT
@CD..
@exit /B
:no_args
@ECHO ON
@echo "please use dump project_name"
以上红色字体请解释下,是什么意思

TOP

紧急求教

这种备份方式如何做检查和恢复呢?

TOP


备份周期问题

如果项目周期特别长,而磁盘空间有限的话,这个脚本不能够自动删除操作,是要手动去做删除吗?

TOP

 22 12
发新话题
本功能由奇虎问答实现

相关主题

标题 作者 最后发表
网页显示的问题 sighout 2008-11-04
linux作为svn服务器的自动备份脚本怎么写? hejing2002 2008-11-06
版本库同步问题 jingzhangxu 2008-10-29
windows下svn限制强制写日志及只能修改自己日志脚本 风中百荷 2008-10-21
关于svn与bugfree的整合问题 happytfs 2008-10-18
点击阅读更多关于的相关帖子  更多相关主题
订阅 我用Subversion - SVN中文论坛 邮件列表:iUseSVN@googlegroups.com
电子邮件:
网站重要事项将会在这个列表进行通知,点击这里浏览存于列表中的所有邮件