Rails 3,Action Mailer,电子邮件内容的附件和验证

yaz*_*yaz 0 email validation attachment actionmailer ruby-on-rails-3

我已经制作了一个简单的表单,用于发送带附件的电子邮件.问题是我不知道如何让它在邮件中运行.到目前为止,我发现的所有教程都涵盖了附件文件已经位于服务器某处且我无法找到有关验证电子邮件内容的任何内容的情况.

所以,我有两个问题要问你:

  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' %>
Run Code Online (Sandbox Code Playgroud)

和我的邮件...

class Contact < ActionMailer::Base
  default :from => "xxxxx@gmail.com"
  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 =>"xxxxx@gmail.com",
      :to => email[:email]
    )
  end
end
Run Code Online (Sandbox Code Playgroud)

我提出了它attachments[file.original_filename] =File.read(file.path),它正在添加附件,但文件已经被修改,无法打开...

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

yaz*_*yaz 7

我发现如果你想在rails中发送带附件的电子邮件,你需要以这种方式附加它...

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

所以整个邮件程序方法可能看起来像这样......

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 =>"xxxxx@gmail.com",
    :to => email[:email]
  )
end
Run Code Online (Sandbox Code Playgroud)

至于验证,我发现有两种方法.第一个很明显.您必须在数据库中创建一个表,并像往常一样在模型中验证表单的输入.如果你这样做,那么一切都将保存在你的数据库中.它有一些优点,例如:您可以将其用作存档或用于应用程序中有关客户端的某种统计信息,甚至可以通过某些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
Run Code Online (Sandbox Code Playgroud)

比你必须列出你的列...

column :name, :string
column :company, :string
column :email, :string
column :content, :text
column :type_of_question, :string
column :email_attachment, :string
Run Code Online (Sandbox Code Playgroud)

之后你可以放置模型的代码......

has_attached_file :email_attachment

EMAIL_REGEX = /\A[\w+\-.]+@[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..."
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用Gmail发送电子邮件,但它非常流氓.使用2Kb测试附件发送短消息大约需要2分钟.您对如何加快这一过程有任何建议吗?也许您可以推荐其他提供商或解决方案?

PS.不要忘记查看"客户端验证" Railscasts#263