Enviar emails de redefinição de senha em massa?

Migrei os usuários do banco de dados do fórum antigo. Existe alguma maneira de enviar e-mails de redefinição de senha em massa? Tentei usar a API, mas recebi a mensagem Você realizou esta ação muitas vezes, tente novamente mais tarde. após solicitar o envio de cerca de 3 redefinições de senha… (outras ações da API funcionam bem)

Ficarei feliz em usar o console Ruby ou a API, se puder me orientar sobre como contornar esse limite de taxa. Provavelmente é um limite por endereço IP, conforme investiguei.

[updated]

Parece que o RateLimiter para ‘forgot_password’ está, infelizmente, hardcoded, então optei pelo caminho de um script Ruby…

Para redefinição em massa (enviando tokens de redefinição de senha para todos os usuários), você pode fazer o seguinte:

cd /var/discourse
./launcher enter app

Em seguida, crie um novo arquivo mass-password-reset.rb usando seu editor favorito com o seguinte script:

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

E então execute-o com rails r mass-password-reset.rb

5 curtidas

Ótimo, obrigado! Recentemente migrei dados do meu fórum antigo e, ao tentar redefinir manualmente as senhas dos meus usuários (não são muitos), encontrei uma mensagem de erro. Os logs do Discourse não mostraram nada, tentei reconstruir o aplicativo, mas não ajudou. Depois tentei seu script e agora, por meio do serviço de envio de e-mails terceirizado (e do Sidekiq), vejo que esses e-mails estão sendo enviados. Então, muito obrigado novamente! :slight_smile:

2 curtidas

Tentei isso, mas o modelo de dados mudou (acho que devido ao e-mail secundário). Os endereços de e-mail agora estão no objeto User Email, creio eu.

2 curtidas

Oi, você conseguiu resolver isso? Eu estava prestes a tentar aquele script, mas vi sua mensagem e agora me pergunto se você conseguiu contornar isso.

Eu acho que a melhor opção ainda é fazer com que eles redefinam a senha através do link de redefinição de senha. Há alguma razão pela qual seu usuário não pode fazer isso?

Não, seria apenas uma questão de experiência do usuário. Estamos migrando nosso antigo fórum vanilla e acho que a melhor experiência para os usuários antigos seria receber um e-mail dizendo “Ei, migramos do nosso fórum para uma nova plataforma. Você pode fazer login através deste link: {link}”.

Só corrigindo aqui - esse script funciona. Eu só precisei:

cd /var/discourse
sudo ./launcher enter app

Então criar o arquivo:

// criar arquivo
touch password.rb

Então adicionar o seguinte código:

email_token = nil

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

E finalmente, executá-lo:

rails r password.rb

Funcionou para mim :slight_smile:.

2 curtidas

Ah, desculpe, eu queria ter voltado a isso ontem quando percebi que você queria fazer um em massa e não um único. Fico feliz que você tenha descoberto. :slight_smile: :+1:

Vou dividir este problema para facilitar a localização em pesquisas futuras. :mag_right:

3 curtidas

Olá, não sei se este ainda é o melhor lugar para perguntar isso, mas você saberia me dizer por quanto tempo o e-mail de redefinição de senha dura? Sei que expira em 3 ou 4 dias, mas preciso saber porque vou convidar meus usuários de um fórum antigo e preciso enviar uma mensagem notificando-os de que o e-mail pode expirar após n dias, então preciso do tempo específico. Obrigado.

Como executamos este comando por usuário ou apenas para uma lista de usuários em um arquivo de texto? Tenho cerca de 8000 usuários para migrar. Estou criando os usuários sem problemas com a API, mas os e-mails não são enviados devido à limitação de taxa codificada. Também defini meu endereço IP para ACEITAR no IP Filtrado, mas ainda não funciona. Isso é algo que só pode ser feito no console do Rails?

Obrigado!

Eu também estaria interessado em adaptar o script acima para enviar para apenas 1 usuário, para que eu possa testá-lo antes de enviá-lo para todos.

Eu acho que usar um script de importação seria uma ideia melhor para criar tantos usuários, mas isso está fora do tópico :upside_down_face:
De qualquer forma, você atingiria o limite de taxa se enviasse o e-mail no script também.

Se você quiser diminuir a velocidade do processo de envio de e-mail, pode adicionar um sleep(x) (x em segundos) no loop ruby, e ele deve ser adaptado aos limites de taxa existentes.

Se você pretende deixar seu script rodando por um tempo, use um gerenciador de sessão como screen ou tmux.

user = User.find_by(username: 'alehandrof')

if user
  email_token = user.email_tokens.create(email: user.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token)
end

Não há necessidade de criar um arquivo Ruby para isso; você pode executá-lo no console Rails (./launcher enter app e depois rails c).

2 curtidas

Obrigado pela ajuda @Canapin!