1
0
مراية لـ 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
هذا الالتزام موجود في:
Adam Cooke
2021-07-27 14:07:38 +00:00
الأصل fcb63616e1
التزام bc22394fdd
4 ملفات معدلة مع 40 إضافات و8 حذوفات

عرض الملف

@@ -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
عرض الملف

@@ -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