2011-05-26 44 views
0

我制作了一个简单的发送附件邮件的表单。问题是我不知道如何使它在邮件程序中工作。到目前为止,我发现的所有教程都覆盖了该场景,当附件的文件已经在服务器的某个位置时,我无法找到任何有关验证电子邮件内容的信息。Rails 3,操作邮件程序,电子邮件内容的附件和验证

所以,我要告诉你2个问题:

  1. 我怎样才能让用户发送电子邮件,与他们上传的附件?
  2. 如何验证用户的输入和附件扩展?

我的电子邮件的形式......

<div id="form_wrapper"> 
    <%= form_for(:kontakt, :url => {:action => 'kontakt'}, :html => { :multipart => true }, :remote=>true) do |f| %> 
    <ul> 
    <li> 
     <%= f.label(:email) %> 
     <%= f.text_field(:email) %> 
    </li> 
    <li> 
     <%= f.label(:content) %> 
     <%= f.text_area(:content, :size => "42x7") %> 
    </li> 
    <li> 
     <%= f.label(:preview, :class=>:preview)%> 
     <%= f.file_field :preview %> 
    </li> 
    </ul> 
    <%= image_submit_tag("blank.gif",:id=>"send_email", :class=>"action submit") %> 
    <%= link_to("Reset", {:controller=>'frontend',:action => 'index'},:remote => true, :class => 'action reset') %> 
<% end %> 
</div> 
<%= javascript_include_tag 'jquery.form.js','jquery.rails','jquery.remotipart' %> 

和我的邮件...

class Contact < ActionMailer::Base 
    default :from => "[email protected]" 
    def wiadomosc(email) 
    @content=email[:content] 
    file=email[:preview] 
    attachments[file.original_filename] =File.read(file.path) 
    mail(
     :subject=>"www.XXXXXX.pl - you've got a new message", 
     :reply_to =>"[email protected]", 
     :to => email[:email] 
    ) 
    end 
end 

我想出了attachments[file.original_filename] =File.read(file.path)和它的添加附件但文件coruppted并不能打开...

任何想法或链接将不胜感激。

回答

7

我发现,如果你想在轨附件发送电子邮件,您需要连接这种方式......

attachments[file.original_filename] = File.open(file.path, 'rb'){|f| f.read} 

所以整个邮件的方法可能是这样的......

def message(email) 
    @content=email[:content] 
    unless email[:email_attachment].nil? 
    file=email[:email_attachment] 
    attachments[file.original_filename] = File.open(file.path, 'rb'){|f| f.read} 
    end 
    mail(
    :subject=>"www.XXXXXX.pl - you've got a new message", 
    :reply_to =>"[email protected]", 
    :to => email[:email] 
) 
end 

至于验证,有两种方法,我找到了。第一个很明显。您必须在您的数据库中创建一个表格,并像以往一样验证表单在模型中的输入。如果你这样做,那么一切都将保存在你的数据库中。它具有一些优点,例如:可以将它用作归档文件或用于应用程序中关于客户端的某种统计信息,甚至可以通过某些sql触发器进行处理。但是,如果您不想保存任何内容,则可以创建“无表模型”(Railscasts #193和原始Codetunes)。所有你需要做的是把这段代码在你的模型的开头:

def self.columns() @columns ||= []; end 

def self.column(name, sql_type = nil, default = nil, null = true) 
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null) 
end 

比你要列出你列...

column :name, :string 
column :company, :string 
column :email, :string 
column :content, :text 
column :type_of_question, :string 
column :email_attachment, :string 

之后,你可以将你的模型代码...

has_attached_file :email_attachment 

EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
TYPES = ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed'] 

validates :name, :presence => {:message => "Blah blah blah"} 
validates :email, :presence => {:message => "Blah blah blah"}, 
        :format=>{:unless=> Proc.new{|s| s.email.nil?|| s.email.empty? }, 
          :with => EMAIL_REGEX, :message => "Blah blah blah"} 
validates :content, :presence => {:message => "Blah blah blah"} 
validates_inclusion_of :type_of_question, :in => ["Blah1", "Blah2", "Blah3"], 
         :message => "%{value} is not on the list of types" 
validates_attachment_content_type :email_attachment, :content_type => TYPES, 
            :message => "The attachment has wrong extension..." 

现在,我使用Gmail发送电子邮件,但它很流利。用2Kb测试附件发送短消息大约需要2分钟。你有没有关于如何加快这个过程的建议?也许你可以推荐其他提供商或解决方案?

PS。不要忘记检查'客户端验证'Railscasts #263