过多的用户电子邮件域名无法正常工作导致 Mailgun 域名被禁用:该怎么办?

你好!

我的论坛中有很多导入的用户,他们的邮箱域名已失效。
有数千名用户的邮箱地址属于此类情况。

此前这并非问题,但我最近提高了“抑制摘要邮件的天数”设置,导致论坛发送了大量摘要邮件,其中包括许多发往无效邮箱域的用户。

这引发了大量退信,导致 Mailgun 禁用了我的域名。

我该如何处理这些账户,以防止此类问题并解决当前困境?其中许多账户属于尚未返回论坛的合法用户,并不一定是废弃账户。

由于该问题,用户目前无法在论坛注册,直到问题得到解决。

查看 处理退信

不知为何我用搜索没找到这个主题……我想我当时有点慌了!:sweat_smile:

非常感谢您的快速回复!

但如果有数百万个像 bademail.domain 这样的电子邮件地址,您可能想执行类似以下操作:

rake posts:remap['bademail.domain', 'no-email.invalid']

Replace a string in all posts 中所述。这将使所有此类电子邮件地址无法被 Discourse 发送邮件。另一个不错的解决方案是类似以下操作:

bad=User.find_by_email     <some search that will get them all>
bad.update_all(active: false)

并停用所有已知虚假电子邮件地址的用户。我一时想不起具体如何实现第一部分,但这应该很容易弄清楚。

是的,我考虑过这样做来消除这些电子邮件域名。

我注意到 Discourse 的一个方法会创建 @no-email.invalid 格式的邮箱地址:

而在导入脚本的基础类中,它使用的是 @email.invalid,两者略有不同:

  1. 这两个不同的“虚拟域名”在 Discourse 需要发送邮件时是否都会被忽略?

  2. 我是否应该将我的无效域名替换为 @no-email.invalid@email.invalid,还是说具体用哪个无所谓?

@pfaffman,我不太理解为什么要在帖子中进行重映射,而不是直接修改用户邮箱…… :thinking: 除非我漏掉了什么,否则这些邮箱地址并不出现在帖子中。

如果这是推荐的做法,我只想把每个个人资料中的 @brokendomains.com 地址替换为 @no-email.invalid@email.invalid。我知道该怎么操作,只是不确定该用哪个“假”域名。

我非常确定 posts:remap 会在所有表中对该域名进行重映射,但他们必须将其放在某个类中。

你也可以直接在 UserEmails 表(或该表的实际名称)中编写自己的替换规则。

我非常确定 whatever.invalid 会告知全球系统这是一个无效地址,系统因此不会尝试发送该邮件。

不错。那我想这样应该可以解决问题了?

User.find_each do |u|
	if u.email.include? "@brokendomain.com"
		u.update(email: SecureRandom.hex + "@email.invalid")
	end
end

我觉得我可能可以这样写:

UserEmail.where("email like '%@brokendomain.com'").each do |e|
   e.update(email: SecureRandom.hex + "@email.invalid")
end

你的方案也可能可行,但我不确定在用户邮箱被迁移到另一个模型或表之后,User 模型是否已更新以支持 u.email.include? 这样的操作。

我尝试运行了我的脚本,只是为了看看它是否能返回目标邮箱地址,结果是有效的。

你的脚本应该比我的更快,因为你使用了查询来筛选特定的邮箱域名,而不是遍历所有用户。

非常感谢你的帮助 :+1:

哎呀,这是我原本想发的重映射命令。它只是:

  discourse remap old new

参见 https://meta.discourse.org/t/change-the-domain-name-or-rename-my-discourse/16098。

我认为上述方法应该可行,但 UserEmails 方案可能稍微更好一些。

谢谢。我使用的是这个方案。
在总共 17000 名用户中,有超过 5000 名用户使用了这类邮箱域名。难怪当我增加 抑制摘要邮件的天数 后,退信数量激增……

这是 Discourse 对任何以 .invalid 结尾的内容的特殊处理,.invalid 是一个 保留 顶级域名。