مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2025-11-30 21:32:30 +00:00
fix(smtp_server): refactor mx lookups to randomly order mx records with the same priority
closes #1408 closes #1405
هذا الالتزام موجود في:
@@ -19,5 +19,6 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
|
||||
inflect.acronym 'UUID'
|
||||
inflect.acronym 'HTTP'
|
||||
inflect.acronym 'DB'
|
||||
inflect.acronym 'MX'
|
||||
inflect.acronym 'DKIM'
|
||||
end
|
||||
|
||||
@@ -19,12 +19,13 @@ module Postal
|
||||
autoload :MessageInspection
|
||||
autoload :MessageParser
|
||||
autoload :MessageRequeuer
|
||||
autoload :MXLookup
|
||||
autoload :QueryString
|
||||
autoload :RabbitMQ
|
||||
autoload :ReplySeparator
|
||||
autoload :RspecHelpers
|
||||
autoload :SendResult
|
||||
autoload :Sender
|
||||
autoload :SendResult
|
||||
autoload :SMTPSender
|
||||
autoload :SMTPServer
|
||||
autoload :SpamCheck
|
||||
|
||||
34
lib/postal/mx_lookup.rb
Normal file
34
lib/postal/mx_lookup.rb
Normal file
@@ -0,0 +1,34 @@
|
||||
module Postal
|
||||
class MXLookup
|
||||
|
||||
class << self
|
||||
|
||||
def lookup(domain)
|
||||
records = resolve(domain)
|
||||
records = sort(records)
|
||||
records.map { |m| m[1] }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def sort(records)
|
||||
records.sort do |a, b|
|
||||
if a[0] == b[0]
|
||||
[-1, 1].sample
|
||||
else
|
||||
a[0] <=> b[0]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def resolve(domain)
|
||||
Resolv::DNS.open do |dns|
|
||||
dns.timeouts = [10,5]
|
||||
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map { |m| [m.preference.to_i, m.exchange.to_s] }
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -200,13 +200,9 @@ module Postal
|
||||
|
||||
def servers
|
||||
@options[:servers] || self.class.relay_hosts || @servers ||= begin
|
||||
mx_servers = []
|
||||
Resolv::DNS.open do |dns|
|
||||
dns.timeouts = [10,5]
|
||||
mx_servers = dns.getresources(@domain, Resolv::DNS::Resource::IN::MX).map { |m| [m.preference.to_i, m.exchange.to_s] }.sort.map{ |m| m[1] }
|
||||
if mx_servers.empty?
|
||||
mx_servers = [@domain] # This will be resolved to an A or AAAA record later
|
||||
end
|
||||
mx_servers = MXLookup.lookup(@domain)
|
||||
if mx_servers.empty?
|
||||
mx_servers = [@domain] # This will be resolved to an A or AAAA record later
|
||||
end
|
||||
mx_servers
|
||||
end
|
||||
|
||||
المرجع في مشكلة جديدة
حظر مستخدم