Archive for September, 2008

好陌生

Friday, September 12th, 2008

颠簸了一晚, 终于到家了, 我已经半年多没回来了, 这次回来, 不再是一个大学生了, 成了一个漂泊在外的打工仔, 在外面的时候总是想着, 可回来了又感觉好陌生。

今早刚下火车, 车站门口是一帮出租车司机和旅店的人在拉客, 我拿了好多东西, 虽然很重, 但是我没有打车, 家离车站不是很远, 五六百米的样子。

刚走出车站就发现变化好大, 家附近的楼房拆了不少, 又在盖新的了, 回家的小路依然是那么安静, 走进家门, 已经3点10分了, 好累, 在车上一直不敢休息, 身边那个人刚上车没多久钱就被偷了, 但是到家了又好兴奋, 和妈妈聊了一会就睡了。

一下子就睡到了11点, 以前的同学们都还没有毕业, 这次回来没有朋友, 没有死党, 只能家看看电视, 洗洗衣服, 和妈妈聊聊天。

 吃完晚饭, 出来逛逛, 变化好大, 走出没多远就发现都是各种陌生的店面, 老字号也是有的, 还是那么红火, 家里附近的路边都堆着地砖, 好像在修路, 沿着最繁华的街道走, 才发现整条路都在施工, 地上好大个坑, 好像是要建地下商场。

路过广场, 那里好冷清, 感觉怪怪的, 现在这个季节好像不应该是这样的, 天气好冷, 街上的人都穿着外套。

一直走到以前上高中的地方, 从娱乐场所比较多的地方走过, 发现真的不一样了, 可能是初中高中错过了太多的东西, 看着身边穿着时尚的年轻人, 感觉我不属于这里。

街上人好少, 路过了好多我走了之后才开的网吧, 每家网吧都那么热闹, 里面的年轻人玩着各种各样的游戏, 想想自己的过去, 真的好多感慨, 如果当初能懂事一点, 现在一定不是这个样子。

昨天在车上看了一路的书, symfony, 感觉前面的路好长, 好迷茫, 回到这个陌生的地方, 让我不知何去何从。 除了朋友和家人, 好像这里已经没有什么值得我留恋的了, 一切都这么陌生, 与我的世界格格不入。 外面的生活好艰难, 每件事仿佛都不是那么如意, 我属于哪里? 我该去哪里?

使用PHP收发邮件

Tuesday, September 9th, 2008

这两天都在测试邮件, 搞得头都大了, 现在技术问题都已经解决了, 记录一下.

发送邮件一直都是一个难题, 以前没用过mail函数, 因为多数的环境下都不支持, 曾经改写过Discuz的邮件类, 也用过像PHPMailer这样的邮件发送库来解决邮件发送的问题, 但实际上用的都是SMTP. 昨天bobhero在公司内网服务器上配置了sendmail, 简单配置了之后可以使用smtp, imap和pop3. 但按照网上的教程配置了之后php的mail()函数一直都无法发送邮件, 在搜索引擎上寻找很久没有结果, 最后bobhero重新编译了配置文件, 终于成功.

编译命令

make -C /etc/mail

收邮件要比发邮件复杂的多, 网上资源巨少, 好不容易有几篇英文的帖子和我情况类似也没有解决办法.

接受邮件使用php的imap库, 遇到的问题主要在imap_open()上

连接163使用

imap_open("{pop3.163.com:110/pop3}INBOX", $username, $password);

取得的7bit数据使用imap_qprint()解码.

连接gmail使用

imap_open("imap.gmail.com:993/imap/ssl", $username, $password);

最难弄的就是连接本地的imap服务器, Outlook是可以从服务器上收取邮件的, 但是php就是收不到并返回错误Certificate failure for 102.com: Self-signed certificate or untrusted authority: OU=IMAP server, CN=imap.example.com, E=postmaster@example.com, 使用telnet链接也没有问题, 从昨天下午研究到今天中午也没解决这个错误, 网上搜不到解决办法, 最后实在没办法了, 用IP Sniffer截php.exe的数据包, 然后用telnet进行模拟, 发现php.exe在和imap服务器链接成功之后使用了TLS(一个什么传输安全协议), 刚想放弃就在php.net上看到原来imap_open()还有一个参数是/notls, 我的天, 终于得救了.

imap_open("{localhost:143/imap/notls}INBOX", $username, $password);

研究期间发现telnet很好玩, 可以用telnet检查某项服务是否开启, 比如smtp, telnet 192.168.1.102 25, 如果服务是开启的就会建立一个连接, 可以用指令进行smtp 的相关操作, 而指令内容也就是smtp协议的相关内容, 其他协议pop, imap等等都可以这么玩.

相关端口:

smtp 协议 25端口

imap 协议 143端口

imap/ssl 993端口

imap/ssl/novalidate-cert 995端口

nntp协议 119端口

相关资源:

中国协议分析网 http://www.cnpaf.net/

RFC文档 http://www.faqs.org/rfcs/

保留用户输入的错误数据

Saturday, September 6th, 2008

最近公司项目比较闲, 所以很多时间都在整理代码, 这几天就又有了一个这样的需求, 当用户提交了错误的信息, 提示错误并保留用户输入的数据。

起初第一个想法就是使用COOKIE, 后来又考虑使用$_SESSION, 其实两者无明显区别,大概流程是这样的, 每个请求的前面都加入下面的逻辑:

if(有保存的数据){

    if(数据是不是本动作产生的){

        如果是则取得数据

    }

    清空保存的数据

}

if(是一个POST请求){

    保存用户的请求数据

}

这样处理的话消息处理需要中间页跳转,就是说错误提示是一个单独的页面,这样基本可以做到将数据保存到下一个请求。这个方法后来在显示上比较麻烦,就是需要判断有没有取得的数据,有的话输出没有的话不输出, 如果使用模板引擎的话处理起来更加复杂, 于是又提出了另一种解决方案。

将表单和处理程序放在一起(可能是一个function , MVC中应该是一个action中),这样的话需要显示表单或者处理数据要准备一套结构相同的数据传给页面,然后由本页显示错误消息, 不需要使用COOKIE.

function actionCreate(){

    if(是POST请求){

        过滤数据

        验证数据并生成错误

        if(没有错误){

            向数据库插入数据

        }else{

            将错误数据提交给显示层

        }

    }else if(是GET请求并且必要参数正确){

        从数据库取得显示数据提交给显示层

    }else{
        返回一个参数错误
    }

    $this->display('create.html');

}

可以说这个方法是比较完美的, 目前来说没有什么不足之处, 但是有很多细节是需要注意的, 比如form的action要提交给自身并且携带参数, 虽然参数无作用, 但可以用来刷新页面(window.location.href=window.location.href), 显示层刷新页面的功能是必须的, 因为如果是修改操作那么输入错误之后将会保留错误的信息。

接下来还可以通过控制错误消息的结构识别错误是由哪一个表单项产生的, 如果需要还可以对错误进行自动修改等等。