新手问题 调用 outlook 发送邮件的功能报错,求大神指导~~

lionzixuanyuan · 2012年11月26日 · 最后由 lionzixuanyuan 回复于 2012年11月26日 · 3466 次阅读

以上为报错页面。下面是报错的代码。

class SendMail < ActiveRecord::Base
 def self.sendmail(title,content,to)
    cov = Iconv.new( 'gbk', 'utf-8')              #中文乱码解决方法
    outlook = WIN32OLE.new('Outlook.Application')
    message = outlook.CreateItem(0)
    message.Subject = cov.iconv(title)
    message.Body = cov.iconv(content)
    message.To = cov.iconv(to)
    if message.Send     #此行报错
      puts "mail send success!"
    else
      puts "mail send error! oh my god!!!"
    end
  end
end

查不出报错的原因,请各位有经验的前辈指教一下~~

追加:刚刚又查出了一个现象,如下: 当通过 mongrel_rails start -a XXX.XXX.XXX.XXX -p XXXX的方式启动应用服务时,邮件发送正常,没有出现报错。 当通过 mongrel_rails service::install -N XXX -c "D:\XXXXXXX" -a XXX.XXX.XXX.XXX -p XXXX -e development方式启动应用服务时,邮件发送报错,求大神指教,这两种启动方式的区别,为什么会导致win32ole报错~

共收到 15 条回复

能不能直接通过SMTP Server发送邮件,而不是调用Outlook?

把启动参数一个一个的删除来试试看看?是不是带的参数不同它启动的方式也不一样?(比如-e development这个参数换成-e production

#2楼 @ywjno 目前我们这开发的系统都是用development启的,回头我去试试

#1楼 @lgn21st SMTP Server没有用过,有没有文档可以介绍给我看看?先谢过 还有,如果要改的话,可能系统里的代码部分改动量也会比较大~

和你的问题无关 - 这个类不需要 < ActiveRecord::Base

#5楼 @knwang 你的意思是将模型中的 < ActiveRecord::Base 这段去掉吗?

7楼 已删除
8楼 已删除

#6楼 @lionzixuanyuan 可以去掉,但是不会帮助到你的报错

@lgn21st @lionzixuanyuan 我之前写的,供楼主参考

require 'net/smtp'
require 'net/pop'

EXServer = 'server-ex2007.xxxx.com.cn'

def send_mail(addressees, subject, body, sender, password)
  begin
    if addressees.empty?
      return nil
    else
      addressees = addressees.respond_to?(:to_ary) ? addressees : addressees.to_a
      content = "Content-Type:Text/HTML\r\nDate:#{Time.now}\r\nFrom:#{sender}\r\nTo:#{addressees.join(';')}\r\nSubject:#{subject.to_s}\r\n\r\n#{body}"
      Net::SMTP.start(EXServer) do |i|
        i.auth_login(sender, password)
        i.sendmail(content, sender, addressees)
      end
    end
  rescue => ex
  end
end

def read_mail(login, password)
  begin
    Net::POP3.start(EXServer, 110, login, password) do |i|
      if i.mails.empty?
        return nil
      else
        i.each_mail do |m|
          yield(m) if block_given?
        end
      end
    end
  rescue => ex
  end
end

#10楼 @neverlandxy_naix 多谢你提供的代码,比我写的好,不仅有发送邮件的,还有读取邮件的功能。 但是我现在面临的问题并不是如何发送邮件,而是说在不同的启动服务的方式下,通过win32ole调用outlook发送邮件的功能会有问题。 请问你的系统会通过注册服务的方式启动吗?然后如果通过注册服务的方式启动应用服务的话,有遇到过我说的这种报错情况吗? 谢谢~!

@lionzixuanyuan 我没有使用win32ole的方式发送邮件,毕竟rails一般都是部署在linux系统下的,我只在windows下调用excel时使用win32ole,我不知道是不是ruby与windows结合不好的关系,使用win32ole会有很多缺陷。所以一直都是用SMTP Server方式,可以跨系统使用。

#12楼 @neverlandxy_naix 非常感谢你给我的帮助,看来这块代码确实需要改改。 另外,windows的部署环境也确实要考虑考虑是否需要更改...

@lionzixuanyuan 不客气,能帮到你就好^_^

#14楼 @neverlandxy_naix 以后不懂得地方还请多多指教

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册