Module: TempmailSdk::Providers::Inboxes

Defined in:
lib/tempmail_sdk/providers/inboxes.rb

Overview

inboxes.com 渠道实现

Constant Summary collapse

CHANNEL =
"inboxes"
API_BASE =
"https://inboxes.com/api/v2"
DEFAULT_DOMAIN =
"blondmail.com"
HEADERS =
{
  "Accept" => "application/json",
  "Origin" => "https://inboxes.com",
  "Referer" => "https://inboxes.com/",
  "User-Agent" => "Mozilla/5.0"
}.freeze

Class Method Summary collapse

Class Method Details

.fetch_detail(uid) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 70

def fetch_detail(uid)
  return nil if uid.to_s.strip.empty?

  begin
    resp = Http.get(
      "#{API_BASE}/message/#{URI.encode_www_form_component(uid)}",
      headers: HEADERS, timeout: 15
    )
    return nil unless resp.ok?

    data = resp.json
    data.is_a?(Hash) ? data : nil
  rescue StandardError
    nil
  end
end

.flatten(raw, recipient) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 47

def flatten(raw, recipient)
  {
    "id" => (raw["uid"] || "").to_s,
    "from" => (raw["sf"] || raw["f"] || "").to_s,
    "to" => (raw["ib"] || recipient).to_s,
    "subject" => (raw["s"] || "").to_s,
    "text" => (raw["text"] || "").to_s,
    "html" => (raw["html"] || "").to_s,
    "preview_text" => (raw["ph"] || "").to_s,
    "date" => (raw["cr"] || "").to_s,
    "isRead" => !!raw["ru"],
    "attachments" => raw["at"].is_a?(Array) ? raw["at"] : []
  }
end

.generate_email(domain = nil) ⇒ EmailInfo

Parameters:

  • domain (String, nil) (defaults to: nil)

    可选指定域名

Returns:



64
65
66
67
68
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 64

def generate_email(domain = nil)
  domains = get_domains
  selected = pick_domain(domains, domain)
  EmailInfo.new(channel: CHANNEL, email: "#{random_local}@#{selected}")
end

.get_domainsObject

获取可用域名列表



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 25

def get_domains
  resp = Http.get("#{API_BASE}/domain", headers: HEADERS, timeout: 15)
  resp.raise_for_status
  data = resp.json
  items = data.is_a?(Hash) ? (data["domains"] || []) : []
  domains = items.select { |i| i.is_a?(Hash) && !i["qdn"].to_s.strip.empty? }
                 .map { |i| i["qdn"].to_s.strip }
  raise "inboxes: no domains" if domains.empty?

  domains
end

.get_emails(email) ⇒ Array<Email>

Parameters:

  • email (String)

Returns:



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 89

def get_emails(email)
  address = email.to_s.strip
  raise "inboxes: empty email" if address.empty?

  resp = Http.get(
    "#{API_BASE}/inbox/#{URI.encode_www_form_component(address)}",
    headers: HEADERS, timeout: 15
  )
  resp.raise_for_status
  data = resp.json
  rows = data.is_a?(Hash) ? (data["msgs"] || []) : []
  return [] unless rows.is_a?(Array)

  rows.select { |r| r.is_a?(Hash) }.map do |row|
    uid = (row["uid"] || "").to_s.strip
    detail = uid.empty? ? nil : fetch_detail(uid)
    Normalize.normalize_email(flatten(detail || row, address), address)
  end
end

.pick_domain(domains, preferred) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 37

def pick_domain(domains, preferred)
  wanted = preferred.to_s.strip.delete_prefix("@").downcase
  unless wanted.empty?
    domains.each { |d| return d if d.downcase == wanted }
  end
  return DEFAULT_DOMAIN if domains.include?(DEFAULT_DOMAIN)

  domains.first
end

.random_localObject



19
20
21
22
# File 'lib/tempmail_sdk/providers/inboxes.rb', line 19

def random_local
  chars = "abcdefghijklmnopqrstuvwxyz0123456789".chars
  "sdk" + Array.new(16) { chars.sample }.join
end