مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2026-01-19 22:29:47 +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 'UUID'
|
||||||
inflect.acronym 'HTTP'
|
inflect.acronym 'HTTP'
|
||||||
inflect.acronym 'DB'
|
inflect.acronym 'DB'
|
||||||
|
inflect.acronym 'MX'
|
||||||
inflect.acronym 'DKIM'
|
inflect.acronym 'DKIM'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,12 +19,13 @@ module Postal
|
|||||||
autoload :MessageInspection
|
autoload :MessageInspection
|
||||||
autoload :MessageParser
|
autoload :MessageParser
|
||||||
autoload :MessageRequeuer
|
autoload :MessageRequeuer
|
||||||
|
autoload :MXLookup
|
||||||
autoload :QueryString
|
autoload :QueryString
|
||||||
autoload :RabbitMQ
|
autoload :RabbitMQ
|
||||||
autoload :ReplySeparator
|
autoload :ReplySeparator
|
||||||
autoload :RspecHelpers
|
autoload :RspecHelpers
|
||||||
autoload :SendResult
|
|
||||||
autoload :Sender
|
autoload :Sender
|
||||||
|
autoload :SendResult
|
||||||
autoload :SMTPSender
|
autoload :SMTPSender
|
||||||
autoload :SMTPServer
|
autoload :SMTPServer
|
||||||
autoload :SpamCheck
|
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
|
def servers
|
||||||
@options[:servers] || self.class.relay_hosts || @servers ||= begin
|
@options[:servers] || self.class.relay_hosts || @servers ||= begin
|
||||||
mx_servers = []
|
mx_servers = MXLookup.lookup(@domain)
|
||||||
Resolv::DNS.open do |dns|
|
if mx_servers.empty?
|
||||||
dns.timeouts = [10,5]
|
mx_servers = [@domain] # This will be resolved to an A or AAAA record later
|
||||||
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
|
|
||||||
end
|
end
|
||||||
mx_servers
|
mx_servers
|
||||||
end
|
end
|
||||||
|
|||||||
المرجع في مشكلة جديدة
حظر مستخدم