【问题标题】:Rails 3: Sending Mail with Attachment - corrupted file after first sendRails 3:发送带附件的邮件 - 首次发送后文件损坏
【发布时间】:2013-03-18 01:09:49
【问题描述】:

我想实现一个真正简单的时事通讯。 因此,我可以选择尽可能多的收件人。

我可以在该时事通讯中附加一个文件。这适用于第一封邮件。所有接下来的邮件都有损坏的附件(1 字节大小)。

actionmailer:

def send_newsletter(recipient,subject,content,file)
    @content = content

    if file
      attachments[file.original_filename] =  {
        :content=> file.read, 
        :mime_type=> file.content_type
      }
    end

    mail(:to => recipient, :template_name => "deliver_newsletter",
             :subject => subject).deliver!
  end

应用程序控制器:

  def create
    @customers = Customer.where("CHAR_LENGTH(email) > 0")
    @recipients = params[:sent_to]
    @subject = params[:subject]
    @content = params[:content].html_safe
    @file = params[:file]

    if @recipients
      @recipients.each do |mail_recipient|
        Newsletter.send_newsletter(mail_recipient,@subject,@content,@file)
      end
    end

    respond_to do |format|
      format.html { redirect_to bills_path, notice: "everything works fine" }
    end
  end

最后是发送时事通讯的表格:

    <%= form_tag ('/newsletters'), :multipart => true do %>
            <%= t 'views.newsletter.to_recipient' %>:<br>
            <%= select_tag 'sent_to', options_from_collection_for_select(@customers, 'email', 'name'), :multiple => true, :class => 'sent_to' %><br><br>
          <%= t 'views.newsletter.subject' %>:<br>
            <%= text_field_tag 'subject' %><br><br>
          <%= t 'views.newsletter.content' %>:<br>
            <%= text_area_tag 'content', "".html_safe, :size=>"20x8" %><br><br>
<%= t 'views.newsletter.attachment' %>:<br>
<%= file_field_tag 'file' %><br><br>
          <%= submit_tag t('views.buttons.newsletter_send_now'), :class => "btn btn-primary", :disable_with => t('views.buttons.newsletter_sending') %>
    <% end %>

另一个小问题:为什么“delay_jobs”gem 中的“delay”在这里不起作用?所有其他邮件都可以通过键入“Newsletter.delay.send_newsletter(...)”来发送

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    这可能是因为file.read 将您留在文件末尾而没有任何内容可阅读。我会在您的 ApplicationController 中添加一个 file_contents = file.read,然后将其作为附加参数传递给每个 send_newsletter 调用,假设文件很小。

    【讨论】:

    • 解决方案既简单又有效。谢谢你的好提示!现在它正在工作!
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2020-01-04
    • 1970-01-01
    • 2011-12-09
    • 2023-03-21
    相关资源
    最近更新 更多