It's not about email being easy. It's that I don't want my email getting out (spam and all that - you send one email to a bad behaving mailing list, and your email is all over the internet forever for spambots to harvest.)
Mailman just replaces @ with "at" which spam harvesters could easily reverse; I made it better for my users; see below.
Kazinator's got your back!
0:webserver:/var/lib/mailman# quilt applied
privacy
pipermail-to-lurker
0:webserver:/var/lib/mailman# cat patches/privacy
Index: mailman/Mailman/Archiver/HyperArch.py
===================================================================
--- mailman.orig/Mailman/Archiver/HyperArch.py 2012-11-29 21:26:57.000000000 -0800
+++ mailman/Mailman/Archiver/HyperArch.py 2012-11-29 22:27:51.000000000 -0800
@@ -93,6 +93,8 @@
True = 1
False = 0
+def hide_domain(s):
+ return re.sub(r'([\w])([-+,.\w]+)([\w])@([\w])([-+.\w]+)([\w])[.]([\w]+)', '\g<1>...\g<3>@\g<4>...\g<6>.\g<7>', s)
def html_quote(s, lang=None):
@@ -281,10 +283,9 @@
try:
i18n.set_language(lang)
if self.author == self.email:
- self.author = self.email = re.sub('@', _(' at '),
- self.email)
+ self.author = self.email = hide_domain(self.email)
else:
- self.email = re.sub('@', _(' at '), self.email)
+ self.email = hide_domain(self.email)
finally:
i18n.set_translation(otrans)
@@ -412,9 +413,7 @@
otrans = i18n.get_translation()
try:
i18n.set_language(self._lang)
- atmark = unicode(_(' at '), Utils.GetCharSet(self._lang))
- subject = re.sub(r'([-+,.\w]+)@([-+.\w]+)',
- '\g<1>' + atmark + '\g<2>', subject)
+ subject = hide_domain(subject)
finally:
i18n.set_translation(otrans)
self.decoded['subject'] = subject
@@ -466,7 +465,7 @@
d["in_reply_to_url"] = url_quote(self._message_id)
if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
# Point the mailto url back to the list
- author = re.sub('@', _(' at '), self.author)
+ author = hide_domain(self.author)
emailurl = self._mlist.GetListEmail()
else:
author = self.author
@@ -574,10 +573,8 @@
if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
otrans = i18n.get_translation()
try:
- atmark = unicode(_(' at '), cset)
i18n.set_language(self._lang)
- body = re.sub(r'([-+,.\w]+)@([-+.\w]+)',
- '\g<1>' + atmark + '\g<2>', body)
+ body = hide_domain(body)
finally:
i18n.set_translation(otrans)
# Return body to character set of article.
@@ -1049,7 +1046,7 @@
author = self.get_header("author", article)
if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
try:
- author = re.sub('@', _(' at '), author)
+ author = hide_domain(author)
except UnicodeError:
# Non-ASCII author contains '@' ... no valid email anyway
pass
@@ -1221,7 +1218,7 @@
text = jr.group(1)
length = len(text)
if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
- text = re.sub('@', atmark, text)
+ text = hide_domain(text)
URL = self.maillist.GetScriptURL(
'listinfo', absolute=1)
else:
Index: mailman/Mailman/Utils.py
===================================================================
--- mailman.orig/Mailman/Utils.py 2012-11-29 21:26:57.000000000 -0800
+++ mailman/Mailman/Utils.py 2012-11-29 21:26:58.000000000 -0800
@@ -438,9 +438,9 @@
When for_text option is set (not default), make a sentence fragment
instead of a token."""
if for_text:
- return addr.replace('@', ' at ')
+ return 'address-hidden'
else:
- return addr.replace('@', '--at--')
+ return 'address-hidden'
def UnobscureEmail(addr):
"""Invert ObscureEmail() conversion."""