Неверное имя файла в электронной почте (ActionMailer) - PullRequest
9 голосов
/ 20 декабря 2010

У меня проблема с отправкой сообщения электронной почты с вложением с помощью ActionMailer.

Дело в том, что мое вложение имеет имя «noname», когда я читаю свое сообщение в gmail.

Функция уведомителя

class Notifier < ActionMailer::Base
  def send_message
    attachments["text.txt"] = {:content => "hello"}
    mail(:to => "me@gmail.com", :subject => 'test')
  end
end

Заголовки сообщений:

Date: Sun, 19 Dec 2010 23:18:00 +0100
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8;
 filename=text.txt
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=text.txt
Content-ID: ...

Как отправить сообщение с правильным именем файла?

Спасибо

Ответы [ 3 ]

11 голосов
/ 07 января 2011

Убедитесь, что у вас есть свои взгляды.

Сделать правильные файлы в app/views/[class_name]/[method_name]
Создайте файл app/views/notifier/send_message.erb и файл app/views/notifier/send_message.html.erb.

1 голос
/ 06 мая 2011

Дрю прав, эта проблема возникает, если отсутствует конкретное почтовое представление.

ИМХО, gmail не получает кодировку сообщения и переименовывает вложения.

Дополнительная информация доступна в справке Gmail:

0 голосов
/ 17 июля 2014

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

Используя этот почтовый код:

class Mailer < ActionMailer::Base
  def generic(args)
    args.reverse_merge! to: 'e@mail.com', from: 'e@mail.com'
    add_attachments! args.delete(:attachments)
    mail(args)
  end

  protected
  def add_attachments!(*files)
    files.flatten.compact.each do |file|
      attachments[File.basename(file)] = File.read(file)
    end
  end
end

Когда я делаю это, я получаю отдельный файл без имени:

Mailer.generic(attachments: [File.open('/path/to/file1.txt'), File.open('/path/to/file2.csv')]).deliver

Когда я делаю это, я получаю 2 отдельных файла с правильными именами:

Mailer.generic(body: '', attachments: [File.open('/path/to/file1.txt'), File.open('/path/to/file2.csv')]).deliver
...