# 混淆 mailto:foo@bar.com 以导入邮件存档

**URL:** https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584
**Category:** Support
**Created:** [2021年六月11日 21:31 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584 "2021-06-11T21:31:00Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![dachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dachary/32/119731_2.png) [@dachary](https://meta.discourse.org/u/dachary)
#### Post date: [2021年六月11日 21:31 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/1 "2021-06-11T21:31:00Z")

</div>

您好，

在成功导入邮件存档（ **mbox** ）后，消息内容中将显示原本被 Gmane 或 mailman2 存档服务器模糊处理的电子邮件地址。这使得收集地址的机器人能够在 Discourse 中抓取这些地址，我正在寻找避免这种情况的方法。

1. 全局移除帖子中的电子邮件（是否可以通过显示插件实现？）
2. 是否存在已具备该功能的站点设置？
3. 其他建议？

提前感谢您的帮助！

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2021年六月11日 21:45 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/2 "2021-06-11T21:45:06Z")

</div>

为什么电子邮件地址会显示在消息内容中？能举个例子吗？

---

<div class="post-metadata">

### Author: ![dachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dachary/32/119731_2.png) [@dachary](https://meta.discourse.org/u/dachary)
#### Post date: [2021年六月11日 21:58 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/3 "2021-06-11T21:58:28Z")

</div>

我会通过私信发送给你公开帖子的链接，以免进一步触发机器人 😛

以下是消息的混淆版本：

> …  
> 2010 年 12 月 23 日 14:05，[已编辑] l \<[已编辑]@gmail.com](mailto:[已编辑]@gmail.com)  
> mailto:[已编辑]@gmail.com 写道：
> 
> 供参考，当有更新时，我是这样处理的  
> …

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2021年六月12日 05:46 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/4 "2021-06-12T05:46:19Z")

</div>

因此，这是导入过程中出现的问题，如果您还有机会，应在导入阶段予以修复。我查看了您的论坛，发现其中充斥着大量损坏的内容（如邮件头、缩进错误），不仅是因为旧邮件未被截断，还因为相互回复的邮件被分到了不同的主题中。

这可能是因为您在导入时启用了 `show_trimmed_content`（[此处](https://github.com/discourse/discourse/blob/master/script/import_scripts/mbox/settings.yml#L33-L34)），或者您的邮件格式未被回复截断代码识别（[此处](https://github.com/discourse/email_reply_trimmer/blob/master/lib/email_reply_trimmer/embedded_email_matcher.rb)）。此外，似乎还存在许多其他问题。

---

<div class="post-metadata">

### Author: ![dachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dachary/32/119731_2.png) [@dachary](https://meta.discourse.org/u/dachary)
#### Post date: [2021年六月12日 06:30 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/5 "2021-06-12T06:30:42Z")

</div>

> [@RGJ](#):
>
> 要么你在导入时启用了 `show_trimmed_content`（[此处](https://github.com/discourse/discourse/blob/master/script/import_scripts/mbox/settings.yml#L33-L34)），要么你的消息格式未被回复修剪代码识别（[此处](https://github.com/discourse/email_reply_trimmer/blob/master/lib/email_reply_trimmer/embedded_email_matcher.rb)）。不过看起来似乎还存在许多其他问题。

猜得不错：我确实将 `show_trimmed_content` 设置为了 `true`，因为回复修剪代码经常修剪得过多。这不仅发生在导入的 mbox 中，通过电子邮件进行的日常回复也会出现这种情况。虽然理论上可以改进修剪器，但这似乎是一场艰难的战斗。使用邮件的用户总会：(i) 出于各种原因发送格式奇怪的邮件，(ii) 期望这些邮件被完整显示。

导入过程中确实存在其他问题：它远非完美。虽然我很乐意讨论这些问题，但它们并非当务之急。

既然看起来我在导入时并没有遗漏任何会混淆电子邮件的选项，那么显然只剩下两个选择：

- 全局替换帖子中的内容，例如使用 `s/{email_regexp}/obfuscated/`
- 寻找或编写一个插件，在 HTML 转换器等环节对显示内容进行混淆，使用 `s/{email_regexp}/obfuscated/`

或者……我是不是方向错了？

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2021年六月12日 07:29 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/6 "2021-06-12T07:29:33Z")

</div>

> [@dachary](#):
>
> 将帖子中的内容全局替换为类似 s/{email\_regexp}/obfuscated/ 的形式

这正是我打算采用的方案。

我将使用 PostgreSQL 的 `regexp_replace` 函数，替换 `posts.raw` 和 `posts.cooked` 中的所有电子邮件地址。

---

<div class="post-metadata">

### Author: ![dachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dachary/32/119731_2.png) [@dachary](https://meta.discourse.org/u/dachary)
#### Post date: [2021年六月12日 07:48 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/7 "2021-06-12T07:48:02Z")

</div>

我会照做，并在此主题中发布操作指南，谢谢你的建议！

---

<div class="post-metadata">

### Author: ![dachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dachary/32/119731_2.png) [@dachary](https://meta.discourse.org/u/dachary)
#### Post date: [2021年六月12日 09:12 UTC](https://meta.discourse.org/t/obfuscating-mailto-foo-bar-com-when-importing-mail-archives/193584/8 "2021-06-12T09:12:36Z")

</div>

## ⚠ 在尝试以下操作前，请务必先备份 Discourse ⚠

以下是将帖子中所有电子邮件地址替换为 **[email\_redacted]** 的方法。该正则表达式较为有限，可能会遗漏一些地址，但我更倾向于使用一个易于阅读和理解的正则表达式，以便在修改所有帖子内容时进行操作。

```plaintext
$ ./launcher enter app
/var/www/discourse# su - postgres -c psql
psql (13.2 (Debian 13.2-1.pgdg100+1))
输入 "help" 以获取帮助。

postgres=# \c discourse
您现在已连接到数据库 "discourse"，用户为 "postgres"。
discourse=# \set re '[0-9a-z._%+-]+@[a-z0-9.-]+\\.[a-z]{2,64}'
discourse=# update posts set raw = regexp_replace(raw, :'re', '[email_redacted]', 'gi') where raw ~ :'re';
UPDATE 1
discourse=# update posts set cooked = regexp_replace(cooked, :'re', '[email_redacted]', 'gi') where cooked ~ :'re';
UPDATE 1

```
