How can I bulk remap/update user email addresses?

I followed the instructions here to change domain (it worked fine):

The problem is I tried to change my domain from forum.mysite.co to forum.mysite.com.au (all staff members are on user@mysite.com.au email address). The forum migrated fine. But all my staff’s (admin/moderator) login email addresses became user@mysite.com.aum.au !

(I was fortunately spared, as my login was @mysite.co, so it migrated to @mysite.com.au, which also happens to be my email anyway).

What do I do now?

I tried to change everyone’s email directly in admin>user, but the system won’t let me change other people’s email. I was going to ask everyone to try to login with the .com.aum.au email address and change their email, but I realized as part of security measure, a confirmation email is actually sent to .com.aum.au to confirm the change. But obviously any email to .com.aum.au doesn’t get to anybody.

Any suggestions?

EDIT: the affected users can login with username/password. Problem is no way to change the affected email. Since a confirmation email is sent to original (now wrong) email address, which doesn’t get to anyone.

Are you sure this is the actual email or is this a typo? Can we see a screenshot of this in a user profile?

1 Like

@codinghorror It is certainly not a typo. My staffs’ (more than one) email went from user@site.com.au to user@site.com.aum.au

My email went from myemail@site.co to myemail@site.com.au

The domain migration impacts login emails. And since we were trying to migrate from site.co to site.com.au. It ‘replaced’ the string pattern in our login emails.

I can show you screenshots of my other colleague’s profile, but the issue is the same.

@codinghorror the affected users can login with their username/password, the issue is they cannot change the email, as by security design, a confirmation email is sent to the original (now wrong) email address, which is not getting to anyone.

I see then this is an error on our end can you assist @techapj?

2 Likes

Can you please let me know the exact command you ran to remap forum.mysite.co to forum.mysite.com.au ?

I can easily create a new rake task which will batch remap/update user email address from user@mysite.com.aum.au to user@mysite.com.au but first I want to know the root cause of how this happened, to prevent it from happening in future.

2 Likes

Our discourse is hosted on digitalocean. We don’t use CDN, so I basically followed the instructions exactly.

Reading through the instructions again, the only part I could have screwed up is:

I may have typed in

Without the “talk” sub-domain (or in our case “forum” sub-domain). But then again, not everyone puts discourse in a sub-domain, so I would think this is still a bug that could happen to your other customers (and why remap a user’s email?).

Is there a command in ubuntu where I can get command history for that particular command line (after ./launcher enter app)? Then I can confirm this more definitely with you.

Oh, I thought you were a customer, but you aren’t. Yeah, you’ll need to fix the bad mapping command you issued. We can’t help you directly, as you are not on our servers.

1 Like

That is… very risky.

Here is the rake task you can run to fix this issue.

desc 'Batch remap user email address'
task 'users:batch_remap_email', [:find, :replace] => [:environment] do |_,args|
  require 'highline/import'

  find = args[:find]
  replace = args[:replace]
  if !find || !replace
    puts "ERROR: Expecting rake users:batch_remap_email['find','replace']"
    exit 1
  else
    confirm_replace = ask("Are you sure you want to remap all email addresses matching '#{find}' with '#{replace}'? (Y/n)  ")
    exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y')
  end

  puts "Remapping email addresses"
  i = 0
  User.where("email LIKE ?", "%#{find}%").each do |u|
    new_email = u.email.dup
    new_email = new_email.gsub!(/#{Regexp.escape(find)}/, replace) || new_email

    if new_email != u.email
      u.email = new_email
      u.email_tokens.create(email: u.email)
      u.activate
      u.save
      putc "."
      i += 1
    end
  end
  i

  puts "", "#{i} email addresses remapped!", ""
end

If you are unfamiliar with how to use above rake code, here is the rough outline:

  • login on your server

  • cd /var/discourse

  • ./launcher enter app

  • append the above code in /lib/tasks/users.rake file

  • rake users:batch_remap_email['mysite.com.aum.au','mysite.co']

  • remove the code appended in step 4

  • :tada:

7 Likes

To be clear, you meant to write:

Correct? Just wanted to double check to make sure I’m not missing anything. I guess restoring it to mysite.co is fine as well. We have email access to both domains.

Yeah, that was just an example. What you wrote looks good and will fix the issue.

2 Likes

That worked like a charm, you are a life saver.:confetti_ball:

While I have you, quick question - is there any configuration I have to do with mailgun (or mail server equivalent)? Right now the mails are still sent from mailgun with mysite.co email address, rather than from (the newly migrated) mysite.com.au.

I don’t mind if the emails come from mysite.co, I’m more concerned as to whether there are any risk/unintended consequences if the domain names don’t match up between the forum and mailgun.

Thanks for the help, once again.

1 Like

Awesome! :thumbsup:

I think you are looking for notification email site setting. :slight_smile:

3 Likes

Yeah, i guess that’s the question. Under notification email :

[quote]The from: email address used when sending all essential system emails. The domain specified here must have SPF, DKIM and reverse PTR records set correctly for email to arrive.
[/quote]

I’ve specified notification email to be `no-reply@mysite.com.au. But I only have mysite.co (and NOT mysite.com.au) with SPF, DKIM and reverse PTR records set correctly with mailgun.

I’m getting notification emails just fine. I just want to double check and make sure it is ok to leave it as is.