Envoi d'e-mails avec SideKiq échoue (Exception de tâche : :arguments attendus comme un tableau d'arguments de chaîne individuels)

J’ai configuré Discourse 2.7.12 et configuré l’envoi d’e-mails via Mailgun.

Même si l’application est capable d’envoyer des e-mails de test via le panneau d’administration, tous les travaux d’e-mail pertinents échouent dans Sidekiq.

Des idées sur ce qui pourrait être l’erreur ?

Exemple d’erreur Sidekiq :

Jobs::CriticalUserEmail
{“type”=>“forgot_password”,
“user_id”=>4,
“email_token”=>“ca2fd58bd00511d21d04ca05da6239ad”, “current_site_id”=>“default”
}

Jobs::HandledExceptionWrapper: Wrapped ArgumentError: :arguments expected to be an Array of individual string args

Informations sur la trace de la pile

Dans /logs, je vois une erreur avec le titre :

Job exception : :arguments expected to be an Array of individual string args

et la trace de la pile :

/opt/bitnami/discourse/vendor/bundle/ruby/2.7.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/sendmail.rb:53:in `initialize' /opt/bitnami/discourse/vendor/bundle/ruby/2.7.0/bundler/gems/mail-5b700fc95ee6/lib/mail/message.rb:278:in `new'
/opt/bitnami/discourse/vendor/bundle/ruby/2.7.0/bundler/gems/mail-5b700fc95ee6/lib/mail/message.rb:278:in `delivery_method' actionmailer-6.1.3.2/lib/action_mailer/delivery_methods.rb:65:in `wrap_delivery_behavior'
actionmailer-6.1.3.2/lib/action_mailer/delivery_methods.rb:79:in `wrap_delivery_behavior!' actionmailer-6.1.3.2/lib/action_mailer/base.rb:836:in `mail'
/opt/bitnami/discourse/lib/email/build_email_helper.rb:8:in `build_email' /opt/bitnami/discourse/app/mailers/download_backup_mailer.rb:7:in `send_email'
actionpack-6.1.3.2/lib/abstract_controller/base.rb:228:in `process_action' actionpack-6.1.3.2/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport-6.1.3.2/lib/active_support/callbacks.rb:98:in `run_callbacks' actionpack-6.1.3.2/lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack-6.1.3.2/lib/abstract_controller/base.rb:165:in `process' actionmailer-6.1.3.2/lib/action_mailer/rescuable.rb:25:in `block in process'
actionmailer-6.1.3.2/lib/action_mailer/rescuable.rb:17:in `handle_exceptions' actionmailer-6.1.3.2/lib/action_mailer/rescuable.rb:24:in `process'
actionview-6.1.3.2/lib/action_view/rendering.rb:39:in `process' actionmailer-6.1.3.2/lib/action_mailer/base.rb:615:in `block in process'
activesupport-6.1.3.2/lib/active_support/notifications.rb:203:in `block in instrument' activesupport-6.1.3.2/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-6.1.3.2/lib/active_support/notifications.rb:203:in `instrument' actionmailer-6.1.3.2/lib/action_mailer/base.rb:614:in `process'
actionmailer-6.1.3.2/lib/action_mailer/message_delivery.rb:128:in `block in processed_mailer' actionmailer-6.1.3.2/lib/action_mailer/message_delivery.rb:127:in `tap'
actionmailer-6.1.3.2/lib/action_mailer/message_delivery.rb:127:in `processed_mailer' actionmailer-6.1.3.2/lib/action_mailer/message_delivery.rb:30:in `getobj'
/opt/bitnami/ruby/lib/ruby/2.7.0/delegate.rb:80:in `method_missing' /opt/bitnami/discourse/lib/email/sender.rb:44:in `send'
/opt/bitnami/discourse/app/jobs/regular/download_backup_email.rb:21:in `execute' /opt/bitnami/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/opt/bitnami/discourse/lib/rails_multisite/connection_management.rb:80:in `with_connection' /opt/bitnami/discourse/app/jobs/base.rb:221:in `block in perform'
/opt/bitnami/discourse/app/jobs/base.rb:217:in `each' /opt/bitnami/discourse/app/jobs/base.rb:217:in `perform'
sidekiq-6.2.1/lib/sidekiq/processor.rb:196:in `execute_job' sidekiq-6.2.1/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:138:in `block in invoke' /opt/bitnami/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:140:in `block in invoke' sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.2.1/lib/sidekiq/processor.rb:163:in `block in process' sidekiq-6.2.1/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/job_retry.rb:112:in `local' sidekiq-6.2.1/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/rails.rb:14:in `block in call' activesupport-6.1.3.2/lib/active_support/execution_wrapper.rb:88:in `wrap'
activesupport-6.1.3.2/lib/active_support/reloader.rb:72:in `block in wrap' activesupport-6.1.3.2/lib/active_support/execution_wrapper.rb:88:in `wrap'
activesupport-6.1.3.2/lib/active_support/reloader.rb:71:in `wrap' sidekiq-6.2.1/lib/sidekiq/rails.rb:13:in `call'
sidekiq-6.2.1/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch' sidekiq-6.2.1/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.2.1/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch' sidekiq-6.2.1/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.2.1/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch' sidekiq-6.2.1/lib/sidekiq/job_retry.rb:79:in `global'
sidekiq-6.2.1/lib/sidekiq/processor.rb:124:in `block in dispatch' sidekiq-6.2.1/lib/sidekiq/logger.rb:11:in `with'
sidekiq-6.2.1/lib/sidekiq/job_logger.rb:33:in `prepare' sidekiq-6.2.1/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.2.1/lib/sidekiq/processor.rb:162:in `process' sidekiq-6.2.1/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.2.1/lib/sidekiq/processor.rb:68:in `run' sidekiq-6.2.1/lib/sidekiq/util.rb:43:in `watchdog'
sidekiq-6.2.1/lib/sidekiq/util.rb:52:in `block in safe_thread'

Code pertinent (mail/network/delivery_methods/sendmail.rb)

#   Mail.defaults do
  #     delivery_method :sendmail, :location => '/absolute/path/to/your/sendmail'
  #   end
  #
  # Then just deliver the email as normal:
  #
  #   Mail.deliver do
  #     to 'mikel@test.lindsaar.net'
  #     from 'ada@test.lindsaar.net'
  #     subject 'testing sendmail'
  #     body 'testing sendmail'
  #   end
  #
  # Or by calling deliver on a Mail message
  #
  #   mail = Mail.new do
  #     to 'mikel@test.lindsaar.net'
  #     from 'ada@test.lindsaar.net'
  #     subject 'testing sendmail'
  #     body 'testing sendmail'
  #   end
  #
  #   mail.deliver!
  class Sendmail
    DEFAULTS = {
      :location   => '/usr/sbin/sendmail',
      :arguments  => %w[ -i ]
    }

    attr_accessor :settings

    class DeliveryError < StandardError
    end

    def initialize(values)

      self.settings = self.class::DEFAULTS.merge(values)
      raise ArgumentError, ":arguments expected to be an Array of individual string args" if settings[:arguments].is_a?(String)
    end

C’est la méthode initialize qui lève l’exception.

Je l’ai corrigé en définissant également les paramètres SMTP pour Sidekiq

Dans /opt/bitnami/scripts/discourse-env.sh
ceux-ci sont exportés

DISCOURSE_SMTP_HOST
DISCOURSE_SMTP_ADDRESS
DISCOURSE_SMTP_PORT_NUMBER
DISCOURSE_SMTP_USER
DISCOURSE_SMTP_USER_NAME
DISCOURSE_SMTP_PASSWORD

Mais Sidekiq s’attendait à ce que les paramètres n’aient pas le préfixe DISCOURSE_.
L’ajout des éléments suivants a donc résolu le problème :

export SMTP_HOST=“xxx”
export SMTP_ADDRESS=“xx”
export SMTP_PORT_NUMBER=“587”
export SMTP_USER=“xxx”
export SMTP_USER_NAME=“xxx”
export SMTP_PASSWORD=“xxx”

Je reçois cette erreur lors de l’envoi d’un e-mail de test. J’ai essayé d’ajouter les détails smtp dans sidekiq. Remarque : j’ai déployé cela sur k8s. Je suis sur la version 3.0.6