博主的新站点,看此文章也可以来这里。
学校里面的网络环境一直令人不快,天天喊着要建立国际一流大学,就校园网这质量只能是下辈子的事了,再加上国内目前对Google方面的不友好,我会经常性的不能正常通过浏览器连接到我的Gmail邮箱,捉急的时候真是很后悔当初选择了Gmail,虽然它看起来又高端又时尚又有Geek风范。对Outlook和Mac上自带Mail软件的失望让我有了这一想法,本文里面说到这个版本还处于初级阶段,不过应应急看邮件回复紧急事情肯定是够用了。
废话不多说直接进入正题了,本文将要告诉你的事情是,如果你也想我一样需要一个应急的接收Gmail的小插件,这篇文章可以帮助你在数分钟之内搭建一个收发Gmail的小平台,当然前提是你也和我一样喜欢使用CLI的形式与你的计算机交互。
首先我们先来看看接收邮件的part
如果你想敲几个命令就连上你的邮箱大致需要下面的几个步骤:第一,你要与你的邮箱服务器建立一个成功的连接,当然我使用的是IMAP的协议,个人觉着比POP更好,当然人人都有自己的喜好,这也不是啥关键的事情。第二,在连接成功建立的基础上你要使用自己的帐号和口令成功登陆,也就是去的认证获取对该用户邮箱的操作权。第三,在前两者都OK的基础上你可以开始搞一些事情了,例如获取目前的邮箱一些基本情况(邮件总数,未读数量,已读数量,容量情况),在此基础上你就可以读取某一封邮件了(目前在带有附件,HTML元素,图片的邮件上还比较无力)。
虽然看起来功能弱爆了,但是对我来讲已经足够了,想象一下一个焦急等待面试结果或者等待女朋友是否同意求婚而苦守在邮箱门前却因为GFW的缘故无法得知结果的可怜人的痛苦心情吧!代码的实现大概是这样子的(只贴上关键部分,对于怎么组织所有代码是个太灵活的事情,谁让咱们有那么多模式呢)。
def __init__(self): self.IMAP_SERVER='imap.gmail.com' self.IMAP_PORT=993 self.M = None self.respons self.mailboxes = [] def login(self, username, password): self.M = imaplib.IMAP4_SSL(self.IMAP_SERVER, self.IMAP_PORT) rc, self.response = self.M.login(username, password) return rc
这部分就是第一步和第二步所做到事情。
def receive_mail(self): recvMail = receiveMail.ReceiveMail(self.M) mailCounts = recvMail.get_mail_count() print 'A total of '+ mailCounts +' mails in your input mailbox.' print 'A total of '+recvMail.get_unread_count()+ ' UNREAD mails in your input mailbox.' recvMail.get_imap_quota() mailBody = recvMail.check_simpleInfo(mailCounts) #返回值是邮件content if mailBody != 0: recvMail.check_detailInfo(mailBody) return
上面的这些代码是出现在调用层的,主要是调用了具体实现功能的下面几个函数。
下面的这些则在receiveMail.py文件中。
def check_simpleInfo(self, mailCounts): print "Input 'y' to check the lasted UNread mail. Other cmds to abandon!" while True: argv = string.split(raw_input('$====>')) if len(argv)!=0: if argv[0] == 'y': mailBody = self.get_mail_simpleInfo_from_id(mailCounts) return mailBody
我以前一般部署网站都是部署在根目录下, 比如www.example.com 直接转发到 后端服务器监听的端口,这种很简单,只要这样即可:
location / { proxy_pass http://127.0.0.1:8888 ; }但如果我们想将网站部署在某个子目录下, 比如www.example.com/admin/ , 则不是那么简单的事
幸好django框架还是比较完善的,很容易就可以完成这个任务
https://docs.djangoproject.com/en/dev/ref/settings/#force-script-name
通过在settings.py里设置FORCE_SCRIPT_NAME, 可以很容易的给url前面加个前缀
如 FORCE_SCRIPT_NAME='/admin' (注意, 最后是没有斜杠 / 的)
另外需要注意的是django template里的url必须用{% url url_name %}生成, 后端的redirect也必须用reverse
然后在nignx里需要如下配置:
location ~ ^/admin(/?)(.*) { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8888/$2 ; proxy_redirect http://www.example.com/ http://www.example.com/admin/; }
ref: http://nginx.org/cn/docs/http/ngx_http_proxy_module.html
稍微介绍下:
proxy_pass 格式是 proxy_pass http://host:port/uri/ 匹配location的url会被转成uri, 所以 http://127.0.0.:8888会转发完整的url, 而http://127.0.0.1:8888/ 则会将localtion匹配的去掉
请求URI按下面规则传送给后端服务器:
- 如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI:
location /name/ { proxy_pass http://127.0.0.1/remote/; }
- 如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI:
location /some/path/ { proxy_pass http://127.0.0.1; }
proxy_redirect off;
proxy_redirect redirect replacement; 默认值:
proxy_redirect default;上下文: http, server, location
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。 假设后端服务器返回的响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为 “Location: http://frontend/one/some/uri/”。
replacement字符串可以省略服务器名:
proxy_redirect http://localhost:8000/two/ /;
ps. nginx的配置真的有很多很多,想要用好用熟一门工具或语言真的是不容易
Tomcat作为容器,先将JSP转换为Servlet类源文件(.java),再将该源文件编译为Servlet类(.class)。
那么这两个文件在容器的生命位置呢?二、解决办法
以Test项目为例
在H:\tomcat\work\Catalina\localhost\test\org\apache\jsp文件夹中会发现上述两个文件。