2011-02-25 66 views
7

我可能錯過了一些明顯的東西,但我有一個標誌,我想包括在我從我的應用程序發送的所有電子郵件中。我爲所有這些郵件程序使用了主佈局。我假設有一種方法可以讓它保持乾燥,而不必在每個郵件程序方法中添加代碼行來附加文件。有人能指引我正確的方向或糾正我的思路。Rails - 使用相同的附件爲所有電子郵件使用佈局

謝謝!

在您的郵件使用U可以添加布局文件

回答

1

<%= 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 
+1

不,如果他想使用內聯附件...他還需要有一個基本的url設置爲此工作以及... – sethvargo 2011-03-17 02:08:38

+0

哦耶謝謝忘了提到這一點。我根據您的評論編輯了我的答案。 – Shiv 2011-03-17 03:41:48

+1

謝謝@Shiv。不幸的是,它並沒有真正回答我的問題(可能還不清楚)。如果我遇到不能保留內容的問題,DRY在郵件程序類中,我必須調用attachments.inline ['logo_small.png'] = File.read('public/images/logo_small。 png')'在每個郵件程序中。那有意義嗎?我想要一種乾式添加附件的方式。 – dbwinger 2011-03-17 10:56:37

2

我砍死一點點,這不是理想的,但它的作品。

如果使用

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中的實際回調系統將是可取的,但也適用。

以爲我會分享,因爲我今天早些時候在這個問題上尋找這個答案。

7

回調使用的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版本時,代碼將會提升,因此將提醒您刪除條件邏輯。

+0

感謝您的提示。我認爲能夠在這裏重用'AbstractController :: Callbacks'真是太好了,我不知道這樣做可以做到!解決我的問題以在每個郵件程序中獲得內聯附件,我可以通過一個包含在我的ApplicationMailer中的專用模塊來配置所有內容。 – rchampourlier 2012-08-15 13:11:36

-1

我知道你問附加內嵌圖片,但這裏的是用更少的複雜性達到了同樣的事情,不同的方法..

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

相關問題