网站开发日志

2009年6月2日星期二

PHP调用Gmail发送邮件

大家对PHP的mail()函数一定都很熟悉,它简单易用,这里就不介绍了。如果你不知道怎么用,请查看PHP的在线手册。但是mail()并不是在任何服务器上都可以用的。下面是两个使用mail()的主要先决条件:

  • 1.服务器必须安装有sendmail
  • 2.smtp服务器无需鉴权(authentication)

比如自家的服务器,我在'Ubuntu命令行发送邮件到远端'一文里介绍过这个问题。 今天我准备介绍另外一种方法: PEAR:Mail + Gmail。首先,安装PEAR Mail, 这需要3个模块:NET/SMTP, Mail,Net/Socket。

如果你用的是RedHat,具体步骤如下:

1. 下载文件:
# cd /tmp
# wget http://download.pear.php.net/package/Mail-1.1.14.tgz
# wget http://download.pear.php.net/package/Net_SMTP-1.2.10.tgz
# wget http://download.pear.php.net/package/Net_Socket-1.0.8.tgz
2. untar 所有文件:
# tar -zxvf Mail-1.1.14.tgz
# tar -zxvf Net_SMTP-1.2.10.tgz
# tar -zxvf Net_Socket-1.0.8.tgz
3.安装文件:
# cd /usr/share/pear
# mkdir Net
# cd Net
# cp /tmp/Net_SMTP-1.2.10/SMTP.php .
# cp /tmp/Net_Socket-1.0.8/Socket.php .
# cd ..
# cp -avr /tmp/Mail-1.1.14/Mail/ .
# cp -avr /tmp/Mail-1.1.14/Mail.php .

如果你用的是Ubuntu,相对要简单一些:

1.如何你还没有装PEAR:
sudo apt-get install php-pear
2.有了pear以后,直接使用下面的命令:(提示:使用 ‘--alldeps’ 可以自动安装Mail的相关模块)
sudo pear install --alldeps Mail

安装好Pear的Mail模块后,你就可以使用PHP代码调用Gmail来发送邮件了。下面的代码可供参考:

<?php
require_once "Mail.php";
 
$from = "Adam <adam@gmail.com>";
$to = "Cindy <cindy@61dh.com>";
$subject = "Hi!"; //邮件主题
$body = "Hi,\n\nHow are you?"; //邮件内容
 
$host = "smtp.gmail.com";
$username = "adam"; //gmail用户名
$password = "mima-pass"; //gmail密码
 
$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'auth' => true,
'username' => $username,
'password' => $password));
 
$mail = $smtp->send($to, $headers, $body);
 
if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
} else {
echo("<p>Message successfully sent!</p>");
}
?>

参考资料:

https://help.ubuntu.com/community/PhpPear
http://www.cyberciti.biz/tips/howto-php-send-email-via-smtp-authentication.html

标签: ,

2009年4月10日星期五

让Putty支持多标签

用Putty好多年了,这个免费小巧的Telnet/SSH客服端几乎是我每天必用的工具之一。我不确定Putty是不是被使用最多的SSH客服端,但是我知道周围的人都在用它也都爱用它。以前我还用过Absolute Telnet、 SecureCRT、 还有一个界面很漂亮的,但是忘记什么名字了,好像是韩国人写的。后面这三种也都还不错,但是有个共同的缺点:不是免费软件。我现在已经很少用破解软件了,很多开源软件还是很不错的,就比如说Putty:可以保存连接设置、可以设置用户界面(字体、背景等等)、支持多种编码、支持发送空包(防止超时被踢出)、鼠标选中右键直接复制... 有这么多功能了,而且还是免费的,为什么还用破解?

其实Putty也不是十全十美的,Putty一次只可以有连接一个服务器,当然你可以同时打开多个Putty,但是如果你要同时在多个服务器间工作,总是觉得很不方便(就像你用惯了多标签浏览器 (Firefox),就会很纳闷为什么还有那么多人在用IE6,在一大堆窗口间换来换去,不觉得烦吗?)。相比之下,SecureCRT就要方便很多,它提供多标签的功能。好在大部分时间我只是在两三个服务器间工作,所以问题也不是很大。

今天无意间发现了一个软件:Putty Connection Manager (Putty连接管理器)。刚刚下载安装了,着实让我激动了一下,这不就是我要的多标签功能吗?从官方网站上看,这款软件是2007年出来的。郁闷,我到现在才知道!虽然还没来得及深入地使用这个软件,但是冲着这个多标签功能(tabbed version of famous Putty),我要在这里先喊一喊:用Putty的朋友快来下载使用Putty连接伴侣 :-)

官方地址:http://puttycm.free.fr/

提示:Putty Connection Manager是用来管理Putty连接的,它不可以取代Putty,所以你必须要先安装Putty!

更新(4/14): 经过几天的试用,觉得该软件还是不够成熟。一个很大的问题是:当别的应用程序界面叠在Putty Connection Manager(PCM)界面的上部(这里指不是完全覆盖的情况),你必须点击PCM的边缘,才可以切换到PCM界面;点击Putty终端区域,不起任何作用。也就是说PCM多标签控制区和Putty终端区域实际上并没有完全融合在一起。总得来讲,我对这个软件有点失望。不过如果你有兴趣,还是可以试试看。并且这个软件现在还是测试版,希望在将来的版本里有所改进。

标签: ,

2009年1月20日星期二

Ubuntu 命令行发送邮件到远端

我在一部冗余的笔记本电脑(Compaq Presario R3000, 显示屏坏了)上装了Ubuntu+Apache+PHP,平时主要用来调试代码。此外还有一个重要的用途:我在上面运行一些Cron Job, 用来更新网站开发日志的日志分类栏目。虽然每次运行结果都会被存在LOG文件里,但是有时Cron Job运行会出错,为了在第一时间里发现问题,我希望可以通过Email把运行结果发到我常用的邮箱里。

Ubuntu命令行发送邮件的方法很多,如果Google一下,可以找到象mailx,mutt,nail等邮件客户端。但是安装以后,尝试通过它们放送邮件到Gmail或者Hotmail,却得到“Mailing to remote domains not supported”的错误信息。认真研究一下,发现问题出在我的Ubuntu缺少完善的邮件服务器(MTA)。可是我的Ubuntu挂在自家的局域网上,没有固定IP,要搭建一个功能完善的邮件服务器估计不是很容易。(P.S.我在常用的Linux命令集一文里介绍了如何在命令行发送邮件,但是这适合于与安装有邮件服务器的终端,要不然的话,就只可以在本地内发送) 但是我想或许可以通过Gmail在命令行上发送邮件,上网Google了一下,终于找到了一个和我有相同问题的人,不同的是他还提供了详细的解决方案。很简单只需照猫画虎,就可以实现从命令行发送邮件到远端了。原文是英文的,我稍作翻译如下,希望对一些人有所帮助。

1. 安装所需的软件

$ sudo apt-get install msmtp
$ sudo apt-get install nail

2. 安装Gamil的Thawte证书

$ mkdir -p ~/etc/.certs
$ chmod 0700 ~/etc/.certs
$ cd ~/etc/.certs
$ wget https://www.verisign.com/support/thawte-roots.zip --no-check-certificate
$ unzip thawte-roots.zip
$ cp Thawte\ Server\ Roots/ThawtePremiumServerCA_b64.txt ThawtePremiumServerCA.crt

3. 配置msmtp,我是用Vim打开的,原文使用gedit

$ gedit ~/.msmtprc
或者: 
$ vim ~/.msmtprc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account,并且把account default改为gmail。 别忘了改“USER”!!!

# config options: http://msmtp.sourceforge.net/doc/msmtp.html#A-user-configuration-file
defaults
logfile /tmp/msmtp.log
# isp account
account isp
auth login
host SMTP.YOURISP.COM
port 25
user YOURNAME@ISP.COM
from YOURNAME@ISP.COM
password *****
# gmail account
account gmail
auth on
host smtp.gmail.com
port 587
user YOURNAME@gmail.com
password *****
from YOURNAME@gmail.com
tls on
tls_trust_file /home/USER/etc/.certs/ThawtePremiumServerCA.crt
# set default account to use (from above)
account default : isp
# 注意:我把默认改为 gmail

4. 更改msmtprc文件的许可

$ chmod 600 ~/.msmtprc

5. 配置nail,我是用Vim打开的,原文使用gedit

$ gedit ~/.mailrc
或者
$ vim ~/.mailrc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account。

# set smtp for nail
# ref: http://ubuntuforums.org/showpost.php...94&postcount=6
# docs: http://msmtp.sourceforge.net/doc/msm...guration-files
# isp account (default)
# $ nail -s "subject line" -a /path/file recipient@email.com < /path/body.txt
set from="YOURNAME@ISP.COM"
set sendmail="/usr/bin/msmtp"
set message-sendmail-extra-arguments="-a isp"
# gmail account
# $ nail -A gmail -s "subject line" -a /path/file recipient@email.com < /path/body.txt
account gmail {
set from="YOURNAME@gmail.com (YOURNAME)"
set sendmail="/usr/bin/msmtp"
set message-sendmail-extra-arguments="-a gmail"
}

搞定!!!

发送测试:

$ echo -e "testing email from the command line" > /tmp/test_email
$ nail -A gmail -s "gmail test" YOURNAME@gmail.com < /tmp/test_email

Log文件在:/tmp/msmtp.log

标签:

2008年11月19日星期三

两个有用的VIM使用技巧

Linux下的编辑利器应该要算VIM了!VIM功能强大,例如:语法加亮、列编辑、正则表达式替换、多窗口操作等等。但是对于初学者,特别是用惯了鼠标的Windows用户,VIM的用户界面与使用方法非常不符合常规,甚至认为它比较混乱,无所适从。事实上,VIM编辑器是专门为经验丰富的用户设计的,它的界面和使用方法提供了更快的速度和更强的功能。对于熟知它的用户,VIM的许多特性节省了时间和击键次数,并可以完成一些其他编辑器无法完成的功能。本文只是针对我的个人经验介绍两个有用的VIM使用技巧:跨文件间的多行拷贝和列编辑模式。如果您对VIM很陌生,建议先读读这篇文章

跨文件间的多行拷贝

我通常是用PUTTY登入到服务器然后用VIM来编辑代码,在不同文件间拷贝代码是常有的事。当要拷贝的部分是在屏幕可见范围内,只要用鼠标左键把代码选中,然后转到另一文件里,右键点击代码就被复制了。但是如果要复制的部分超过一个屏幕的高度,就没那么简单了。在VIM的常规模式下,用鼠标是无法跨页选择的。比较土的办法是,先复制一页内容,然后转到下一页再拷贝。但是如此多次复制容易出错,一不小心就可能多复制或者少复制了几行。这里介绍一种相对简单的办法:

  1. 用VIM打开一个文件, 例如:vim original.php
  2. 在普通模式下,输入:":sp"; (不含引号)横向切分一个窗口,或者":vsp"纵向切分一个窗口,敲入命令后,你将看到两个窗口打开的是同一个文件。
  3. 在普通模式下, 输入:":e new.php", 在其中一个窗口里打开另一个文件。
  4. 切换到含有源文件(original.php)的窗口,在普通模式下,把光标移到你要复制的第一行的开头,按一下v进入可视模式,然后使用向下键选择你要复制的部分,选好后按一下y, 选择的内容就被复制到临时寄存器里。(用crt+w再按一下w,可以在两个窗口间切换。)
  5. 切换到目标文件窗口,在普通模式下,按一下p,就完成复制了。

列编辑模式

用过UltraEdit的人可能都知道,UlrtaEdit支持列编辑模式(column mode), 按alt+c可以进入列模式,然后以列为单位选择文本,很方便的!VIM也有这个功能:ctrl+v, 比如要在每一行的开头加入字符串:61dh.com,步骤如下:

  1. 用VIM打开一个文件, 例如:vim abc.php
  2. 在普通模式下,按ctrl+v,进入列可视编辑模式
  3. 把关标移到第一行的开头,按向下键,选择所有行的开头
  4. 按大写的I,切换到插入模式,输入61dh.com。(这时你只能看到第一行被修改了,请不要着急。)
  5. 按Esc两次,就会自动完成所有行的编辑。

标签:

2008年10月7日星期二

常用的Linux命令集

打算用这一贴,来记录我日常工作中用到了Linux命令,不包括我本来就很熟悉的(比如说,ls, cp, rm, 等等。 :-)

参考:http://lowfatlinux.com/http://www.shelldorado.com/

1. 压缩文件:

 zip squash.zip file1 file2 file3

注释:file1, file2, file3 是你要压缩到squash.zip里的文件

2. 解压文件:

 unzip squash.zip

3. 发送邮件:

  • 发送简单的文本文件,或者文本信息
    mail -s "把主题放在这里" someone@example.com < file.txt
    
    echo "邮件内容" | mail -s "把主题放在这里" someone@example.com
注释:如果我们把非文本文件,比如jpg,pdf等用以上方法传送,收到的是文件的二进制代码,而不是实际的附件。
所以如果我们发送附件,必须用下面的方法。
  • 发送附件(jpg,pdf,zip,等等)
    //如果你的系统支持uuencode,
    
    uuencode file1 file2 | mail -s "主题" guest@61dh.com"
    
    //如果你的系统支持mutt。
    
    mutt -s "主题" -a file1 guest@61dh.com

注释:用uuencode是指Unix编码方法,它把附件file1,转换成file2,然后发送。

4. 拷贝文件:(10/14/08)

find . | cpio -pdmv yourDIR

注释一:把当前目录下的文件拷贝到指定目录'myDIR'; 通常我都是用如下的cp命令,但是有时 'cp -f' 无法自动覆盖已经存在的文件。但是用cpio 就工作的很好。而且你还可以用find找到你要拷贝的文件,所以可配置性很强。

cp -f * yourDIR

注释二: cpio的可以参数很多,这里我用到, -pdmv,意思如下:具体参照

-p 代表copy-pass模式,意思是从标准输入获取拷贝的内容
-d 代表make-directories,意思是根据需要创建新的目录
-m 代表modification, 意思是保留被拷贝文件的修改时间
-v 代表verbose, 意思是 列出文件的详细内容比如,user,group

5. 拷贝文件2:(06/18/09)

通常使用cp –rf /path/to/file1 /path/to/file2 就可以强制覆盖已经存在的文件,但是有时你发现它仍然需要确认。原因很可能是,在.bashrc文件里,我使用了alias, 例如:alias cp='cp -i', 意思是当你运行命令cp,它使用cp -i来代替,这样可以避免误删除。但是当你要复制大批文件,每个文件都要确认一定是很烦人的事。这是你可以通过下面的方法来移除alias:

‘cp’ –rf /path/to/file1 /path/to/file2 注意:这里使用了单引号

标签: