edge
Daugiau informacijos rubyonrails.org: Daugiau apie Ruby on Rails

Veiksmų pašto dėžutės pagrindai

Šis vadovas suteiks jums visą informaciją, kurią reikia pradėti gauti el. laiškus į jūsų programą.

Po šio vadovo perskaitymo, jūs žinosite:

1 Kas yra „Action Mailbox“?

„Action Mailbox“ maršrutizuoja gautus el. laiškus į kontrolerio panašias pašto dėžutes, kurios yra apdorojamos „Rails“. Jis siunčia laiškus per Mailgun, Mandrill, Postmark ir SendGrid. Taip pat galite tiesiogiai tvarkyti gautus laiškus naudodami įmontuotus Exim, Postfix ir Qmail įėjimus.

Gauti el. laiškai yra paverčiami į „InboundEmail“ įrašus naudojant „Active Record“ ir turi gyvavimo ciklo sekimą, originalių laiškų saugojimą debesų saugykloje naudojant „Active Storage“ ir atsakingą duomenų tvarkymą su numatytuoju sunaikinimu.

Šie gauti el. laiškai yra maršrutizuojami asinchroniškai naudojant „Active Job“ į vieną arba kelias specialias pašto dėžutes, kurios gali tiesiogiai bendrauti su jūsų domeno modeliu.

2 Nustatymas

Įdiekite migracijas, reikalingas „InboundEmail“, ir įsitikinkite, kad „Active Storage“ yra sukonfigūruotas:

$ bin/rails action_mailbox:install
$ bin/rails db:migrate

3 Konfigūracija

3.1 Exim

Pasakykite „Action Mailbox“, kad priimtų laiškus iš SMTP peradresavimo:

# config/environments/production.rb
config.action_mailbox.ingress = :relay

Sugeneruokite stiprų slaptažodį, kurį „Action Mailbox“ galės naudoti autentifikuoti užklausas į peradresavimo įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte slaptažodį prie jūsų programos užšifruotų kredencialių pagal action_mailbox.ingress_password, kur „Action Mailbox“ jį automatiškai ras:

action_mailbox:
  ingress_password: ...

Alternatyviai, pateikite slaptažodį RAILS_INBOUND_EMAIL_PASSWORD aplinkos kintamajame.

Sukonfigūruokite Exim, kad perduotų gautus laiškus į bin/rails action_mailbox:ingress:exim, nurodydami peradresavimo įėjimo „URL“ ir jau anksčiau sugeneruotą INGRESS_PASSWORD. Jei jūsų programa būtų https://example.com, visas komandos pavyzdys atrodytų taip:

$ bin/rails action_mailbox:ingress:exim URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...

3.2 Mailgun

Pateikite „Action Mailbox“ jūsų Mailgun pasirašymo raktą (kurį galite rasti nustatymuose -> Sauga ir vartotojai -> API sauga „Mailgun“), kad jis galėtų autentifikuoti užklausas į „Mailgun“ įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte savo pasirašymo raktą prie jūsų programos užšifruotų kredencialių pagal action_mailbox.mailgun_signing_key, kur „Action Mailbox“ jį automatiškai ras:

action_mailbox:
  mailgun_signing_key: ...

Alternatyviai, pateikite savo pasirašymo raktą MAILGUN_INGRESS_SIGNING_KEY aplinkos kintamajame.

Pasakykite „Action Mailbox“, kad priimtų laiškus iš „Mailgun“:

# config/environments/production.rb
config.action_mailbox.ingress = :mailgun

Nuostatykite „Mailgun“ peradresuoti gautus laiškus į /rails/action_mailbox/mailgun/inbound_emails/mime. Jei jūsų programa būtų https://example.com, jūs nurodytumėte visiškai kvalifikuotą „URL“ https://example.com/rails/action_mailbox/mailgun/inbound_emails/mime.

3.3 Mandrill

Pateikite „Action Mailbox“ savo Mandrill API raktą, kad jis galėtų autentifikuoti užklausas į Mandrill įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte savo API raktą prie jūsų programos užšifruotų kredencialių pagal action_mailbox.mandrill_api_key, kur „Action Mailbox“ jį automatiškai ras:

action_mailbox:
  mandrill_api_key: ...

Alternatyviai, pateikite savo API raktą MANDRILL_INGRESS_API_KEY aplinkos kintamajame.

Pasakykite „Action Mailbox“, kad priimtų laiškus iš Mandrill:

# config/environments/production.rb
config.action_mailbox.ingress = :mandrill

Nuostatykite Mandrill peradresuoti gautus laiškus į /rails/action_mailbox/mandrill/inbound_emails. Jei jūsų programa būtų https://example.com, jūs nurodytumėte visiškai kvalifikuotą „URL“ https://example.com/rails/action_mailbox/mandrill/inbound_emails.

3.4 Postfix

Pasakykite „Action Mailbox“, kad priimtų laiškus iš SMTP peradresavimo:

# config/environments/production.rb
config.action_mailbox.ingress = :relay

Sugeneruokite stiprų slaptažodį, kurį „Action Mailbox“ galės naudoti autentifikuoti užklausas į peradresavimo įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte slaptažodį prie jūsų programos užšifruotų kredencialių pagal action_mailbox.ingress_password, kur „Action Mailbox“ jį automatiškai ras:

action_mailbox:
  ingress_password: ...

Alternatyviai, pateikite slaptažodį RAILS_INBOUND_EMAIL_PASSWORD aplinkos kintamajame.

Sukonfigūruokite Postfix perduoti gautus laiškus į bin/rails action_mailbox:ingress:postfix, nurodydami Postfix įėjimo „URL“ ir jau anksčiau sugeneruotą INGRESS_PASSWORD. Jei jūsų programa būtų https://example.com, visas komandos pavyzdys atrodytų taip:

$ bin/rails action_mailbox:ingress:postfix URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...

3.5 Postmark

Pasakykite „Action Mailbox“, kad priimtų laiškus iš Postmark:

# config/environments/production.rb
config.action_mailbox.ingress = :postmark

Sugeneruokite stiprų slaptažodį, kurį „Action Mailbox“ galės naudoti autentifikuoti užklausas į Postmark įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte slaptažodį prie jūsų programos užšifruotų kredencialių pagal action_mailbox.ingress_password, kur „Action Mailbox“ jį automatiškai ras:

action_mailbox:
  ingress_password: ...

Alternatyviai, pateikite slaptažodį RAILS_INBOUND_EMAIL_PASSWORD aplinkos kintamajame.

Nuostatykite Postmark įeinančią webhooks peradresuoti gautus laiškus į /rails/action_mailbox/postmark/inbound_emails su vartotojo vardu actionmailbox ir jau anksčiau sugeneruotu slaptažodžiu. Jei jūsų programa būtų https://example.com, jūs konfigūruotumėte Postmark su šiuo visiškai kvalifikuotu „URL“: https://actionmailbox:SLAPTAŽ[email protected]/rails/action_mailbox/postmark/inbound_emails

PASTABA: Konfigūruojant Postmark įeinamąjį webhook'ą, įsitikinkite, kad pažymėtas langelis "Įtraukti žalią el. pašto turinį JSON pakete". Action Mailbox reikia žalio el. pašto turinio, kad galėtų veikti.

3.6 Qmail

Nurodykite Action Mailbox priimti el. laiškus iš SMTP peradresavimo:

# config/environments/production.rb
config.action_mailbox.ingress = :relay

Sukurkite stiprų slaptažodį, kurį Action Mailbox galės naudoti autentifikuoti užklausas į peradresavimo įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte slaptažodį prie jūsų programos užšifruotų kredencialių po action_mailbox.ingress_password, kur Action Mailbox jį automatiškai ras:

action_mailbox:
  ingress_password: ...

Alternatyviai, slaptažodį galite nurodyti RAILS_INBOUND_EMAIL_PASSWORD aplinkos kintamajame.

Konfigūruokite Qmail perduoti įeinamuosius el. laiškus į bin/rails action_mailbox:ingress:qmail, nurodydami peradresavimo įėjimo URL ir anksčiau sugeneruotą INGRESS_PASSWORD. Jei jūsų programa būtų https://example.com, visiškas komandos pavyzdys atrodytų taip:

$ bin/rails action_mailbox:ingress:qmail URL=https://example.com/rails/action_mailbox/relay/inbound_emails INGRESS_PASSWORD=...

3.7 SendGrid

Nurodykite Action Mailbox priimti el. laiškus iš SendGrid:

# config/environments/production.rb
config.action_mailbox.ingress = :sendgrid

Sukurkite stiprų slaptažodį, kurį Action Mailbox galės naudoti autentifikuoti užklausas į SendGrid įėjimą.

Naudokite bin/rails credentials:edit, kad pridėtumėte slaptažodį prie jūsų programos užšifruotų kredencialių po action_mailbox.ingress_password, kur Action Mailbox jį automatiškai ras:

action_mailbox:
  ingress_password: ...

Alternatyviai, slaptažodį galite nurodyti RAILS_INBOUND_EMAIL_PASSWORD aplinkos kintamajame.

Nuostatų SendGrid Inbound Parse peradresuoti įeinamuosius el. laiškus į /rails/action_mailbox/sendgrid/inbound_emails su vartotojo vardu actionmailbox ir anksčiau sugeneruotu slaptažodžiu. Jei jūsų programa būtų https://example.com, SendGrid konfigūracija atrodytų taip:

https://actionmailbox:SLAPTAŽ[email protected]/rails/action_mailbox/sendgrid/inbound_emails

PASTABA: Konfigūruojant SendGrid Inbound Parse webhook'ą, įsitikinkite, kad pažymėtas langelis “Siųsti žalią, visą MIME žinutę.” Action Mailbox reikia žalios MIME žinutės, kad galėtų veikti.

4 Pavyzdžiai

Konfigūruokite pagrindinį maršrutizavimą:

# app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
  routing(/^save@/i     => :forwards)
  routing(/@replies\./i => :replies)
end

Tada sukurkite pašto dėžutę:

# Generuoti naują pašto dėžutę
$ bin/rails generate mailbox forwards
# app/mailboxes/forwards_mailbox.rb
class ForwardsMailbox < ApplicationMailbox
  # Callbacks specify prerequisites to processing
  before_processing :require_projects

  def process
    # Record the forward on the one project, or…
    if forwarder.projects.one?
      record_forward
    else
      # …involve a second Action Mailer to ask which project to forward into.
      request_forwarding_project
    end
  end

  private
    def require_projects
      if forwarder.projects.none?
        # Use Action Mailers to bounce incoming emails back to sender – this halts processing
        bounce_with Forwards::BounceMailer.no_projects(inbound_email, forwarder: forwarder)
      end
    end

    def record_forward
      forwarder.forwards.create subject: mail.subject, content: mail.content
    end

    def request_forwarding_project
      Forwards::RoutingMailer.choose_project(inbound_email, forwarder: forwarder).deliver_now
    end

    def forwarder
      @forwarder ||= User.find_by(email_address: mail.from)
    end
end

5 InboundEmails sunaikinimas

Pagal numatytuosius nustatymus, sėkmingai apdorotas InboundEmail bus sunaikintas po 30 dienų. Tai užtikrina, kad nebeturėsite žmonių duomenų, kai jie galbūt atšauks savo paskyras arba ištrins savo turinį. Tikslas yra tai, kad po el. laiško apdorojimo turėtumėte išgauti visus reikalingus duomenis ir juos paversti domeno modeliais ir turiniu jūsų programos pusėje. InboundEmail tiesiog lieka sistemoje papildomam laikui, kad būtų galima atlikti derinimo ir tyrimo veiksmus.

Tikras sunaikinimas atliekamas naudojant IncinerationJob, kuris yra suplanuotas paleisti po config.action_mailbox.incinerate_after laiko. Ši vertė pagal numatytuosius nustatymus yra 30.days, bet galite ją pakeisti savo production.rb konfigūracijoje. (Atkreipkite dėmesį, kad tolimojoje ateityje suplanuotas sunaikinimas priklauso nuo jūsų darbo eilės galimybės laikyti užduotis tiek ilgai.)

6 Darbas su Action Mailbox kūrimo metu

Naudinga galėti testuoti įeinančius el. laiškus kūrimo metu, nesiunčiant ir negavus tikrų el. laiškų. Tam yra konduktorius valdiklis, įdiegtas adresu /rails/conductor/action_mailbox/inbound_emails, kuris suteikia jums visų InboundEmail sistemose sąrašą, jų apdorojimo būseną ir formą naujam InboundEmail kūrimui.

7 Pašto dėžučių testavimas

Pavyzdys:

class ForwardsMailboxTest < ActionMailbox::TestCase
  test "directly recording a client forward for a forwarder and forwardee corresponding to one project" do
    assert_difference -> { people(:david).buckets.first.recordings.count } do
      receive_inbound_email_from_mail \
        to: '[email protected]',
        from: people(:david).email_address,
        subject: "Fwd: Status update?",
        body: <<~BODY
          --- Begin forwarded message ---
          From: Frank Holland <[email protected]>

          What's the status?
        BODY
    end

    recording = people(:david).buckets.first.recordings.last
    assert_equal people(:david), recording.creator
    assert_equal "Status update?", recording.forward.subject
    assert_match "What's the status?", recording.forward.content.to_s
  end
end

Norėdami gauti daugiau informacijos apie testavimo pagalbinės funkcijos, žiūrėkite ActionMailbox::TestHelper API. ```

Atsiliepimai

Jūs esate skatinami padėti pagerinti šio vadovo kokybę.

Prašome prisidėti, jei pastebite rašybos klaidų ar faktinių klaidų. Norėdami pradėti, galite perskaityti mūsų dokumentacijos prisidėjimo skyrių.

Taip pat gali būti nepilnos informacijos arba informacijos, kuri nėra atnaujinta. Prašome pridėti bet kokią trūkstamą dokumentaciją pagrindiniam. Patikrinkite Edge vadovus pirmiausia, ar problemas jau išspręsta arba ne pagrindinėje šakoje. Patikrinkite Ruby on Rails vadovų gaires dėl stiliaus ir konvencijų.

Jei dėl kokios nors priežasties pastebite kažką, ką reikia ištaisyti, bet negalite patys tai pataisyti, prašome pranešti apie problemą.

Ir galiausiai, bet ne mažiau svarbu, bet koks diskusijos dėl Ruby on Rails dokumentacijos yra labai laukiamos oficialiame Ruby on Rails forume.