我制作了一个发送带有附件的电子邮件的简单表单。问题是我不知道如何让它在邮件中工作。到目前为止,我找到的所有教程都涵盖了附件的文件已经在服务器上的某个地方,而我找不到任何关于验证电子邮件内容的内容的情况。
所以,我有两个问题要问你:
- 如何允许用户发送带有附件的电子邮件
- 如何验证用户的输入和附件的扩展
我的电子邮件表单…
<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 => "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
我想出了attachments[file.original_filename] =File.read(file.path)
,它正在添加附件,但文件已损坏,无法打开。。。
任何想法或链接都将不胜感激。
我发现,如果你想在rails中发送带有附件的电子邮件,你需要这样附加。。。
attachments[file.original_filename] = File.open(file.path, 'rb'){|f| f.read}
所以整个mailer方法可能看起来像这样。。。
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
至于验证,我发现了两种方法。第一个很明显。您必须在数据库中创建一个表,并像往常一样在模型中验证表单的输入。如果您这样做,所有内容都将保存在数据库中。例如,它有一些优点:您可以将其用作存档,或在应用程序中用于有关客户端的某种统计信息,甚至可以将其通过一些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+-.]+@[a-zd-.]+.[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