江边闲话集

10/16/2008

给NetBean For Ruby安装Fast Debugger

Filed under: 一技之长 — Tags: , , — 张太国 @ 17:11

心血来潮,发现自己的Netbean IDE for ruby已经很老了,于是想更新一下。

用就用最新的,到这里下载了一个最新的NB 6.5 beta版本:

http://bits.netbeans.org/download/trunk/nightly/latest/

下载2分钟,安装1分钟,导入工程1分钟。然后点击调试按钮0.1s,系统居然提示我安装fast debugger 0.3版本。直接在IDE上安装了,等了N久就是安装不上。

接着在命令行飞快输入:

gem install ruby-debug-ide -v '0.3.2' --include-dependencies

等了半天,居然出现如下结果:

INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Bulk updating Gem source index for: http://gems.rubyforge.org/

于是在美国的服务器上试了一把,结果是没问题。看来是我们这边网络有问题呀。设置好socket代理,嘿,我也不知道怎么在gem下设置socket代理,只知道设置http代理。无果,只能下载gem文件安装了。

Google了一把,

ruby-debug-ide居然在Debug Commons里面。链接是:http://rubyforge.org/frs/?group_id=3085

因为ruby-debug-ide依赖ruby-debug-base,所以不得不找它。后来发现在ruby-debug这里,链接是http://rubyforge.org/frs/?group_id=1900

注意,如果你在windows安装,ruby-debug-base必须安装windows版本的。

一切搞定。要不是公司网络问题,我还不知道ruby-debug-ide的包究竟在哪里。

接下来想研究一下它是如何给ruby设置hook的。

09/10/2008

Nginx+Mongrel+Rails配置摘要

Filed under: 一技之长 — Tags: , — 张太国 @ 16:36

Nginx+mongrel+Rails配置的方案很多,在这里只摘抄Nginx的配置文件,然后解释一下

  user www www;#用户名和组都为www,前者为用户名,后者为用户组。如果主进程以root来运行,
                            #nginx使用setuid()/setgid() 。如果没有指定组,nginix使用和用户名相同的组名。

  worker_processes  10;  #worker 进程数

 
  error_log  logs/error.log debug;   #错误日志文件,debug为级别 ,
                                                    #有debug , info , notice ,warn ,error ,crit
  pid        /var/run/nginx.pid;  #nginx的进程位置

  events {  

    use epoll;
    worker_connections  51200;   //worker连接数
  }  

http {  
   include       conf/mime.types;  
   default_type  application/octet-stream;  

  #charset  utf-8;
  sendfile        on;  
  #tcp_nopush     on;
  keepalive_timeout  65;  
  tcp_nodelay        on;  
 

  gzip  on;  
  gzip_min_length  1K;  
  gzip_buffers     48k;  
  gzip_types       text/plain application/x-javascript text/css application/xml;  

  upstream mongrel {   #loading balance
    server 127.0.0.1:8000;  
    server 127.0.0.1:8001;  
  }  

  server {   #server配置,可以设置N个
     listen       80;  
    server_name 
www.domainname.com;  #域名或IP你
    root /usr/local/depot/public;   #根目录
    index  index.html index.htm;   #index文件
    location / {  
      proxy_set_header  X-Real-IP  $remote_addr;  
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
      proxy_set_header Host $http_host;  
      proxy_redirect false;  
  

  if (-f $request_filename/index.html) {  
        rewrite (.*) $1/index.html break;  
      }  
 

if (-f $request_filename.html) {  
        rewrite (.*) $1.html break;  
      }  
if (!-f $request_filename) {  
        proxy_pass
http://mongrel;
       break;  
   }  
  }  
  error_page   500 502 503 504  /50x.html;   #error page

  #设置location
  location = /50x.html {  
        root   html;  
    }  

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
     expires      30d;
   }
  location ~ .*\.(js|css)?$
   {
     expires      1h;
   }   
 

log_format  access  ‘$remote_addr – $remote_user [$time_local] "$request" ‘
             ‘$status $body_bytes_sent "$http_referer" ‘
             ‘"$http_user_agent" $http_x_forwarded_for’;

access_log  /var/logs/access.log  access;
}  

注:Nginx的文档

02/29/2008

eShortcuts

Filed under: 一技之长 — Tags: , — 张太国 @ 17:02

太不容易了,这么多shortcuts for e。决定每天背诵一遍。最主要是多用。

  • alt-p
  • alt-j
  • flash

Controller

  redirect_to

  • rea
  • reai
  • rec
  • reca
  • recai

render

  • ra
  • ral
  • rf
  • rfu
  • ri
  • ril
  • rit =>render :inline => "<%= ‘hello’ %>", :type => :rxml
  • rl
  • rn
  • rns
  • rp
  • rpc
  • rpl
  • rpo
  • rps
  • rt
  • rtl
  • rtlt
  • rts
  • rcea
  • rcec
  • rceca

verify

Model

  • Ctrl-alt-shift-s  Show db scheme for current model
  • bt
  • habtm
  • ho
  • hm
  • va
  • vaif
  • vc
  • vcif
  • ve
  • veif
  • vi
  • vp
  • vpif
  • vu
  • vuif

ERb

  • ft
  • lia
  • liai
  • lic
  • lica
  • licai

Migrate

  • mcol
  • mccc
  • mtab

Ruby

  • :
  • doo

"Premature end of script headers: dispatch.fcgi"终极解决方案

Filed under: 一技之长 — Tags: , — 张太国 @ 11:56

名字够响亮,当然内容也很响亮。哈哈。

现状:

   当使用Apache(或其他web server,例如lighttpd),以及fastcgi(或cgi)等来部署rails或python等时,经常会出现以下错误:

     Premature end of script headers: dispatch.fcgi

解决方案:

本解决方案是基于Rails+Apache+fastcgi+debian,其他类似。

  • 检查dispatch.fcgi的用户或用户组,以及访问权限,至少定义为755.
  • 检查dispatch.fcgi的第一行的ruby编译器是否正确,很多人开发在windows平台上,而部署则在Linux/Unix平台上,所以将#!C:/ruby.exe改为#  !/usr/bin/ruby。ruby具体在什么位置,输入whereis ruby即可。
  • 不能允许有打印的代码。例如在rails里,坚决不要将p 或puts写到代码里,这样会导致header破坏。其他语言看着办。
  • 如果以上方案均为解决,到dispatch所在的目录下运行 ./dispatch.fcgi看是否正确。如果有什么错误的话,修正即可。

以上提供的4种方案都可以解决这个问题。要是还是不能解决,请将您的case告诉我。

另外,可以参考另一文章:在Debian上部署Rails Apache+fcgi(或FastCgi)

01/02/2008

Ruby遍历文件夹

Filed under: 一技之长 — Tags: , — 张太国 @ 17:26

哈哈,这么简单的问题居然也敢拿出来献丑。没办法,天生愚钝吧!
实现该功能在其他语言里那就是小菜一碟,当然ruby也是。不多说,贴代码:
 def traverse_dir(file_path)
    if File.directory? file_path
      puts "Dir:"+file_path
      Dir.foreach(file_path) do |file|
        if file!="." and file!=".."
        traverse_dir(file_path+"/"+file)
        end
      end
    else
      puts "File:"+file_path
    end
  end
 
traverse_dir "d:"

太简单了

12/21/2007

Ruby不支持中文

Filed under: 一技之长 — Tags: — 张太国 @ 17:29

一直用Ruby那么久了,但是从来没有像今天一样尴尬。因为我还没有真正意识到ruby不支持Unicode。
从接触ruby到现在,都是使用英文,今天偶尔想写个小应用程序来获取一些中文信息,没想到结果是乱码,其实我早应该知道这样的,毕竟不支持Unicode呀。即便如此,我仍然在心里面责备自己太无知了。
网上流行了很多包来解决此,而且ruby的作者也说在下一个版本中支持。但是按照ruby这样的速度开发下去,不知道是何年何月呀。

最后再次BS一下自己。

09/26/2007

在Debian上部署Rails Apache+fcgi(或FastCgi)

Filed under: 一技之长 — Tags: , — 张太国 @ 15:26

Rails+Apache2+fcgid安装

安装Ruby

tar xzvf ruby-1.8.6.tar.gz
cd ruby-1.8.6
./configure
make
make install

    
检查一下ruby是否安装,输入:

ruby -v

安装zlib

tar xvzf  zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make
make install

安装rubygem  

tar xzvf rubygems-0.9.4.tgz
cd rubygems-0.9.4
ruby setup.rb

为了看是否安装上,输入:

gem -v

Rails

gem install rails -y

 有的时候可能因为网速问题装不上,请耐心多试记下.

测试

rails testRails
cd testRails
ruby script/server

 

 

 

 

会有如下显示:

=> Booting WEBrick…
=> Rails application started on http://0.0.0.0:3000=> Ctrl-C to shutdown server; call with

   –help for options
[2007-08-15 08:02:04] INFO  WEBrick 1.3.1
[2007-08-15 08:02:04] INFO  ruby 1.8.6 (2007-03-13) [i686-linux]
[2007-08-15 08:02:04] INFO  WEBrick::HTTPServer#start: pid=16306 port=3000

 

ImageMagick

tar xzvf ImageMagick-6.3.5-6.tar.gz
cd ImageMagick-6.3.5
./configure
make
make install

看是否安装成功,输入:

usr/local/bin/convert logo: logo.gif

 

 

安装RMagick

tar xvzf RMagick-1.15.10.tar.gz
cd RMagick-1.15.10
./configure
make
make install

安装fcgi

由于rubyfcgi支持库需要在编译的时候联接FCGI的系统库,因此我们需要先安装FCGI库,下载FCGI源代码发行包:

http://www.fastcgi.com/dist/

tar xzvf fcgi-2.4.0.tar.gz

cd fcgi-2.4.0

./configure –prefix=/usr/local/fcgi

make && make install

 

 

 

 

 

安装fcgid

apt-get install libapache2-mod-fcgid
/etc/init.d/apache2 force-reload

 安装fcgi for ruby

gem install fcgi

配置apache

可以如下

   NameVirtualHost *
<IfModule mod_fcgid.c>
       AddHandler fcgid-script .fcgi
       SocketPath /var/lib/apache2/fcgid/sock
       DefaultInitEnv  RAILS_ENV production
       IdleTimeout 600
       ProcessLifeTime 3600
       MaxProcessCount 8
       DefaultMinClassProcessCount 3
       DefaultMaxClassProcessCount 3
       IPCConnectTimeout 8
       IPCCommTimeout 48
   </IfModule>

<VirtualHost *>
    ServerAdmin webmaster@localhost
    #ServerName localhost
    DocumentRoot /path/to/app/public/
    ErrorLog /xxx/log/httpd-error_log
    CustomLog /xxx/log/httpd-access_log common
    
   <Directory
/path/to/app/public/>
      Options ExecCGI FollowSymLinks
      AllowOverride all
      Order allow,deny
      Allow from all
   </Directory>
</VirtualHost>

配置应用程序

编辑.htaccess文件

注释 AddHandler cgi-script .cgi以及AddHandler fastcgi-script .fcgi,增加AddHandler fcgid-script .fcgi.

RewriteRule ^(.*)$ dispatch.cgi [QSA,L]改为RewriteRule ^(.*)$ dispatch.fcgi [QSA,L].

可以如下:

# General Apache options

AddHandler fcgid-script .fcgi

Options +FollowSymLinks +ExecCGI

RewriteEngine On

RewriteRule ^$ index.html [QSA]

RewriteRule ^([^.]+)$ $1.html [QSA]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

ErrorDocument 500 “<h2>Application error</h2>Rails application failed to start properly”

编辑dispatch.fcgi

加入

require ‘fcgi_handler’

require ‘rubygems’

require_gem ‘fcgi’

需要注意的是,我们一般都是在windows平台开发,然后部署到linux上去,如果您属于这种情况,请注意文件的第一行编译器

的设置.windows上可能是:

#! C:\ruby\bin\ruby

需要改成

#! /usr/local/bin/ruby

问题解答

Q:如果C编译器没有安装,应该如何安装呢?  
A:debian上使用如下命令:

apt-get install build-essential

 
Q:如果出现以下错误:

<— lib
/usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:4:in `require’: no such file to load — zlib (LoadError)
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:4
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:8:in `require’
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:8
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:504:in `require’
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:504
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:81:in `require’
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:81:in `install_sources’
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:116:in `run_hook’
        from setup.rb:1526:in `exec_task_traverse’
        from setup.rb:1342:in `exec_install’
        from setup.rb:1000:in `exec_install’
        from setup.rb:814:in `invoke’
        from setup.rb:773:in `invoke’
        from setup.rb:1578

 我该怎么办?

A:说明zlib无法加载.解决方案:

cd ruby-1.8.6/ext/zlib/
ruby extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
make
make install

Q:如果利用查看fcgi for ruby是否已经装上?
A:请调用gem list,看是否fcgi在其中

Q:如果我利用gem install fcgi 安装不上怎么办?
A:很简单,下载其源代码然后进行安装:
   

然后就可以安装rubyfcgi支持库了,下载ruby-fcgi-0.8.7.tar.gz

 

http://rubyforge.org/projects/fcgi/

tar xzvf ruby-fcgi-0.8.7.tar.gz

cd ruby-fcgi-0.8.7

ruby install.rb config — –with-fcgi-include=/usr/local/include –with-fcgi-lib=/usr/local/lib

ruby install.rb setup

ruby install.rb install


 
需要注意的是,还是安装上fastcgi.

Q:如我我遇到如下错误怎么办?

mod_fcgid: can’t apply process slot for “xxx/xxx/public/dispatch.fcgi”

A:这个比较简单,修改一下Apache的日志目录权限,例如chmod 755 /var/log/apache2

Q:如果遇见如下错误怎么办?

Premature end of script headers: dispatch.fcgi

A:请先检查一下该文件的配置以及.htaccess.如果问题依旧,请修改一下dispatch.fcgi的权限,至少是755更多详情,

参考我的另一文章:

“Premature end of script headers: dispatch.fcgi”终极解决方案

.

Q:如果提示RewriteEngine拼写错误,或者没有启用该功能怎么处理?
A:非常简单,那是因为apacherewrite模块没有加载.请先检查rewrite模块是否已经安装.然后执行下面的命令:

cd /etc/apache3/mods-available
     nano -e rewrite.load

输入

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Ctrl+X保存

cd ..
ln -s mods-available/rewrite.load mods-enabled

然后重启apache

/etc/init.d/apache2 restart

Q: 如何选择fastcgifcgid?
A:很简单,如果是apache1.x,选用fastcgi,如果是apache2.x,请选用fcgid

Q:对系统有什么要求?
A:建议采用2.6版本的内核

  
Q:怎么使用ImageMagick无法显示图片?

A:请先调用

/usr/local/bin/convert logo: logo.gif


 

 

如果没法生成或者生成的gif文件无效,请重新安装ImageMagick.在安装之前请安装jpeg,freetype,png,tiff等库.

  • apt-get install libjpeg62-dev或apt-get install libjpeg62  –>jpeg

  • apt-get install  libfreetype6  –> freetype

对于最新的版本,可能要安装ghostscript。

apt-get install  gs

Q:如果访问网站显示的是dispatch.fcgi的源内容,怎么办?

A:一般来说,有2个理由导致:

  1.    没有安装fcgi module。因为没有安装,访问时没法解析。关于安装的问题,参见上面安装fcgi这一节。
  2. 或者是apache不同版本造成的。

09/17/2007

mongrel启动问题的解决方案

Filed under: 一技之长 — Tags: — 张太国 @ 16:19

如果使用Mongrel来部署Rails,就不可避免的使用

  1. mongrel_rails start -C mongrel.config  

这里mongrel.config是mongrel的配置文件,可以为:

  1. —  
  2.  :config_script:  
  3.  :environment: development  
  4.  :pid_file: log/mongrel.pid  
  5.  :num_processors: 1024  
  6.  :docroot: public  
  7.  :timeout: 0  
  8.  :host: 0.0.0.0  
  9.  :mime_map:  
  10.  :port: 3000  
  11.  :daemon: false  
  12.  :cwd: /home/linux/projects/mongrel/testapp  
  13.  :includes:  
  14.  – mongrel  
  15.  :debug: false  
  16.  :log_file: log/mongrel.log  

然后到app的根目录下运行上述的命令,恭喜您,你启动成功了.
但是有个问题,如果我不在app的根目录下运行呢?系统会给出我们信息:

  1. !!! Path to log file not valid: log/mongrel.log  
  2. mongrel::start reported an error. Use mongrel_rails mongrel::start -h to get help.  

第一眼看见这个错误,觉得非常简单,Mongrels的创始人给出的答案是将相对路径改为绝对路径.
也许上述的方法能解决问题,但是我相信仍然有一种情况:即使改为绝对路径,还是出现同样的错误.
如果发生上述的错误应该怎么办?
不幸的是,上述的问题我已经碰见过,很长时间不得要领.文档看破皮了,还是不能运行.不得已,打开mongrels的源代码看看.最后发现需要指定工作目录,因为工作目录是在log之前验证的.
摘录一段代码:

ruby 代码
  1. module Mongrel  
  2.   class Start < GemPlugin::Plugin "/commands"  
  3.     include Mongrel::Command::Base  
  4.   
  5.     def configure  
  6.       options [  
  7.         ["-e""–environment ENV""Rails environment to run as", :@environment, ENV[‘RAILS_ENV’] || "development"],  
  8.         ["-d""–daemonize""Run daemonized in the background", :@daemonfalse],  
  9.         [‘-p’, ‘–port PORT’, "Which port to bind to", :@port, 3000],  
  10.         [‘-a’, ‘–address ADDR’, "Address to bind to", :@address"0.0.0.0"],  
  11.         [‘-l’, ‘–log FILE’, "Where to write log messages", :@log_file"log/mongrel.log"],  
  12.         [‘-P’, ‘–pid FILE’, "Where to write the PID", :@pid_file"log/mongrel.pid"],  
  13.         [‘-n’, ‘–num-procs INT’, "Number of processors active before clients denied", :@num_procs, 1024],  
  14.         [‘-t’, ‘–timeout TIME’, "Timeout all requests after 100th seconds time", :@timeout, 0],  
  15.         [‘-m’, ‘–mime PATH’, "A YAML file that lists additional MIME types", :@mime_mapnil],  
  16.         [‘-c’, ‘–chdir PATH’, "Change to dir before starting (will be expanded)", :@cwdDir.pwd],  
  17.         [‘-r’, ‘–root PATH’, "Set the document root (default ‘public’)", :@docroot"public"],  
  18.         [‘-B’, ‘–debug’, "Enable debugging mode", :@debugfalse],  
  19.         [‘-C’, ‘–config PATH’, "Use a config file", :@config_filenil],  
  20.         [‘-S’, ‘–script PATH’, "Load the given file as an extra config script", :@config_scriptnil],  
  21.         [‘-G’, ‘–generate PATH’, "Generate a config file for use with -C", :@generatenil],  
  22.         [, ‘–user USER’, "User to run as", :@usernil],  
  23.         [, ‘–group GROUP’, "Group to run as", :@groupnil],  
  24.         [, ‘–prefix PATH’, "URL prefix for Rails app", :@prefixnil]  
  25.       ]  
  26.     end  
  27.   
  28.     def validate  
  29.       @cwd = File.expand_path(@cwd)  
  30.       valid_dir? @cwd"Invalid path to change to during daemon mode: #@cwd"  
  31.   
  32.       # Change there to start, then we’ll have to come back after daemonize  
  33.       Dir.chdir(@cwd)  
  34.   
  35.       valid?(@prefix[0].chr == "/" && @prefix[-1].chr != "/""Prefix must begin with / and not end in /"if @prefix  
  36.       valid_dir? File.dirname(@log_file), "Path to log file not valid: #@log_file"  
  37.       valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file"  
  38.       valid_dir? @docroot"Path to docroot not valid: #@docroot"  
  39.       valid_exists? @mime_map"MIME mapping file does not exist: #@mime_map" if @mime_map  
  40.       valid_exists? @config_file"Config file not there: #@config_file" if @config_file  
  41.       valid_dir? File.dirname(@generate), "Problem accessing directory to #@generate" if @generate  
  42.       valid_user? @user if @user  
  43.       valid_group? @group if @group  
  44.   
  45.       return @valid  
  46.     end  
  47.   
  48.     def run  
  49.       # Config file settings will override command line settings  
  50.       settings = { :host => @address,  :port => @port:cwd => @cwd,  
  51.         :log_file => @log_file:pid_file => @pid_file:environment => @environment,  
  52.         :docroot => @docroot:mime_map => @mime_map:daemon => @daemon,  
  53.         :debug => @debug:includes => ["mongrel"], :config_script => @config_script,  
  54.         :num_processors => @num_procs:timeout => @timeout,  
  55.         :user => @user:group => @group:prefix => @prefix:config_file => @config_file  
  56.       }  
  57.   
  58.      #……  
  59.   
  60.       if @config_file  
  61.         settings.merge! YAML.load_file(@config_file)  
  62.         STDERR.puts "** Loading settings from #{@config_file} (they override command line)." unless settings[:daemon]  
  63.       end  
  64.   
  65.       config = Mongrel::Rails::RailsConfigurator.new(settings) do  
  66.         if defaults[:daemon]  
  67.           if File.exist? defaults[:pid_file]  
  68.             log "!!! PID file #{defaults[:pid_file]} already exists.  Mongrel could be running already.  Check your #{defaults[:log_file]} for errors."  
  69.             log "!!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start."  
  70.             exit 1  
  71.           end  
  72.   
  73.           daemonize  
  74.           log "Daemonized, any open files are closed.  Look at #{defaults[:pid_file]} and #{defaults[:log_file]} for info."  
  75.           log "Settings loaded from #{@config_file} (they override command line)." if @config_file  
  76.         end  

看看上面的代码就非常清楚了.
那么如何解决,可以这样:

  1. mongrel_rails  start -c youapp/path/to -C mongrel.config  

这样就OK了.

扩展应用:可以配置为服务自动启动.

09/13/2007

ruby利用mail和sendmail发送邮件

Filed under: 一技之长 — Tags: — 张太国 @ 16:50

在linux上一般都带有mailx,mail或者sendmail,那么如何利用ruby来发送邮件呢?
实现起来并不太难.

思路
mail和sendmail都是linux下的命令,也就是说得让ruby调用这些命令,如何调用,那就是

ruby 代码
  1. IO.popen(sendmail_cmd)  


如何利用mail或sendmail发送邮件

 mail:

  1. mailx -s SUBJECT_CONTENT SEND_TO_EMAIL  

sendmail:

  1. #sendmail -t -v  
  2. To:someone@domain.com  
  3. From:your address  
  4. Subject: your subject  
  5. your email text  
  6. Ctrl_D  

Ruby实现
 
  Emailx:

  1. email_to=["to@domail.com"]  
  2. cc_to=[""ccc@domail.comm"] 
  3. file="attachment-path" 
  4.   sendmail_cmd="(uuencode  #{file};"  
  5.   sendmail_cmd<<"cat body)" 
  6.   sendmail_cmd <<" |mailx -s \"hello\" #{email_to} "  
  7.   pipe=IO.popen(sendmail_cmd)  

     sendmail

  1. pipe=IO.popen("/usr/sbin/sendmail -t -v","w")  
  2. pipe.puts "To: to@domain.com\n"  
  3. pipe.puts "From:Admin<admin@domain.com>\n"  
  4. pipe.puts "Subject: Subject here\n"  
  5. pipe.puts   
  6. pipe.puts "hello,this is email text!"  
  7.   
  8. pipe.close_write  

问题
 其实上面的实现很简单,不过有几个问题:

  • 对于emailx,如何改变from address呢
  • 对于sendmail,如何实现附件呢

08/21/2007

ROR发送邮件

Filed under: 一技之长 — Tags: — 张太国 @ 20:53

用ROR (Ruby On Rails)发送邮件是一个老话题,但是Google一下,会发现很多人都在抱怨无法发送出去,我自己也经历过类似的情况.

官方给出了一篇文档,即How To Send Email With ActionMailer.遗憾的是仍然有很多人说根据该文档配置之后还是发不出去.我也是参考了该文档,最后成功了.总结一下,如果不成功,很有可能是配置的问题.

ROR是利用ActionMailer来发送的,而且内部采用Tmail.先看看我的配置:

代码
  1. # Include your application configuration below  
  2. ActionMailer::Base.perform_deliveries = true  
  3. ActionMailer::Base.raise_delivery_errors = true  
  4. ActionMailer::Base.default_charset = "utf-8"  
  5. ActionMailer::Base.server_settings = {  
  6.     :address => "mail.xxxx.com",  
  7.     :port => 25,  
  8.     :domain => "www.xxxx.com",  
  9.     :user_name => "admin@xxxx.com",  
  10.     :password => "password",  
  11.     :authentication => :login  
  12.     }  

以上配置非常简单,无非就是配置了邮件服务器的状况,注意一下认证方式就可以了.

根据以上的配置,是可以发送的,也就是官方给的文档关于SMTP是没有错的.

如果按照上面的还是不能发送,首先检查一下是否正确配置改文件.另外检查一下发送人,即from是否正确?何谓正确?邮件地址的域名不要是localhost,例如admin@localhost.com 是不正确的.也正因为此,我自己就吃了一点亏,因为使用http://localhost:3000 来测试的,而from地址优势根据该URI来判断的.

至于带有TLS或认证的,参考官方文档的Sending emails with TLS and/or authentication-only SMTP servers这一部分,据目前了解的情况看,有人成功发送.

其实就是这么简单,只不过出现一点状况,会令人头痛,幸好Rails提供了源代码.

令人欣慰的是,如果你的Rails程序部署在Linux/Unix系统上,而且已经安装了sendmail,只需要将邮件的delivery方式设置为sendmail即可。最后摘录rails的sendmail代码:

ruby 代码
 
  1. def perform_delivery_sendmail(mail)  
  2.        IO.popen("#{sendmail_settings[:location]} #{sendmail_settings[:arguments]}","w+"do |sm|  
  3.          sm.print(mail.encoded.gsub(/\r/, ))  
  4.          sm.flush  
  5.        end  
  6.     end  

 

 

Older Posts »

Powered by WordPress