Tenho um arquivo CSV com os e-mails dos meus usuários do Discourse. Preciso criar um script que será executado diariamente e enviará um modelo de e-mail específico para um conjunto específico de usuários. Então, todos os dias, preciso executar este script com o próximo conjunto de usuários. Como posso fazer isso?
De acordo com https://ask.discourse.com/, preciso criar meu código para automatizar isso e colocar o código e os dados na pasta plugins. A sugestão de código está aqui:
# frozen_string_literal: true
# name: auto-email
# about: Um plugin personalizado para enviar e-mails em massa usando automação e arquivos CSV
# version: 0.3
require 'csv'
after_initialize do
if defined?(DiscourseAutomation)
# Define um scriptable exclusivo para a automação
DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT = "auto_email_script"
add_automation_scriptable(DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT) do
# Define campos para a interface de usuário de automação:
field :email_template, component: :message # Corpo do e-mail a ser enviado
field :csv_file_name, component: :text # Nome do arquivo CSV na pasta "data"
script do |context, fields, automation|
# Define o caminho para a pasta de dados
data_folder_path = Rails.root.join("plugins", "auto-email", "data")
# Obtém o nome do arquivo CSV do campo de automação do administrador
csv_file_name = fields["csv_file_name"]["value"]
csv_file_path = File.join(data_folder_path, csv_file_name)
# Garante que o arquivo exista
unless File.exist?(csv_file_path)
Rails.logger.warn("Arquivo CSV #{csv_file_path} não encontrado!")
next
end
# Analisa o arquivo CSV
begin
users = CSV.read(csv_file_path, headers: true).map(&:to_hash)
rescue StandardError => e
Rails.logger.error("Erro ao ler o arquivo CSV (#{csv_file_name}): #{e.message}")
next
end
# Obtém o conteúdo da mensagem de e-mail do campo de automação
email_body = fields["email_template"]["value"]
# Itera sobre os usuários do CSV e envia e-mails
users.each do |user_data|
email = user_data["email"] || user_data["normalized_email"]
user = User.find_by_email(email)
if user
begin
# Envia um e-mail automatizado usando SystemMessage
SystemMessage.new(user).send_email(
"custom_email_template", # Garanta que este modelo de e-mail exista
message_body: email_body
)
Rails.logger.info("E-mail enviado para: #{email}")
rescue StandardError => e
Rails.logger.error("Falha ao enviar e-mail para #{email}: #{e.message}")
end
else
Rails.logger.warn("Nenhum usuário encontrado com o e-mail: #{email}")
end
end
end
end
end
end
E minha estrutura de plugin é assim:
/var/discourse/plugins/auto-email/
├── README.rb
├── data/
├── mamapedia_users_data_01.csv
├── lib/
├── plugin.rb
No entanto, quando reinicio ou reconstruo o aplicativo, não vejo o novo plugin no painel de administração. Não vejo nenhum erro nos logs.
O que estou fazendo de errado? Preciso fazer mais alguma coisa?