5.5 从命令行访问Gmail

Gmail(http://mail.google.com)是Google被广泛使用的一项免费电子邮件服务。你可以使用经过认证的RSS feed来读取个人邮件。我们也能够通过发送人姓名以及邮件主题来解析RSS feed。这使得我们无须打开网页浏览器就能够查看收件箱中的未读邮件。

5.5.1 实战演练

来看下面这个脚本文件,它的作用是通过解析Gmail的RSS feed来显示未读的邮件:

  1. #!/bin/bash
  2. 文件名: fetch_gmail.sh
  3. #用途:获取 Gmail 工具
  4. username="PUT_USERNAME_HERE"
  5. password="PUT_PASSWORD_HERE"
  6. SHOW_COUNT=5 # 最近未读的邮件数目
  7. echo
  8. curl -u $username:$password --silent "https://mail.google.com/mail/
  9. feed/atom" | \
  10. tr -d '\n' | sed 's:</entry>:\n:g' |\
  11. sed 's/.*<title>\(.*\)<\/title.*<author><name>\([^<]*\)<\/name><email>
  12. \([^<]*\).*/Author: \2 [\3] \nSubject: \1\n/' | \
  13. head -n $(( $SHOW_COUNT * 3 ))

输出如下:

  1. $ ./fetch_gmail.sh
  2. Author: SLYNUX [ slynux@slynux.com ]
  3. Subject: Book release - 2
  4.  
  5. Author: SLYNUX [ slynux@slynux.com ]
  6. Subject: Book release - 1
  7. .
  8. ……共5封未读邮件

5.5.2 工作原理

这个脚本通过用户认证使用cURL来下载RSS feed。用户认证信息由-u username: password参数提供。也可以只使用-u user,这样就不用再提供密码。然后由cURL在运行时以交互的方式索求密码。

我们将管道命令拆分成不同的部分来解释这个脚本的工作原理。

tr -d '\n'移除了所有的换行符,这样我们就可以将\n作为定界符来重建邮件项。sed 's::\n:g'将每一处 替换成换行符,以保证每一条邮件项各自单独为行,从而就能够逐条解析邮件。通过查看https://mail.google.com/mail/feed/atom页面源代码中用于RSS feed的XML标记,我们可以看出每一条邮件项都对应着 TAGS

该脚本接下来的部分如下:

  1. sed 's/.*<title>\(.*\)<\/title.*<author><name>\([^<]*\)<\/
  2. name><email>
  3. \([^<]*\).*/Author: \2 [\3] \nSubject: \1\n/'

脚本用匹配邮件标题,用([^<]*)<\/ name>匹配发件人姓名, ([^<]*)匹配发件人电子邮件地址。接下来,按照下面的方法使用反向引用。

  • Author: \2 [\3] \nSubject: \1\n用来将匹配内容以易于阅读的格式来替换原先的邮件项。\1对应于第一处匹配,\2对应于第二处匹配,依次类推。

  • SHOW_COUNT=5用来设置需要在终端中显示的未读邮件数量。

  • head用来显示SHOW_COUNT*3行文本1。SHOW_COUNT乘以3是因为每一封未读邮件的相关信息需要占用3行。

1 这里的SHOW_COUNT*3行文本并不包括脚本开始部分由echo生成的那一行(空行)。

5.5.3 参考

  • 5.4节讲解了curl命令。

  • 4.6节讲解了sed命令。