你查看过数据库吗?针对这个问题的直觉是,出于某种原因,email 字段在那里没有正确创建,因此无法读取。
请查看主贴(OP)中的第 2.3 节,以检查索引数据库。
你查看过数据库吗?针对这个问题的直觉是,出于某种原因,email 字段在那里没有正确创建,因此无法读取。
请查看主贴(OP)中的第 2.3 节,以检查索引数据库。
我考虑导入 Discourse 的 Mailman 2 列表在其存在期间(部分时间)将 from_is_list 设置为“混淆发件人”(Munge From),因此“From:”头部显示为:
From: 列表名称 <listname-bounces@listdomain.com> 代表 [原始发件人姓名]
而不是:
From: [原始发件人姓名] <username@example.com>
这让我以为导入程序会将这些消息都视为来自同一用户(邮箱地址为 listname-bounces@listdomain.com)……但是……
mbox 文件中标记新邮件开始的初始行仍然以以下格式开头:
From username@example.com [日期时间组]
(Hyperkitty 归档中也正常显示了原始发件人的邮箱地址。)
所以我的问题是——导入脚本是从“From:”头部还是从“From ”行获取发件人地址?谢谢。
我曾在之前的主题中简要讨论过这个问题:Working on a mailman2 to discourse migration script - #10 by dachary
它使用的是 From: 头部。
感谢您的快速回复!修改这个会有多难?不一定非要官方支持——虽然这样或许能帮到其他人——但我只是想自己在运行脚本前修改它。我还不会 Ruby(暂时不会!),但如果只是把冒号改成空格……
这并非一个简单的改动,但应该是可行的。你不必非要在导入脚本中实现它。如果你熟悉其他脚本语言,我相信在运行导入之前更新 mbox 文件中的 From: 头不会太难……
不过,如果你选择在导入脚本中修复,也完全没问题。欢迎提交 PR!
修复该头部的良好切入点应该是 each_mail 方法……
干杯。看来目前决定这一点的是 indexer.rb 的第 69-70 行:
parsed_email = receiver.mail
from_email, from_display_name = receiver.parse_from_field(parsed_email)
在那一点上,是否有可能从 parsed_email 中获取 mbox 邮件的第一行(即“发件人 [邮箱地址] [日期时间]”这一行),并从中提取邮箱地址?
不,当 mbox 被拆分为单封邮件时,该行会被过滤掉。你需要在 each_mail 方法中保存该值,以便后续使用。
我试着做这件事时还挺有趣的,后来才发现 Mailman 将邮件以原始、未经修改的形式存储在 mbox 中,因此无论邮件是否从“From: listname-bounces@listname.domain.com”发送,“From:”行中的邮箱地址在所有情况下都与“From ”行中的(原始发件人)邮箱地址相同。![]()
由于没有 Discourse 的开发环境,甚至没有安装 Ruby,我的进展受到了一定限制,但我还是借助 https://rubular.com/、https://replit.com/languages/ruby 以及 DuckDuckGo 取得了一些进展。如果您愿意帮忙看看,我将不胜感激,希望能得知如果确实需要的话,这段代码是否能够(或几乎能够)正常工作……
def each_mail(filename)
raw_message = +''
first_line_number = 1
last_line_number = 0
each_line(filename) do |line|
if line.scrub =~ @split_regex
if last_line_number > 0
# 现在到了下一封邮件的开头
yield raw_message, first_line_number, last_line_number
raw_message = +''
first_line_number = last_line_number + 1
else
# 现在到了当前这封邮件的开头,因此获取邮箱地址
new_email = line.match(/^From (\S+@\S+).*/).captures
end
else
raw_message << line
end
last_line_number += 1
end
# 获取旧邮箱("From:" 行)
old_email = raw_message.match(/^From: .*\u003c(\S+@\S+)\u003e/).captures
# 将 "From " 地址放入 "From:" 行
raw_message = raw_message.sub(old_email, new_email)
yield raw_message, first_line_number, last_line_number if raw_message.present?
end
嗯,姑且说是“几乎”吧……![]()
成功导入邮件归档(mbox)后,消息内容中将显示原本被 Gmane 或 mailman2 归档服务器混淆的电子邮件地址。这使得收集地址的机器人能够抓取这些信息,我正在寻找一种方法来避免这种情况。
提前感谢您的帮助!
这是二选一的关系吗?
当我尝试将 MM2 的 mbox 导入到 MM3 时,大约四分之一的邮件变成了“孤儿”(回复被错误地视为新线程的开端),因为它们缺少正确的头信息。MM2 中的 Pipermail 可以根据“主题”(Subject)来组织归档(如果没有 Message-ID 或其他某个我记不清的头信息),但据我上次检查,MM3 中的 Postorius 会忽略“主题”。因此,理想情况下,您的脚本能像 Pipermail 一样工作,这样在我的邮件列表上就能大部分正确处理 ![]()
另外——如果邮件像上面提到的那样杂乱无章地导入,Discourse 有什么方法可以修复吗?还是唯一的办法是尝试 index_only,然后要么给 mbox 文件添加头信息,要么按照下面引用的帖子建议重新调整 index.db?
谢谢。
是的,确实如此。
基本上没有。不过,你可以移动帖子,但即使借助自动化工具,这也相当繁琐。
我认为这是解决你问题的最佳方案,除非你愿意修改导入脚本,并添加某种混合模式,以便在缺少 Message-ID 时,根据主题行进行分组。
从 Google Groups 导入功能目前无法使用,因为 Google 更改了其界面,并移除了他们在 2015 年已弃用的 AJAX 爬取方案。
有人成功使用 Google Takeout 导出 mbox 文件了吗?
您好,
我们如何使用此方法将 Google 群组导入到 SaaS 版 Discourse,而不是本地部署版本?
如果您支付一年的企业托管费用,他们将免费为您处理。否则,您需要自行在服务器上操作,将备份上传到您的实例,并联系支持团队请求恢复。
Google 群组脚本在设置身份验证时可能较为棘手。上次我使用时,不得不调整登录端点才能使其正常工作。
您还记得之前为了让登录功能正常工作所做的修改吗?即使我使用了初始步骤中提到的相同扩展程序来生成 cookies 文件,仍然收到以下错误。顺便提一下,我正在操作的是一个私有域名组。
正在登录...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options 作为驱动程序初始化的参数已弃用。如有必要,请使用 :capabilities 并传入值 capabilities/options 的数组。
调用堆栈跟踪(最近一次调用在最后):
31: 来自 script/import_scripts/google_groups.rb:293:in `\u003cmain\u003e'
30: 来自 script/import_scripts/google_groups.rb:237:in `crawl'
29: 来自 script/import_scripts/google_groups.rb:181:in `login'
28: 来自 script/import_scripts/google_groups.rb:196:in `add_cookies'
27: 来自 script/import_scripts/google_groups.rb:196:in `each'
26: 来自 script/import_scripts/google_groups.rb:200:in `block in add_cookies'
25: 来自 /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/common/manager.rb:61:in `add_cookie'
24: 来自 /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/remote/bridge.rb:349:in `add_cookie'
#0 0x557491640f93 \u003cunknown\u003e: 无效的 cookie 域名:Cookie 'domain' 不匹配 (Selenium::WebDriver::Error::InvalidCookieDomainError)
很抱歉,仅修复登录是不够的。
最近的重新设计修复了任何问题吗?
不,除非他们在过去25天内重新添加了该功能。我认为他们不会这么做,因此该爬虫需要进行彻底的重构。