Canapin
(Coin-coin le Canapin)
10월 20, 2020, 7:46오후
1
안녕하세요!
저희 포럼에는 더 이상 작동하지 않는 특정 이메일 도메인을 가진 대량의 가져온(imported) 사용자들이 있습니다.
수천 명의 사용자가 이러한 이메일 주소를 가지고 있습니다.
지금까지는 문제가 없었지만, suppress digest email after days 값을 증가시켰고, 그 결과 포럼에서 많은 다이제스트 이메일을 발송하게 되었습니다. 여기에는 작동하지 않는 이메일 도메인을 가진 많은 사용자들도 포함되어 있었습니다.
이로 인해 바운스(bounce)가 너무 많이 발생하여 Mailgun이 저희 도메인을 비활성화했습니다.
이 문제를 방지하고 해결하기 위해 이러한 계정들에 대해 어떻게 해야 할까요? 이 계정 중 많은 부분이 아직 포럼에 복귀하지 않은 합법적인 사용자들의 것이므로, 반드시 방치된 계정이라고 볼 수는 없습니다.
이 문제로 인해 문제가 해결될 때까지 사용자들은 포럼에 가입할 수 없습니다.
Canapin
(Coin-coin le Canapin)
10월 20, 2020, 8:04오후
3
왜인지 모르겠지만 검색으로 이 주제를 찾지 못했어요… 아마도 당황했던 것 같아요!
빠른 답변 정말 감사합니다!
pfaffman
(Jay Pfaffman)
10월 20, 2020, 8:20오후
4
하지만 bademail.domain와 같은 이메일 주소가 수천 개 있다면, 다음과 같은 작업을 수행하는 것이 더 적합할 수 있습니다.
rake posts:remap['bademail.domain', 'no-email.invalid']
이는 https://meta.discourse.org/t/replace-a-string-in-all-posts/48729에서 설명된 내용입니다. 이렇게 하면 해당 이메일 주소 모두에 대해 Discourse가 더 이상 메일을 보내지 않게 됩니다. 또 다른 좋은 해결책은 다음과 같은 코드를 사용하여 알려진 잘못된 이메일 주소를 가진 모든 사용자를 비활성화하는 것입니다.
bad=User.find_by_email <모든 사용자를 검색하는 쿼리>
bad.update_all(active: false)
첫 번째 부분의 정확한 작성 방법은 바로 떠오르지 않지만, 충분히 쉽게 알아낼 수 있을 것입니다.
Canapin
(Coin-coin le Canapin)
10월 20, 2020, 9:07오후
5
네, 이 이메일 도메인을 제거하기 위해 이렇게 해볼까 하고 생각했습니다.
Discourse 메서드가 @no-email.invalid 이메일을 생성하는 것을 확인했습니다:
Invite
.with_deleted
.where(invited_by_id: @source_user.id)
.update_all(invited_by_id: @target_user.id)
Invite
.with_deleted
.where(deleted_by_id: @source_user.id)
.update_all(deleted_by_id: @target_user.id)
McpAuditLog.where(user_id: @source_user.id).update_all(user_id: @target_user.id)
McpOauthAuthorization.where(revoked_by_user_id: @source_user.id).update_all(
revoked_by_user_id: @target_user.id,
)
update_user_id(:muted_users, conditions: "x.muted_user_id = y.muted_user_id")
update_user_id(
:muted_users,
user_id_column_name: "muted_user_id",
conditions: "x.user_id = y.user_id",
)
그리고 임포터 베이스에서는 @email.invalid을 사용하는데, 약간 다릅니다:
def update_category_featured_topics
puts "", "Updating featured topics in categories"
count = 0
total = Category.count
Category.find_each do |category|
CategoryFeaturedTopic.feature_topics_for(category)
print_status(count += 1, total, get_start_time("category_featured_topics"))
end
end
def update_tl0
puts "", "Setting users with no posts to trust level 0"
count = 0
total = User.count
User
.includes(:user_stat)
Discourse가 이메일을 보내야 할 때 이 두 개의 다른 "더미 도메인"이 모두 무시됩니까?
작동하지 않는 도메인을 @no-email.invalid 또는 @email.invalid로 교체해야 하나요, 아니면 상관없나요?
@pfaffman , 왜 게시물 에서 리매핑해야 사용자 이메일 을 변경하는 것보다 나은지 이해가 잘 안 됩니다… 이 이메일 주소는 게시물에 없는데, 제가 무언가를 놓치고 있는 건지 모르겠습니다.
만약 이것이 권장되는 방법이라면, 각 프로필의 @brokendomains.com 주소를 @no-email.invalid 또는 @email.invalid로만 교체하고 싶습니다. 어떻게 해야 하는지는 알아낼 수 있으니, 어떤 “가짜” 도메인을 사용해야 하는지 궁금할 뿐입니다.
pfaffman
(Jay Pfaffman)
10월 20, 2020, 9:24오후
6
posts:remap이 모든 테이블에 걸쳐 해당 도메인을 리맵하는 것으로 꽤 확신합니다. 하지만 어떤 클래스에 넣어두어야 했기 때문이죠.
UserEmails 테이블(또는 그 이름이 무엇이든)에 직접 대체 코드를 작성하는 것도 방법입니다.
whatever.invalid이 The World에 해당 주소가 잘못된 주소임을 알리고, 전송을 시도하지 않을 것으로 꽤 확신합니다.
Canapin
(Coin-coin le Canapin)
10월 20, 2020, 9:25오후
7
좋네요. 그러면 이 코드가 작동할까요?
User.find_each do |u|
if u.email.include? "@brokendomain.com"
u.update(email: SecureRandom.hex + "@email.invalid")
end
end
pfaffman
(Jay Pfaffman)
10월 20, 2020, 10:12오후
8
나는 이렇게 할 수도 있을 것 같다
UserEmail.where("email like '%@brokendomain.com'").each do |e|
e.update(email: SecureRandom.hex + "@email.invalid)
end
너의 방법도 작동할 수 있지만, 이메일을 다른 모델/테이블로 이동한 후 u.email.include?를 사용할 수 있도록 User 모델이 업데이트되었는지는 확신이 서지 않는다.
Canapin
(Coin-coin le Canapin)
10월 20, 2020, 10:22오후
9
목표 이메일 주소가 반환되는지 확인하려고 내 스크립트를 실행해 봤고, 잘 작동합니다.
모든 사용자를 순회하는 대신 쿼리를 사용해 특정 이메일 도메인을 선택하니까, 당신의 스크립트는 제 것보다 더 빠를 것 같습니다.
도와주셔서 정말 감사합니다
pfaffman
(Jay Pfaffman)
10월 21, 2020, 3:43오후
10
아, 실수했습니다. 제가 의도했던 리맵은 이겁니다. 그냥
discourse remap old new
를 실행하면 됩니다.
Change the domain name or rename your Discourse 를 참고하세요.
위 방법이 작동할 것 같지만, UserEmails 솔루션이 약간 더 나은 해결책일 수 있습니다.
Canapin
(Coin-coin le Canapin)
10월 21, 2020, 3:59오후
11
감사합니다. 제가 사용한 것이 바로 이 방법입니다.
총 17,000명 중 5,000명 이상의 사용자가 해당 이메일 도메인을 사용하고 있었습니다. suppress digest email after days 설정을 늘렸을 때 바운스 수가 많았던 것도 당연하네요…
riking
(Kane York)
10월 27, 2020, 11:05오전
12
.invalid로 끝나는 모든 항목에 대해 Discourse가 적용하는 특별한 처리입니다. .invalid는 예약된 TLD입니다.