2

メールを送信しようとしている時点ですべてが揃っていますが、すべてのリンクを変更してGoogleAnalyticsの属性を含める必要があります。問題は、電子メールのhtml_part.bodyを読み書きしようとすると、html文字列全体が何らかの形でエンコードされ、電子メールが正しく表示されないことです(つまり、<html>になります&lt;html&gt;)。html_part.body.raw_sourceをロガーに記録しましたが、適切なエンコードされていないHTMLとして表示されます。エンコードが行われるのは、メールが実際に送信されたときだけです。

EBlast.rb(ActionMailer)

def main(m, args={})

    # Parse content attachment references (they don't use helpers like the layout does)
    # and modify HTML in other ways
    m.prep_for_email self

    @email = m # Needed for helper methods in view
    mail_args = {
    :to => @user.email,
    :subject => m.subject,
    :template_path => 'e_blast',
    :template_name => 'no_template'
    }
    mail_args[:template_name] = 'main' if m.needs_template?

    m.prep_for_sending mail(mail_args)
end

Email.rb

def prep_for_sending(mail_object)

    if mail_object.html_part

    # If I simply do a 'return mail_object', the email sends just fine...
    # but the url trackers aren't applied.

    # Replace the content with the entire generated html
    self.content = mail_object.html_part.body.decoded

    # Add Google analytics tracker info to links in content
    apply_url_tracker :source => "Eblast Generator", :medium => :email

    # Replace the html_part contents
    mail_object.html_part.body = content

    # At this point, mail_object.html_part.body contains the entire
    # HTML string, unencoded. But when I send the email, it gets its
    # entities converted and the email is screwed.

    end

    # Send off email
    mail_object

end
4

1 に答える 1

7

私は再び自分の質問に答えているようです-今週は順調に進んでいます。

どうやら、bodyを直接設定すると、html_partのraw_contentsを置き換える代わりに、「body_raw」と呼ばれる奇妙な属性が作成されます。そのため、基本的に、メールオブジェクトに重複部分が埋め込まれることになりました(なぜこれが行われるのかわかりません)。別のMail::Partを作成し、それをhtml_partに割り当てると、html_partを置き換える代わりに、別のパーツが追加されます。WTF ?!

新しい編集:String.replaceに関する私の最後のコメントをスクラッチします。動作しているように見えましたが、別のコンピューターに行ってテストしたところ、同じ重複の問題が発生しました。

別の編集:最後に?

apply_url_trackerメソッドを実行する前に、電子メールの内容をリセットしていました(レンダリングされたビューのすべてのリンクを変更するため)。メッセージを考慮したMailオブジェクトのネジがすでにレンダリングされているはずなのかわかりませんが、方法を次のように変更すると、電子メール部分の重複とそれに続く「再エンコード」が修正されました。content属性は変更せず、html_partのみを変更します。

def prep_for_sending(message)

    if message.html_part
    # Replace the html raw_source
    message.html_part.body.raw_source.replace apply_url_tracker(message.html_part.body.decoded, :source => "Eblast Generator", :medium => :email)
    end

    message

end

明確化:mail()を呼び出すと、完全にレンダリングされたHTML /テキストパーツ(つまり、完全にレンダリングされたビュー)を含むMailオブジェクトが生成されますが、これらのビューで使用される属性(私の場合は「content」属性)を変更します最終送信まで。送信する前にモデルを変更しないでください。メールパーツを直接変更するだけです。

于 2013-02-24T22:05:41.773 に答える