2011-09-28 6 views
6

ho la mia e-mail transazionale configurazione del sistema & da persone di default ottenere messaggi di posta elettronica, come gli eventi accadono:Qual è il modo più elegante per implementare una email di digest senza reinventare un sistema di accodamento?

class Comment 

    after_create :email_original_poster 

    def email_original_poster 
    UserMailer.delay.notify_author_of_comment self 
    end 

end 

Tuttavia, invece di ottenere l'e-mail come-da-accade, un pezzo dei miei utenti preferirebbe un digest giornaliero o settimanale .

Qual è il modo più pulito ed elegante per implementarlo?

Ho già delayed_job funzionante, ma questo in realtà non sentire come un lavoro delayed_job dato che sto in fila i dati che devono essere agito piuttosto che le azioni che devono essere eseguite.

... senza reinventare un sistema di accodamento

So che la soluzione ovvia è tavolo di queued_emails e, naturalmente, ho potuto farlo. La ragione per cui sto facendo la domanda è che farlo è reinventare un sistema di accodamento. Non solo ci sono un sacco di sistemi di accodamento là fuori, ma come questo post così formulata da Percona sottolinea, è una buona idea di non rotolare il proprio:

http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

Hanno implementato un e-mail digerire, l'avete fatto usa delayed_job & cosa hai imparato?

risposta

1

Ovviamente non è necessario creare il proprio sistema di accodamento. Non ho usato delayed_job, ma ho usato resque in congiunzione con un gioiellino chiamato resque_mailer che dovrebbe fare esattamente quello che vuoi. La cosa bella di resque_mailer è che, una volta impostato, non è necessario modificare la modalità di invio normale della posta: MyMailer.some_mailing({vars}).deliver Se per qualche motivo non si desidera utilizzare la coda per inviare la posta (inviarla immediatamente), devi solo aggiungere! dopo la consegna e lo farà.

Cerca in resque (con redis) e resque_mailer, penso che farà quello che vuoi.

+1

Grazie per questo. Ci vorrà un po 'di tempo prima che sia in grado di analizzarlo e capire come funziona, ma tornerò sicuramente alla tua risposta una volta che avrò il suono –

+0

. Praticamente da tutto ciò che so di Resque ho imparato da questo Railscast: http://railscasts.com/episodes/271-resque – Nate

1

Un digest sembra più appropriato da fare come un cron job come. Dovresti comunque controllare "chi hai inviato", per gestire i crash e gli errori, ma l'idea è di eseguire, ad esempio, su base giornaliera, un'attività rake personalizzata che crea il tuo messaggio di posta includendo tutte le informazioni in un digita il formato e li invia o fa la coda per l'invio.

+0

Sono d'accordo sul fatto che questo è il meccanismo di attivazione più ragionevole ma non affronta ancora l'aspetto dell'accodamento che è quello hai ancora bisogno di accodare le email per essere elaborate da quel cron job. Come hai detto, devi anche assicurarti che vengano elaborati e gestire quelli che non sono ecc. Quindi il cron da solo non arriva così lontano. –

+0

se la coda è la tua preoccupazione, hai provato invece di delayed_job (basato su database relazionale), resque (basato su redis)? Recentemente ho fatto delle ricerche sui benchmark di redis e mi sono mostrato come un mostro più veloce.Penso davvero che non puoi farlo senza una sorta di coda, e resque/redis sembra essere una buona idea dato che è una coda persistente e non riempirà il tuo database sql. –

+0

Sono d'accordo. Penso che questo sia l'approccio che probabilmente sarà più appropriato - Nate in realtà ha suggerito un plugin basato su resque e progettato per questa attività, quindi questa è la prima cosa che proverò a provare –