我可能錯過了一些明顯的東西,但我有一個標誌,我想包括在我從我的應用程序發送的所有電子郵件中。我爲所有這些郵件程序使用了主佈局。我假設有一種方法可以讓它保持乾燥,而不必在每個郵件程序方法中添加代碼行來附加文件。有人能指引我正確的方向或糾正我的思路。Rails - 使用相同的附件爲所有電子郵件使用佈局
謝謝!
在您的郵件使用U可以添加布局文件我可能錯過了一些明顯的東西,但我有一個標誌,我想包括在我從我的應用程序發送的所有電子郵件中。我爲所有這些郵件程序使用了主佈局。我假設有一種方法可以讓它保持乾燥,而不必在每個郵件程序方法中添加代碼行來附加文件。有人能指引我正確的方向或糾正我的思路。Rails - 使用相同的附件爲所有電子郵件使用佈局
謝謝!
在您的郵件使用U可以添加布局文件<%= image_tag('logo.png') %>
我假設郵件發送出去以下是HTML或者多。
您還需要對環境文件進行更改。 ActionMailer不會獲得默認的base_url。比如,對於環境/ development.rb添加以下
config.action_mailer.default_url_options = { :host => "localhost:3000" }
如果你想這樣做在乾燥方式(和作爲附件),也許你可以做這樣的事情
class MyMailer < ActionMailer::Base
default :attachment => File.read(File.join(Rails.root,'public','images','logo.png'))
end
我砍死一點點,這不是理想的,但它的作品。
如果使用
default "SOMEHEADER", Proc.new { set_layout }
,然後定義set_layout
def set_layout
attachments.inline["logo.png"] = File.read("logopath.png")
attachments.inline["footer.jpg"] = File.read("footerpath.png")
"SOME HEADER VALUE"
end
然後因爲set_layout
被調用來設置頁眉,這也增加了內嵌附件。它基本上創建一個添加附件的回調。
ActionMailer
中的實際回調系統將是可取的,但也適用。
以爲我會分享,因爲我今天早些時候在這個問題上尋找這個答案。
回調使用的before_filter和after_filter將在未來Rails的支持釋放:
http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b
因爲他們將使用一個AbstractController ::回調來實現,你可以做以下的模仿,這將是功能目前在的ActionMailer :: Base的一次軌道4發佈:
class YourMailer < ActionMailer::Base
if self.included_modules.include?(AbstractController::Callbacks)
raise "You've already included AbstractController::Callbacks, remove this line."
else
include AbstractController::Callbacks
end
before_filter :add_inline_attachments!
private
def add_inline_attachments!
attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
end
end
這包括將在未來使用的模塊軌道版本,所以提供給您的回調掛鉤將保持未來兼容性相同。當您嘗試升級到已包含AbstractController :: Callbacks的Rails版本時,代碼將會提升,因此將提醒您刪除條件邏輯。
感謝您的提示。我認爲能夠在這裏重用'AbstractController :: Callbacks'真是太好了,我不知道這樣做可以做到!解決我的問題以在每個郵件程序中獲得內聯附件,我可以通過一個包含在我的ApplicationMailer中的專用模塊來配置所有內容。 – rchampourlier 2012-08-15 13:11:36
我知道你問附加內嵌圖片,但這裏的是用更少的複雜性達到了同樣的事情,不同的方法..
在html
佈局使用inline base64 encoded images - 無需附件!
基本上只是改變你的標誌圖像格式的src="..."
:
<img alt="example logo"
width="32px"
height="32px"
src="data:image/png;base64,iVBORw0KGgoAAA....."/>
我用網上的base64編碼器/解碼器工具在http://www.base64-image.net生成完整的<img />
標籤
這種方式有一些好處:
- 沒有附件代碼,這使得後端服務器代碼cl eaner,更易於閱讀
- 電子郵件大小沒有增加 - 內嵌圖片附件被轉換爲base64反正所以這種方法不會使電子郵件有效載荷任何較大
- 它的廣泛的支持 - 如果接收電子郵件客戶端顯示html
,它的pretty likely it also supports this method
不,如果他想使用內聯附件...他還需要有一個基本的url設置爲此工作以及... – sethvargo 2011-03-17 02:08:38
哦耶謝謝忘了提到這一點。我根據您的評論編輯了我的答案。 – Shiv 2011-03-17 03:41:48
謝謝@Shiv。不幸的是,它並沒有真正回答我的問題(可能還不清楚)。如果我遇到不能保留內容的問題,DRY在郵件程序類中,我必須調用attachments.inline ['logo_small.png'] = File.read('public/images/logo_small。 png')'在每個郵件程序中。那有意義嗎?我想要一種乾式添加附件的方式。 – dbwinger 2011-03-17 10:56:37