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!

:information_source:These commands can also be used to force a change in a user’s email address and override the need for them to confirm by clicking on the validation email

Access Console

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

ssh root@

Replace 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

To personalise these for your user, input your stuff here:


Run these commands (each on a separate line)

u = User.find_by_id(=UserID=)


u = User.find_by_username("=Username=") = "=EMAIL="

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


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.


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: do |e| = "YOUR_NEW_EMAIL_ADDRESS"

I welcome correction.


Are these lines necessary? They seem to throw up errors for me, but the user’s email changes just fine.

[4] pry(main)> u.activate
ActiveRecord::RecordInvalid: Validation failed: Primary email has already been taken
from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord- `raise_validation_error'

[5] pry(main)>!
ActiveRecord::RecordInvalid: Validation failed: Primary email has already been taken
from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord- `raise_validation_error'