데이터베이스를 확인해 보셨나요? 이 문제에 대해 직감적으로 email 필드가 데이터베이스에서 제대로 생성되지 않아 읽을 수 없는 것 같습니다.
인덱스 데이터베이스를 확인하는 방법은 OP의 2.3절을 참고하세요.
데이터베이스를 확인해 보셨나요? 이 문제에 대해 직감적으로 email 필드가 데이터베이스에서 제대로 생성되지 않아 읽을 수 없는 것 같습니다.
인덱스 데이터베이스를 확인하는 방법은 OP의 2.3절을 참고하세요.
Discourse로 가져오려는 Mailman 2 목록은 존재 기간 중 일부에서 from_is_list가 'Munge From’으로 설정되어 있어, ‘From:’ 헤더가 다음과 같은 형태입니다.
From: Listname <listname-bounces@listdomain.com> On Behalf Of [원본 발신자 이름]
다음과 같은 형태가 아닌 것입니다.
From: [원본 발신자 이름] <username@example.com>
이로 인해 가져오기(importer)가 각 메시지를 동일한 사용자(이메일 주소 listname-bounces@listdomain.com)로부터 온 것처럼 가져오지 않을까 생각했습니다. 하지만…
mbox 파일에서 새 이메일의 시작을 나타내는 첫 번째 줄은 여전히 다음과 같이 시작됩니다.
From username@example.com [날짜 시간 그룹]
(또한 Hyperkitty 아카이브에도 원본 발신자의 이메일 주소가 정상적으로 표시됩니다.)
따라서 질문은 다음과 같습니다. 가져오기 스크립트는 발신자 주소를 ‘From:’ 헤더에서 가져오는지, 아니면 'From ’ 줄에서 가져오는지요? 감사합니다.
이전에 이 주제에 대해 간략히 논의한 적이 있습니다: Working on a mailman2 to discourse migration script - #10 by dachary
From: 헤더를 사용하고 있습니다.
빠른 답변 감사합니다! 이걸 바꾸는 게 얼마나 어려울까요? 공식적으로 바꿀 필요는 없지만, 다른 사람들에게 도움이 될 수도 있고, 아니면 제가 실행하기 전에 스크립트를 직접 수정하는 것만으로도 충분할 것 같습니다. 아직 루비를 알지는 못하지만(아직!) 콜론 하나를 공백으로 바꾸는 것이라면…
단순한 변경 사항은 아니지만, 충분히 가능할 것입니다. 반드시 가져오기(import) 스크립트에서 구현해야 하는 것은 아닙니다. 다른 스크립팅 언어를 알고 계신다면, 가져오기를 실행하기 전에 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 이메일의 첫 번째 줄(즉, “From [이메일 주소] [날짜 시간]” 줄)을 가져와서 그 줄에서 이메일 주소를 추출하는 것이 가능할까요?
아니요, 그 줄은 mbox가 개별 메시지로 분리될 때 필터링됩니다. 나중에 그 값을 사용하려면 each_mail 메서드에서 해당 값을 저장해야 합니다.
이 작업을 시도하면서 꽤 재미를 봤는데, Mailman이 이메일을 mbox에 원본 그대로, 어떤 변형 없이 저장한다는 사실을 발견했습니다. 그래서 “From:” 줄에는 모든 경우에서 "From " 줄과 동일한 (원본 발신자의) 이메일 주소가 포함됩니다. 이메일이 "From: listname-bounces@listname.domain.com"으로 보내진 경우에도 마찬가지입니다. ![]()
개발용 Discourse 설치 환경도, 심지어 Ruby도 없어서 제한이 있었지만, https://rubular.com/ 과 Ruby Online Compiler & Interpreter | Replit (그리고 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: .*<(\S+@\S+)>/).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로 가져올 때, 약 1/4의 이메일이 고아 메일 상태가 되었습니다(답글이 새 스레드의 시작으로 잘못 처리됨). 이는 올바른 헤더가 없었기 때문이었습니다. MM2의 Pipermail은 Subject를 사용하여 아카이브를 구성할 수 있습니다(Message-ID나 다른 헤더 이름이 없는 경우 - 정확한 이름은 기억이 나지 않습니다) 하지만, 마지막으로 확인했을 때 MM3의 Postorius는 Subject를 무시합니다. 따라서 이상적으로는 스크립트가 Pipermail과 동일한 방식으로 동작하여 제 목록에서 대부분 올바르게 처리되기를 바랍니다 ![]()
또한 – 위에서 언급했듯이 이메일이 뒤죽박죽으로 가져와진 경우, Discourse에서 이를 수정할 방법이 있을까요? 아니면 아래 인용된 게시물에서 제안된 대로 index_only를 시도하고 mbox 파일에 헤더를 추가하거나 index.db를 재구성하는 것이 유일한 해결책인가요?
감사합니다.
네, 그렇습니다.
그렇지 않습니다. 물론 게시글을 이동할 수는 있지만, 자동화를 사용하더라도 번거로운 작업입니다.
Message-ID가 없는 경우를 대비하여 Message-ID와 제목을 기준으로 그룹화하는 일종의 하이브리드 모드를 추가하는 작업에 익숙하지 않다면, index_only를 시도하고 mbox 파일에 헤더를 추가하거나 index.db를 재구성하는 것이 문제를 해결하는 가장 좋은 방법이라고 생각합니다.
Google Groups에서 가져오는 기능이 현재 오류가 발생하고 있습니다. Google이 UI를 변경하고 2015년에 이미 비추천으로 표시했던 AJAX 크롤링 방식을 제거했기 때문입니다.
누군가 Google Takeout을 사용하여 mbox 파일을 내보내는 데 성공하신 분이 있으신가요?
안녕하세요,
이 기능을 사용하여 Google Groups를 온프레미스가 아닌 SaaS Discourse에 가져오는 방법은 무엇인가요?
1년치 비즈니스 호스팅을 결제하면 무료로 처리해 줍니다. 그렇지 않으면 자체 서버에서 직접 작업을 수행한 뒤, 백업 파일을 인스턴스에 업로드하고 지원팀에 이메일을 보내 복구를 요청해야 합니다.
Google 그룹 스크립트는 인증을 정확히 설정하는 것이 까다로울 수 있습니다. 마지막으로 사용했을 때에도 로그인 엔드포인트를 조정해야 겨우 작동하게 만들었습니다.
로그인이 작동하도록 한 변경 사항을 기억하시나요? 초기 단계에서 언급된 것과 동일한 확장 프로그램을 사용하여 쿠키 파일을 생성했는데도 불구하고 다음 오류가 발생합니다. 참고로 저는 프라이빗 도메인 그룹(private domain group)으로 작업하고 있습니다.
Logging in...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options as a parameter for driver initialization is deprecated. Use :capabilities with an Array of value capabilities/options if necessary instead.
Traceback (most recent call last):
31: from script/import_scripts/google_groups.rb:293:in `<main>'
30: from script/import_scripts/google_groups.rb:237:in `crawl'
29: from script/import_scripts/google_groups.rb:181:in `login'
28: from script/import_scripts/google_groups.rb:196:in `add_cookies'
27: from script/import_scripts/google_groups.rb:196:in `each'
26: from script/import_scripts/google_groups.rb:200:in `block in add_cookies'
25: from /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: from /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 <unknown>: invalid cookie domain: Cookie 'domain' mismatch (Selenium::WebDriver::Error::InvalidCookieDomainError)
죄송합니다만, 로그인 문제를 해결하는 것만으로는 충분하지 않습니다.
최근의 재설계로 어떤 부분이 개선되었나요?
아니요, 지난 25일 동안 해당 기능이 다시 추가되지 않았다면요. 다시 추가될 것 같지 않으므로 스크레이퍼를 전면적으로 재구성해야 할 것입니다.