не правильно вложение в почту в рельсах - PullRequest
0 голосов
/ 30 декабря 2010

Я отправляю письмо с вложением (1.pdf), но в почте он не показывает 1.pdf, вместо этого он показывает какой-то случайный файл с именем "ATT008220.dat".

Я использую Rails 3.0Вот код, который я использую:

        @file = File.read('c:/1.pdf')
        @file.force_encoding('BINARY')
        attachment "application/octet-stream" do |a|
            a.body = @file
        end

Кто-нибудь знает, почему это происходит?Любая идея?

Спасибо и С уважением,

Harsh Raval.

РЕДАКТИРОВАТЬ :: ---- Способ отправки почты:

def contact(recipient, subject, message, sent_at = Time.now)   
    @subject = subject
    @recipients = recipient
    @from = 'harsh@apprika.com'
    @sent_on = sent_at
    @body = message
    #@file = File.read('c:/1.pdf')
    #@file.force_encoding('US_ASCII')
    #attachment "multipart/alternative" do |a|
    #   a.body = @file
    #end
    attachments['1.pdf'] =  {:mime_type => 'application/pdf',:content => File.read('c:/1.pdf')}
    @headers = {}
end

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

У меня была похожая проблема при попытке отправить письмо с файлом .xlsx в качестве вложения.Чтобы заставить его работать, мне пришлось сделать:

attachments['filename.xlsx'] = {
  :encoding => 'base64',
  :content  => Base64.encode64(File.read(filename))
}

Это частично упоминается в разделе 2.3.2 Руководства по почтовой программе: http://guides.rubyonrails.org/action_mailer_basics.html#complete-list-of-action-mailer-methods

2 голосов
/ 11 мая 2013

Начиная с Rails 3 (x), ваше расположение контента определяет, каким образом имя файла будет получено конечным пользователем.

Вместо:

attachments['1.pdf'] =  {:mime_type => 'application/pdf',:content => File.read('c:/1.pdf')}

Используйте это:

# I like to rewrite the file name to exclude any whitespaces
safe_name = file_name.gsub(/[^0-9a-z\.]/i,"-")
attachments[safe_name] = {
  :content  => File.read(file_name),
  :content_disposition => "attachment; filename=\"#{safe_name}\""
}

Вы можете включить mime_type, но если вы не объясните порядок, в котором должны быть включены вложения, вы можете получить некоторые неприятные результаты, если вы не укажете в почтовой программе что-то вроде этого:

class SampleNotifications < ActionMailer::Base

  # my_mailer
  :content_type => 'multipart/alternative',
  :parts_order => [ "text/plain", "text/enriched", "text/html", "application/octet-stream" ]

  def notify
    ... something like the code above
  end

end
2 голосов
/ 30 декабря 2010

Я думаю, вам нужно указать имя файла

@file = File.read('c:/1.pdf')
@file.force_encoding('BINARY')
attachment "application/octet-stream" do |a|
  a.body = @file
  a.filename = "1.pdf"
end

И я бы использовал "application/pdf" для PDF-файла.

EDIT:

Я посмотрел руководства по Rails 3 и не вижу ни одного примера с приведенным выше синтаксисом. Вместо этого они используют что-то вроде этого:

attachments['1.pdf'] = File.read('c:/1.pdf')

Или с дополнительными опциями:

attachments['1.pdf'] = {:mime_type => 'application/octet-stream',                              
                           :content => File.read('c:/1.pdf') }

Посмотрите здесь для получения дополнительной информации.

РЕДАКТИРОВАТЬ 2:

Я хочу ответить на ваши вопросы из комментариев. Я не использовал mailer в Rails 3, но я использую его в Rails 2.3.X, и вот некоторый код, который работает для меня:

attachment :content_type => "application/msword",
  :body => File.read("files/word.doc"),
  :filename => "word.doc"

attachment "application/pdf" do |a|
  a.body = File.read("files/some_pdf.pdf")
  a.filename = "umowa.pdf"
end

В Rails 3 почтовый API изменился. И вы должны использовать новый API. Btw. Вы также можете попробовать, если мой первый пример работает - он использует хэш вместо блока.

ДРУГОЕ РЕДАКТИРОВАНИЕ:

Я думаю, вы должны использовать mail объект для отправки почты. Вот пример из Rails Guides:

def welcome_email(user)
  @user = user
  @url  = user_url(@user)
  mail(:to => user.email,
     :subject => "Welcome to My Awesome Site")
end

и message должны отображаться в виде почтовой программы. Я думаю, что у вас есть проблемы с этим, потому что вы смешиваете старый API почтовых программ с новым. Взгляните здесь , чтобы увидеть, как сделать это "по-новому" шаг за шагом.

0 голосов
/ 03 января 2011

Сделайте следующее:

добавить следующее в actionmailer: -

def send_mail
    attachments['1.pdf'] = File.read('c:/1.pdf')
    mail(:to => "harsh@xyz.com", :subject => "xyz", :from=>"harsh@xyz.com")
    mail.deliver
end

Примечания. - Убедитесь, что параметры smtp указаны правильно, а файл, соответствующий действию (в этом примере send_mail.rhtml), находится в соответствующей папке.

Надеюсь, это поможет.

...