Вложения Rails ActionMailer отображаются в виде искаженного текста - PullRequest
4 голосов
/ 24 февраля 2012

Я пытаюсь отправить вложения в формате pdf в одно из моих приложений rails, но вложение приходит в виде текста, а не в виде обычного pdf.

Мой почтовик выглядит так:

class Notifications < ActionMailer::Base
  def contact(email_params, sent_at = Time.now)
    subject "" << email_params[:subject]
    recipients "" << email_params[:client]
    from "#{email_params[:name]} <#{email_params[:address]}>"
    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank?
    sent_on sent_at
    body :message => email_params[:body], :sender_name => email_params[:name]
  end
end

И что я получаю в своем почтовом ящике:

--
Date: Thu, 23 Feb 2012 13:50:58 -0800
Mime-Version: 1.0
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-ID: <[mailserver]>

Message Body

--
Date: Thu, 23 Feb 2012 13:50:58 -0800
Mime-Version: 1.0
Content-Type: application/pdf;
charset=UTF-8;
filename=invoice.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=invoice.pdf
Content-ID: <[mailserver]>

Затем следует очень длинная строка символов ascii

Без каких-либо вложений эта информация заголовка не отправляется, и я просто получаю часть «Тело сообщения» в своем почтовом ящике. Я подозреваю, что часть File.read () строки вложения в моем mailer.rb как-то является виновником, но она указывает на действительный файл PDF на моем сервере, к которому я могу получить доступ через мой браузер. Журналы говорят только о том, что письмо было отправлено с правильными параметрами, но оно отправляется как то, что выглядит как декомпилированный текст или что-то вроде, если вы открыли pdf в текстовом редакторе.

Представление почтовой программы contact.html.erb просто: <%= @message %> Если это поможет.

Есть идеи, что я могу делать не так?

Спасибо.

Обновление:

По-видимому, мне нужно было и contact.erb, и contact.html.erb в моей директории views. Просто скопировав файл и переименовав его работало. Однако теперь тело сообщения пустое. Отображается только вложение.

Ответы [ 4 ]

6 голосов
/ 01 марта 2012

Просто для справки, у меня была такая же проблема, и в моем случае решение было поменять местами вложения и почтовые линии.Сначала прикрепите, затем позвоните по почте.

НЕПРАВИЛЬНО

def pdf_email(email, subject, pdfname, pdfpath)
  mail(:to => email, :subject => subject)
  attachments[pdfname] = File.read(pdfpath)
end

ХОРОШО

def pdf_email(email, subject, pdfname, pdfpath)
  attachments[pdfname] = File.read(pdfpath)
  mail(:to => email, :subject => subject)
end
3 голосов
/ 24 февраля 2012

Ну, наконец-то это сработало:

class Notifications < ActionMailer::Base
  def contact(email_params, sent_at = Time.now)
    subject "" << email_params[:subject]
    recipients "" << email_params[:client]
    from "#{email_params[:name]} <#{email_params[:address]}>"

    part "text/plain" do |p|
      p.part :content_type => "text/plain", :body => render("contact.erb")
    end

    @message = email_params[:body]

    attachments['invoice.pdf'] = File.read("#{Rails.root.to_s}/public#{email_params[:attach]}") unless email_params[:attach].blank?   

    sent_on sent_at

    mail(:to => email_params[:client],
         :from => email_params[:address],
         :subject => email_params[:subject]) do |format|
      format.html { render 'contact' }
      format.text { render :text => email_params[:body] }
    end
  end
end

Я уверен, что есть посторонние линии, но это работает как минимум.Я также переименовал файл представления из contact.erb в contact.text.erb в дополнение к тому, что уже скопировал этот файл в contact.html.erb.

И я вызываю метод из моего контроллера с помощью:

  def send_mail
    Notifications.deliver_contact(params[:email])
    redirect_to "/mail/success"
    #Notifications.contact(params[:email]).deliver
  end
2 голосов
/ 04 января 2013

Да, я недавно столкнулся с той же проблемой, и после того, как что-то было написано в теле содержимого почты, что-то вроде:

    mail(:to => reciever, :subject => "Hello, this is a mail from rails!") do |formate| 
        formate.text {render :text => "mail content body "}
    end.deliver

вложения начинают нормально отображаться.

0 голосов
/ 30 мая 2014

Я столкнулся с той же проблемой, но у меня не сработало изменение порядка вложения и доставки почты.

Что мне сработало, так это добавление расширения .pdf к имени файла.Несмотря на то, что мое имя файла уже имело расширение pdf, программа отправителя действий просто не прочитала расширение.Добавление снова работает отлично.

attachments[file_name + '.pdf'] = File.read(path)
...