2010-08-19 10 views
19

Wenn ich 100 E-Mail an die registrierten Benutzer senden und ich möchte wissen, ob Benutzer offen E-Mail oder nichtE-Mail-Benachrichtigung öffnen - Ruby on Rails

Wie kann ich diese mit Ruby on Rails zu tun?

+0

Doons Antwort unten ist gründlich und genau. Ich finde diese Art von Anforderungen in der Regel von Stakeholdern kommen, die nur den "Mail" -Teil der E-Mail sehen und darauf bestehen, bitte-Sign-hier-Schneckenpost-Liefergarantien per Email zu beantragen. Ich denke, Sie sprechen besser mit Ihrem Kunden und erklären Ihnen die Einschränkungen. – Mhmmd

+2

Das Problem ist nicht zu wissen, ob es geöffnet war, das Problem ist mit dem "oder nicht". Das Hinzufügen des herkömmlichen Web-Bugs zu einer HTML-E-Mail kann Ihnen sagen, ob eine E-Mail geöffnet wurde. Es wurde vielleicht geöffnet, und Sie wissen es nicht, aber es ist ziemlich unwahrscheinlich, dass der Fehler sagen würde, dass es geöffnet wurde, wenn es nicht war. Während weniger als genau, ist es immer noch ein gutes Maß. Vor allem, wenn man den Erfolg einer Kampagne mit einer anderen vergleichen möchte. –

Antwort

24

Der einzige Weg, dies zu tun, ist HTML-E-Mail mit einem Tracker-Bild zu verwenden. Sie müssen ein benutzerspezifisches Bild in den Code einfügen.

class TrackingController < ApplicationController 
    def image 
    # do something with params[:id] 
    send_file "/path/to/an/image" 
    end 
end 

die folgende Route hinzufügen:

# Rails 2 
map.tracking_image "tracking_image/:id.gif", :controller => 'tracking', :action => image 

# Rails 3 
match 'products/:id', :to => 'tracking#image', :as => "tracking_image" 

# Rails 4 (match without verb is deprecated) 
get 'producsts/:id' => 'tracking#image', as: 'tracking_image' 
# or 
match 'producsts/:id' => 'tracking#image', as: 'tracking_image', via: :get 

in Ihrer E-Mail-Vorlage etwas wie folgt aus:

<%= image_tag tracking_image_url(@user.id) %> 

aber darüber im Klaren sein, dass es das nicht, dass der Benutzer garantiert wird die E-Mail liest und lädt das Bild, einige E-Mail-Clients laden keine Bilder, bis der Benutzer möchte. Und wenn er es nicht tut, kannst du nichts dagegen tun. Auch wenn der Benutzer nur Text-Mail verwendet, funktioniert dies auch nicht.

+2

für Rendern von Bildern im Browser ---- send_file "/path/to/an/image.gif",: type => 'image/gif',: disposition => 'inline' ---- send_file "/ Pfad /to/an/image.jpg ",: type => 'image/jpeg',: disposition => 'inline' – SyntaxGoonoo

+0

technische Sicht - diese Antwort löste mein Problem. Ja, ich stimme @Doon vollkommen zu –

9

Kurze Antwort, Sie können nicht. Etwas längere Antwort Sie können nicht zuverlässig.

Mit etwas wie VERP können Sie die Bounce-Verarbeitung automatisieren, um eine ziemlich gute Idee zu erhalten, wenn der Mail-Server der Gegenseite die E-Mail akzeptiert. Aber danach sind alle Wetten beendet. Sie können nicht wirklich sagen, was der E-Mail-Server damit gemacht hat (es in den Junk/Spam-Ordner verschieben, in den Posteingang legen, es still auf den Boden/Bit-Bucket legen usw.). Sie könnten Lesebestätigungs-Header in Ihrer E-Mail aktivieren, aber das ist Client-spezifisch (und Leute wie ich essen/leugnen sie). Sie können prüfen, ob Sie einen Web-Bug verwenden, z. B. jede E-Mail mit einer HTML-Datei anpassen, die ein Remote-Image mit einer eindeutigen ID abruft, aber wiederum Client-spezifisch, die meisten Remote-Images werden nicht geladen. Wenn die E-Mail nicht zurückgesendet wird, gibt es keine 100% zuverlässige Möglichkeit zu sagen, was mit der E-Mail passiert, nachdem sie Ihren Server verlassen hat.

+0

Ja - ich stimme Ihnen vollkommen zu. –

2

Ich bin nicht sehr vertraut mit Ruby, aber habe mehrere Massenmailer Apps geschrieben. Sie können ein Webbug-Bild verwenden, um eine ungefähre Öffnungsrate zu erhalten. Im Grunde ist es nur ein ein Pixel oder transparentes Bild mit einigen Tracking-Informationen:

<img src="http://mysite/trackingimage.gif?email=x&customer=y"> 

Was ich tue, ist ein Verzeichnis machen namens trackingimage.gif mit einem Index darin, das liest und speichert die URL params und dann zieht in die echtes Bild.