2011-02-07 10 views

risposta

0

Non so molto di rotaie, ma ho lavorato a progetti in C# che creano e-mail e poi li inserisco in una casella di posta degli utenti tramite le API di Google. Per creare l'e-mail, ho dovuto generare la stringa e-mail da zero. Se abiliti multipart per l'e-mail, i byte dell'immagine saranno inclusi in una sezione multipart utilizzando la codifica base64.

È possibile controllare i pacchetti TMail e RubyMail per verificare se supportano queste azioni.

52

Ho combinato la risposta di Oksana con un approccio di supporto personalizzato e ho ottenuto quanto segue per funzionare abbastanza bene.

app/helpers/email_helper.rb

module EmailHelper 
    def email_image_tag(image, **options) 
    attachments[image] = File.read(Rails.root.join("app/assets/images/#{image}")) 
    image_tag attachments[image].url, **options 
    end 
end 

app/mailers/base_mailer.rb

class BaseMailer < ActionMailer::Base 
    add_template_helper(EmailHelper) 
end 

app/mailers/my_mailer.rb

class MyMailer < BaseMailer 

    def send_my_mail(email) 
    mail to: email, subject: "My Subject" 
    end 
end 

Poi per esempio dove voglio attaccare il logo aziendale nel mio file di layout e-mail che userei

app/views/layouts/email.html.erb

<%= email_image_tag("company_logo.png") %>


Nota le opzioni ** rende il tag più estensibile ma funzionerà solo in ruby> = 2. Per fare in modo che funzioni nel rubino < 2 dovrai utilizzare il vecchio modo di gestire le opzioni delle parole chiave.

+2

ciò che è interessante è che le immagini con trattini nel nome del file si trasformeranno in caratteri di sottolineatura quando si utilizza questo metodo –

+1

Non pensare che sia qualcosa che ho scritto lì. Potrebbe essere il risultato di URL.encode nell'helper image_tag delle rotaie ma non l'ho mai provato prima. –

+0

Hey tdubs sembra che funzioni, ma su dispositivi mobili in gmail allegherà tutte le immagini e non le mostrerà in linea. Penso che devi specificare il mime_type e la codifica –

20

Aggiunta su Oksana e risponde alle tdubs'

I tdubs modulo ha scritto opere su desktop, ma per il cliente Gmail Mobile, le immagini è apparso come allegati. Per risolvere questo problema, fare questo per il

app/aiutanti/email_helper.rb

module EmailHelper 
    def email_image_tag(image, **options) 
     attachments[image] = { 
      :data => File.read(Rails.root.join("app/assets/images/emails/#{image}")), 
      :mime_type => "image/png", 
      :encoding => "base64" 
     } 
     image_tag attachments[image].url, **options 
    end 
end 

Per il resto, seguire la risposta di tdubs.

+3

grazie per aver dedicato del tempo per postare questo avvertimento :) –

+4

Attenzione al codice. Stai specificando un tipo di mime specifico e la codifica e probabilmente non tutte le tue immagini corrisponderanno a entrambe quelle –

+4

Ricevo una sequenza di byte non valida con questo –

12

Dopo molte ricerche ho trovato un modo molto più semplice per incorporare l'immagine nella posta elettronica. Basta aggiungere seguente riga nel production.rb e development.rb

config.action_mailer.asset_host = 'YOUR HOST URL' 

nell'immagine embed vista utilizzando codice seguente.

<%= image_tag('My Web Site Logo.png') %> 

Nota: Assicurati di aggiornare TUO URL HOST e il mio sito Web Logo.png in sopra il codice.

Per i dettagli di base sull'utilizzo di Action Mailer, fare riferimento a ActionMailer::Base.

+3

Fai attenzione a fare questo. Dovrai ospitare quell'immagine a quell'URL per sempre o le persone non saranno più in grado di vedere l'email correttamente Molto meglio da incorporare con le immagini codificate in base64 –

+0

Un avvertimento accettabile per la semplicità della soluzione. –

4

copia incolla da qui

http://api.rubyonrails.org/classes/ActionMailer/Base.html#class-ActionMailer::Base-label-Inline+Attachments

allegati in linea

È inoltre possibile specificare che un file deve essere visualizzato in linea con altri HTML. Questo è utile se si desidera visualizzare un logo aziendale o una foto.

class Notifier < ApplicationMailer 
     def welcome(recipient) 
     attachments.inline['photo.png'] = File.read('path/to/photo.png') 
     mail(to: recipient, subject: "Here is what we look like") 
    end 
    end 

E poi per fare riferimento all'immagine nella vista, si crea un file welcome.html.erb e fare una chiamata a image_tag passando l'allegato che si desidera visualizzare e quindi chiamare URL sull'allegato per ottenere il percorso relativo Content ID per la fonte immagine:

<h1>Please Don't Cringe</h1> 

    <%= image_tag attachments['photo.png'].url -%> 

Come stiamo usando di azione View metodo image_tag, si può passare a qualsiasi altra opzione che si desidera:

<h1>Please Don't Cringe</h1> 

<%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%> 
18

RAILS 5

Nel tuo metodo di posta elettronica aggiungi il tuo allegato in linea che punta al tuo immagine:

class ConfirmationMailer < ActionMailer::Base 
    def confirmation_email 
     attachments.inline["logo.png"] = File.read("#{Rails.root}/app/assets/images/logo.png") 
     mail(to: email, subject: 'test subject') 
    end 
end 

Poi nel tuo html mail ad un image_tag con l'URL allegato:

<%= image_tag(attachments['logo.png'].url) %> 
+2

ha funzionato anche su binari 4.2 - grazie – ImranNaqvi

+0

@ImranNaqvi felice di poterti aiutare! – Joel

Problemi correlati