Change staff email address from console

We recently introduced a security change: When a staff user changes their email address, for enhanced security they must confirm both new email address AND old email address.

However, this creates a problem when a staff member loses access to their old email address and wants to update their email address.

In this guide we’ll change the email address of a user (not necessarily staff) via console without the need to access old email address. Let’s get started!

Access Console

Connect to your Droplet via SSH, or use Putty on Windows:

ssh root@192.168.1.1

Replace 192.168.1.1 with the IP address of your Droplet.

Switch to your Discourse folder:

cd /var/discourse

Enter the container:

./launcher enter app
# or
./launcher ssh app

Access Rails Console:

rails c

Change Email Address

Run these commands from console:

u = User.find_by_username("YOUR_USERNAME")
u.email = "YOUR_NEW_EMAIL_ADDRESS"
u.email_tokens.create(email: u.email)
u.activate
u.save!

That’s it, your email address is updated, and you should be able to login with your new email.

24 Likes

Thanks a lot for help

Guys does it still work in Discourse instace from March 2019?

It should. Do you have reason to believe otherwise?

It works! I’ve just ask before checking (mea culpa) thinking that maybe from security reasons it was turned off or database schema has been change or something.

2 Likes

This no longer will work due to Discourse changes.

NoMethodError: undefined method `email=' for #<User::ActiveRecord_Relation:0x000055f706dc8fb8>

This is untested (I’m solving a different related problem) but I think something like this might point in the right direction:

u = User.find_by_username("YOUR_USERNAME")
UserEmail.where(user_id: u.id).each() do |e|
    e.email = "YOUR_NEW_EMAIL_ADDRESS"
    u.email_tokens.create(email: e.email)
    e.save!
end
u.activate
u.save!

I welcome correction.

2 Likes