tempmail_sdk 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +116 -0
  3. data/lib/tempmail_sdk/channels.rb +289 -0
  4. data/lib/tempmail_sdk/channels_data.rb +289 -0
  5. data/lib/tempmail_sdk/client.rb +193 -0
  6. data/lib/tempmail_sdk/config.rb +104 -0
  7. data/lib/tempmail_sdk/html_utils.rb +42 -0
  8. data/lib/tempmail_sdk/http.rb +225 -0
  9. data/lib/tempmail_sdk/logger.rb +38 -0
  10. data/lib/tempmail_sdk/normalize.rb +193 -0
  11. data/lib/tempmail_sdk/providers/anonbox.rb +248 -0
  12. data/lib/tempmail_sdk/providers/anonymmail.rb +92 -0
  13. data/lib/tempmail_sdk/providers/byom.rb +48 -0
  14. data/lib/tempmail_sdk/providers/catchmail.rb +110 -0
  15. data/lib/tempmail_sdk/providers/cleantempmail.rb +49 -0
  16. data/lib/tempmail_sdk/providers/devmail_uk.rb +58 -0
  17. data/lib/tempmail_sdk/providers/dropmail.rb +133 -0
  18. data/lib/tempmail_sdk/providers/dropmail_click.rb +81 -0
  19. data/lib/tempmail_sdk/providers/dropmail_me.rb +163 -0
  20. data/lib/tempmail_sdk/providers/duckmail.rb +63 -0
  21. data/lib/tempmail_sdk/providers/eyepaste.rb +119 -0
  22. data/lib/tempmail_sdk/providers/fake_email_site.rb +48 -0
  23. data/lib/tempmail_sdk/providers/fake_legal.rb +109 -0
  24. data/lib/tempmail_sdk/providers/fmail.rb +87 -0
  25. data/lib/tempmail_sdk/providers/freecustom.rb +135 -0
  26. data/lib/tempmail_sdk/providers/getnada.rb +146 -0
  27. data/lib/tempmail_sdk/providers/gonebox_email.rb +89 -0
  28. data/lib/tempmail_sdk/providers/guerrillamail.rb +62 -0
  29. data/lib/tempmail_sdk/providers/guerrillamail_mirrors.rb +81 -0
  30. data/lib/tempmail_sdk/providers/harakirimail.rb +84 -0
  31. data/lib/tempmail_sdk/providers/haribu.rb +176 -0
  32. data/lib/tempmail_sdk/providers/inboxes.rb +110 -0
  33. data/lib/tempmail_sdk/providers/inboxkitten.rb +90 -0
  34. data/lib/tempmail_sdk/providers/linshiyou.rb +157 -0
  35. data/lib/tempmail_sdk/providers/lroid.rb +170 -0
  36. data/lib/tempmail_sdk/providers/m2u.rb +126 -0
  37. data/lib/tempmail_sdk/providers/mail10s.rb +59 -0
  38. data/lib/tempmail_sdk/providers/mail123.rb +82 -0
  39. data/lib/tempmail_sdk/providers/mail_cx.rb +133 -0
  40. data/lib/tempmail_sdk/providers/mail_sunls.rb +68 -0
  41. data/lib/tempmail_sdk/providers/mail_tm.rb +99 -0
  42. data/lib/tempmail_sdk/providers/mailcatch.rb +91 -0
  43. data/lib/tempmail_sdk/providers/maildrop.rb +92 -0
  44. data/lib/tempmail_sdk/providers/maildrop_cc.rb +110 -0
  45. data/lib/tempmail_sdk/providers/mailforspam.rb +96 -0
  46. data/lib/tempmail_sdk/providers/mailhole_de.rb +70 -0
  47. data/lib/tempmail_sdk/providers/mailinator.rb +182 -0
  48. data/lib/tempmail_sdk/providers/mailmomy.rb +108 -0
  49. data/lib/tempmail_sdk/providers/mailnesia.rb +141 -0
  50. data/lib/tempmail_sdk/providers/mffac.rb +101 -0
  51. data/lib/tempmail_sdk/providers/moakt.rb +296 -0
  52. data/lib/tempmail_sdk/providers/neighbours.rb +140 -0
  53. data/lib/tempmail_sdk/providers/neighbours_sh.rb +117 -0
  54. data/lib/tempmail_sdk/providers/nimail.rb +100 -0
  55. data/lib/tempmail_sdk/providers/ockito.rb +163 -0
  56. data/lib/tempmail_sdk/providers/one_sec_mail.rb +46 -0
  57. data/lib/tempmail_sdk/providers/restmail_net.rb +60 -0
  58. data/lib/tempmail_sdk/providers/rootsh.rb +167 -0
  59. data/lib/tempmail_sdk/providers/shitty_email.rb +84 -0
  60. data/lib/tempmail_sdk/providers/smailpro.rb +103 -0
  61. data/lib/tempmail_sdk/providers/ta_easy.rb +53 -0
  62. data/lib/tempmail_sdk/providers/temp_mail_io.rb +67 -0
  63. data/lib/tempmail_sdk/providers/temp_mail_now.rb +103 -0
  64. data/lib/tempmail_sdk/providers/temp_mail_org.rb +89 -0
  65. data/lib/tempmail_sdk/providers/tempemail_co.rb +142 -0
  66. data/lib/tempmail_sdk/providers/tempemail_info.rb +121 -0
  67. data/lib/tempmail_sdk/providers/tempemails_net.rb +159 -0
  68. data/lib/tempmail_sdk/providers/tempfastmail.rb +76 -0
  69. data/lib/tempmail_sdk/providers/tempgmailer.rb +126 -0
  70. data/lib/tempmail_sdk/providers/tempgo_email.rb +74 -0
  71. data/lib/tempmail_sdk/providers/tempinbox.rb +70 -0
  72. data/lib/tempmail_sdk/providers/tempmail.rb +66 -0
  73. data/lib/tempmail_sdk/providers/tempmail365.rb +119 -0
  74. data/lib/tempmail_sdk/providers/tempmail_fish.rb +89 -0
  75. data/lib/tempmail_sdk/providers/tempmail_fyi.rb +124 -0
  76. data/lib/tempmail_sdk/providers/tempmail_lol.rb +42 -0
  77. data/lib/tempmail_sdk/providers/tempmail_lol_v2.rb +57 -0
  78. data/lib/tempmail_sdk/providers/tempmail_plus.rb +80 -0
  79. data/lib/tempmail_sdk/providers/tempmailc.rb +80 -0
  80. data/lib/tempmail_sdk/providers/tempmailpro.rb +89 -0
  81. data/lib/tempmail_sdk/providers/tempmailten.rb +150 -0
  82. data/lib/tempmail_sdk/providers/temporam.rb +95 -0
  83. data/lib/tempmail_sdk/providers/tempp_mails.rb +150 -0
  84. data/lib/tempmail_sdk/providers/tempy_email.rb +73 -0
  85. data/lib/tempmail_sdk/providers/ten_minute_mail_net.rb +125 -0
  86. data/lib/tempmail_sdk/providers/tenminute_one.rb +255 -0
  87. data/lib/tempmail_sdk/providers/throwawaymail.rb +80 -0
  88. data/lib/tempmail_sdk/providers/tmail_link.rb +98 -0
  89. data/lib/tempmail_sdk/providers/uncorreotemporal.rb +84 -0
  90. data/lib/tempmail_sdk/providers/webmailtemp.rb +108 -0
  91. data/lib/tempmail_sdk/providers/xkx_me.rb +125 -0
  92. data/lib/tempmail_sdk/providers/zhujump.rb +256 -0
  93. data/lib/tempmail_sdk/registry.rb +1097 -0
  94. data/lib/tempmail_sdk/retry.rb +91 -0
  95. data/lib/tempmail_sdk/telemetry.rb +134 -0
  96. data/lib/tempmail_sdk/types.rb +164 -0
  97. data/lib/tempmail_sdk/version.rb +6 -0
  98. data/lib/tempmail_sdk/webui.rb +360 -0
  99. data/lib/tempmail_sdk.rb +76 -0
  100. metadata +142 -0
@@ -0,0 +1,289 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # 渠道元数据(有序,权威来源 .channel_meta.json,顺序与 baseline 逐行一致)
4
+ # 每项为 [slug, name, website],注册表按此顺序枚举,顺序为硬约束。
5
+ #
6
+ module TempmailSdk
7
+ # 279 个渠道的有序元数据
8
+ CHANNEL_DATA = [
9
+ ["tempmail", "TempMail", "tempmail.ing"],
10
+ ["tempmail-cn", "TempMail CN", "tempmail.cn"],
11
+ ["ta-easy", "TA Easy", "ta-easy.com"],
12
+ ["10minute-one", "10 Minute Email", "10minutemail.one"],
13
+ ["xghff-com", "xghff.com", "10minutemail.one"],
14
+ ["oqqaj-com", "oqqaj.com", "10minutemail.one"],
15
+ ["psovv-com", "psovv.com", "10minutemail.one"],
16
+ ["dbwot-com", "dbwot.com", "10minutemail.one"],
17
+ ["ygwpr-com", "ygwpr.com", "10minutemail.one"],
18
+ ["imxwe-com", "imxwe.com", "10minutemail.one"],
19
+ ["linshiyou", "临时邮", "linshiyou.com"],
20
+ ["mffac", "MFFAC", "mffac.com"],
21
+ ["tempmail-lol", "TempMail LOL", "tempmail.lol"],
22
+ ["chatgpt-org-uk", "ChatGPT Mail", "mail.chatgpt.org.uk"],
23
+ ["temp-mail-io", "Temp-Mail.io", "temp-mail.io"],
24
+ ["mail-cx", "Mail.cx", "mail.cx"],
25
+ ["ddker-com", "ddker.com", "mail.cx"],
26
+ ["catchmail", "Catchmail", "catchmail.io"],
27
+ ["catchmail-mailistry", "Catchmail Mailistry", "mailistry.com"],
28
+ ["catchmail-zeppost", "Catchmail Zeppost", "zeppost.com"],
29
+ ["mailforspam", "MailForSpam", "mailforspam.com"],
30
+ ["mailforspam-tempmail-io", "MailForSpam TempMail.io", "tempmail.io"],
31
+ ["mailforspam-disposable", "MailForSpam Disposable", "disposable.email"],
32
+ ["tempmailc", "TempMailC", "tempmailc.com"],
33
+ ["mailnesia", "Mailnesia", "mailnesia.com"],
34
+ ["throwawaymail", "ThrowawayMail", "throwawaymail.app"],
35
+ ["tempmail-fish", "TempMail Fish", "tempmail.fish"],
36
+ ["neighbours-sh", "Neighbours", "neighbours.sh"],
37
+ ["shitty-email", "shitty.email", "shitty.email"],
38
+ ["tempmailpro", "TempMail Pro", "tempmailpro.us"],
39
+ ["devmail-uk", "DevMail UK", "devmail.uk"],
40
+ ["inboxkitten", "InboxKitten", "inboxkitten.com"],
41
+ ["cleantempmail", "CleanTempMail", "cleantempmail.com"],
42
+ ["getnada", "GetNada", "getnada.net"],
43
+ ["1vpn-net", "1vpn.net", "getnada.net"],
44
+ ["abematv-com", "abematv.com", "getnada.net"],
45
+ ["abematv-net", "abematv.net", "getnada.net"],
46
+ ["abematv-org", "abematv.org", "getnada.net"],
47
+ ["aceh-cc", "aceh.cc", "getnada.net"],
48
+ ["bangkabelitung-net", "bangkabelitung.net", "getnada.net"],
49
+ ["cctruyen-com", "cctruyen.com", "getnada.net"],
50
+ ["getnada-com", "getnada.com", "getnada.net"],
51
+ ["getnada-email", "getnada.email", "getnada.net"],
52
+ ["getnada-net", "getnada.net", "getnada.net"],
53
+ ["jawatengah-net", "jawatengah.net", "getnada.net"],
54
+ ["jawatimur-net", "jawatimur.net", "getnada.net"],
55
+ ["kalimantanbarat-net", "kalimantanbarat.net", "getnada.net"],
56
+ ["kalimantanselatan-net", "kalimantanselatan.net", "getnada.net"],
57
+ ["kalimantantengah-net", "kalimantantengah.net", "getnada.net"],
58
+ ["kalimantantimur-net", "kalimantantimur.net", "getnada.net"],
59
+ ["kalimantanutara-net", "kalimantanutara.net", "getnada.net"],
60
+ ["kepulauanriau-net", "kepulauanriau.net", "getnada.net"],
61
+ ["luxury345-com", "luxury345.com", "getnada.net"],
62
+ ["malukuutara-net", "malukuutara.net", "getnada.net"],
63
+ ["nusatenggarabarat-net", "nusatenggarabarat.net", "getnada.net"],
64
+ ["nusatenggaratimur-net", "nusatenggaratimur.net", "getnada.net"],
65
+ ["papuabarat-net", "papuabarat.net", "getnada.net"],
66
+ ["papuabaratdaya-net", "papuabaratdaya.net", "getnada.net"],
67
+ ["papuaselatan-net", "papuaselatan.net", "getnada.net"],
68
+ ["pehol-com", "pehol.com", "getnada.net"],
69
+ ["ptruyen-com", "ptruyen.com", "getnada.net"],
70
+ ["pulaubali-net", "pulaubali.net", "getnada.net"],
71
+ ["riau-net", "riau.net", "getnada.net"],
72
+ ["seokey-org", "seokey.org", "getnada.net"],
73
+ ["sulawesibarat-net", "sulawesibarat.net", "getnada.net"],
74
+ ["sulawesiselatan-net", "sulawesiselatan.net", "getnada.net"],
75
+ ["sulawesitengah-net", "sulawesitengah.net", "getnada.net"],
76
+ ["sulawesitenggara-net", "sulawesitenggara.net", "getnada.net"],
77
+ ["sumaterabarat-net", "sumaterabarat.net", "getnada.net"],
78
+ ["sumateraselatan-net", "sumateraselatan.net", "getnada.net"],
79
+ ["sumaterautara-net", "sumaterautara.net", "getnada.net"],
80
+ ["villatogel-com", "villatogel.com", "getnada.net"],
81
+ ["mail123", "Mail123", "mail123.fr"],
82
+ ["mail10s", "Mail10s", "mail10s.com"],
83
+ ["webmailtemp", "WebMailTemp", "webmailtemp.com"],
84
+ ["tempfastmail", "TempFastMail", "tempfastmail.com"],
85
+ ["1sec-mail", "1SecMail", "1sec-mail.com"],
86
+ ["fakemail", "FakeMail", "fakemail.net"],
87
+ ["openinbox", "OpenInbox", "openinbox.io"],
88
+ ["inboxes", "Inboxes", "inboxes.com"],
89
+ ["uncorreotemporal", "UnCorreoTemporal", "uncorreotemporal.com"],
90
+ ["awamail", "AwaMail", "awamail.com"],
91
+ ["mail-tm", "Mail.tm", "mail.tm"],
92
+ ["web-library-net", "web-library.net", "mail.tm"],
93
+ ["dropmail", "DropMail", "dropmail.me"],
94
+ ["guerrillamail", "Guerrilla Mail", "guerrillamail.com"],
95
+ ["guerrillamail-com", "GuerrillaMail Root", "guerrillamail.com"],
96
+ ["maildrop", "Maildrop", "maildrop.cx"],
97
+ ["smail-pw", "Smail.pw", "smail.pw"],
98
+ ["vip-215", "VIP 215", "vip.215.im"],
99
+ ["fake-legal", "Fake Legal", "fake.legal"],
100
+ ["imgui-de", "imgui.de", "fake.legal"],
101
+ ["pulsewebmenu-de", "pulsewebmenu.de", "fake.legal"],
102
+ ["moakt", "Moakt", "moakt.com"],
103
+ ["drmail-in", "drmail.in", "moakt.com"],
104
+ ["teml-net", "teml.net", "moakt.com"],
105
+ ["tmpeml-com", "tmpeml.com", "moakt.com"],
106
+ ["tmpbox-net", "tmpbox.net", "moakt.com"],
107
+ ["moakt-cc", "moakt.cc", "moakt.com"],
108
+ ["disbox-net", "disbox.net", "moakt.com"],
109
+ ["tmpmail-org", "tmpmail.org", "moakt.com"],
110
+ ["tmpmail-net", "tmpmail.net", "moakt.com"],
111
+ ["tmails-net", "tmails.net", "moakt.com"],
112
+ ["disbox-org", "disbox.org", "moakt.com"],
113
+ ["moakt-co", "moakt.co", "moakt.com"],
114
+ ["moakt-ws", "moakt.ws", "moakt.com"],
115
+ ["tmail-ws", "tmail.ws", "moakt.com"],
116
+ ["bareed-ws", "bareed.ws", "moakt.com"],
117
+ ["email10min", "Email10Min", "email10min.com"],
118
+ ["mjj-cm", "MJJ Mail", "mjj.cm"],
119
+ ["linshi-co", "临时Co", "linshi.co"],
120
+ ["harakirimail", "HarakiriMail", "harakirimail.com"],
121
+ ["jqkjqk-xyz", "jqkjqk.xyz", "mail.zhujump.com"],
122
+ ["lyhlevi-com", "LyhLevi MoeMail", "lyhlevi.com"],
123
+ ["tempmail-plus", "TempMail Plus", "tempmail.plus"],
124
+ ["fexpost-com", "fexpost.com", "tempmail.plus"],
125
+ ["fexbox-org", "fexbox.org", "tempmail.plus"],
126
+ ["mailbox-in-ua", "mailbox.in.ua", "tempmail.plus"],
127
+ ["rover-info", "rover.info", "tempmail.plus"],
128
+ ["chitthi-in", "chitthi.in", "tempmail.plus"],
129
+ ["fextemp-com", "fextemp.com", "tempmail.plus"],
130
+ ["any-pink", "any.pink", "tempmail.plus"],
131
+ ["merepost-com", "merepost.com", "tempmail.plus"],
132
+ ["tempmail-lol-v2", "TempMail LOL V2", "tempmail.lol"],
133
+ ["tempgbox", "TempGBox", "tempgbox.net"],
134
+ ["emailnator", "Emailnator", "emailnator.com"],
135
+ ["temporam", "Temporam", "temporam.com"],
136
+ ["neighbours", "Neighbours", "neighbours.sh"],
137
+ ["sharklasers", "SharkLasers", "sharklasers.com"],
138
+ ["sharklasers-com", "SharkLasers Root", "sharklasers.com"],
139
+ ["grr-la", "Grr.la", "grr.la"],
140
+ ["grr-la-com", "Grr.la Root", "grr.la"],
141
+ ["guerrillamail-info", "GuerrillaMail Info", "guerrillamail.info"],
142
+ ["spam4me", "Spam4.me", "spam4.me"],
143
+ ["guerrillamail-net", "GuerrillaMail Net", "guerrillamail.net"],
144
+ ["guerrillamail-org", "GuerrillaMail Org", "guerrillamail.org"],
145
+ ["guerrillamailblock", "GuerrillaMailBlock", "guerrillamailblock.com"],
146
+ ["guerrillamail-com-www", "GuerrillaMail WWW", "guerrillamail.com"],
147
+ ["m2u", "MailToYou", "m2u.io"],
148
+ ["tempy-email", "Tempy Email", "tempy.email"],
149
+ ["fmail", "FMail", "fmail.men"],
150
+ ["ockito", "Ockito", "ockito.com"],
151
+ ["anonbox", "Anonbox", "anonbox.net"],
152
+ ["duckmail", "DuckMail", "duckmail.sbs"],
153
+ ["mailinator", "Mailinator", "mailinator.com"],
154
+ ["tempmail365", "Tempmail365", "https://tempmail365.cn"],
155
+ ["tempinbox", "TempInbox", "https://www.tempinbox.xyz"],
156
+ ["byom", "Byom", "byom.de"],
157
+ ["anonymmail", "AnonymMail", "anonymmail.net"],
158
+ ["eyepaste", "EyePaste", "eyepaste.com"],
159
+ ["mail-sunls", "Mail Sunls", "mail.sunls.de"],
160
+ ["expressinboxhub", "ExpressInboxHub", "expressinboxhub.com"],
161
+ ["lroid", "Lroid", "lroid.com"],
162
+ ["haribu", "Haribu", "haribu.net"],
163
+ ["rootsh", "Rootsh(BccTo)", "rootsh.com"],
164
+ ["fake-email-site", "FakeEmailSite", "fake-email.site"],
165
+ ["mohmal", "Mohmal", "mohmal.com"],
166
+ ["mailgolem", "MailGolem", "mailgolem.com"],
167
+ ["best-temp-mail", "BestTempMail", "best-temp-mail.com"],
168
+ ["disposablemail-app", "DisposableMail", "disposablemail.app"],
169
+ ["mailtemp-cc", "MailTemp.cc", "mailtemp.cc"],
170
+ ["minuteinbox", "MinuteInbox", "minuteinbox.com"],
171
+ ["mailcatch", "MailCatch", "mailcatch.com"],
172
+ ["tempemail-co", "TempEmail.co", "tempemail.co"],
173
+ ["tempemails-net", "TempEmails.net", "tempemails.net"],
174
+ ["altmails", "AltMails", "tempmail.altmails.com"],
175
+ ["tempemail-info", "TempEmailInfo", "tempemail.info"],
176
+ ["smailpro", "SmailPro", "smailpro.com"],
177
+ ["tempmailten", "TempMailTen", "tempmailten.com"],
178
+ ["maildrop-cc", "MailDrop.cc", "maildrop.cc"],
179
+ ["10minutemail-net", "10MinuteMail.net", "10minutemail.net"],
180
+ ["linshiyouxiang-net", "临时邮箱(linshiyouxiang)", "linshiyouxiang.net"],
181
+ ["tempmail-fyi", "Temp-Mail.fyi", "temp-mail.fyi"],
182
+ ["disposablemail-com", "DisposableMail.com", "disposablemail.com"],
183
+ ["tempp-mails", "TemppMails", "tempp-mails.com"],
184
+ ["emailtemp-org", "EmailTemp", "emailtemp.org"],
185
+ ["mytempmail-cc", "MyTempMail.cc", "mytempmail.cc"],
186
+ ["temp-mail-now", "TempMailNow", "temp-mail.now"],
187
+ ["mail-td", "Mail.td", "mail.td"],
188
+ ["mailhole-de", "Mailhole.de", "mailhole.de"],
189
+ ["tmail-link", "TMail.link", "tmail.link"],
190
+ ["24mail-chacuo", "24Mail Chacuo", "24mail.chacuo.net"],
191
+ ["nimail", "NiMail", "nimail.cn"],
192
+ ["freecustom", "FreeCustom.Email", "freecustom.email"],
193
+ ["16888888-cyou", "Mailmomy (16888888.cyou)", "mailmomy.com"],
194
+ ["17666688-shop", "Mailmomy (17666688.shop)", "mailmomy.com"],
195
+ ["282mail-com", "Mailmomy (282mail.com)", "mailmomy.com"],
196
+ ["blackhole-djurby-se", "Mailinator (blackhole.djurby.se)", "mailinator.com"],
197
+ ["block-bdea-cc", "Mailinator (block.bdea.cc)", "mailinator.com"],
198
+ ["bsdu32-buzz", "Mailmomy (bsdu32.buzz)", "mailmomy.com"],
199
+ ["b-smelly-cc", "Mailinator (b.smelly.cc)", "mailinator.com"],
200
+ ["carlton183-changeip-net", "Mailinator (183carlton.changeip.net)", "mailinator.com"],
201
+ ["dea-soon-it", "Mailinator (dea.soon.it)", "mailinator.com"],
202
+ ["disposable-al-sudani-com", "Mailinator (disposable.al-sudani.com)", "mailinator.com"],
203
+ ["disposable-nogonad-nl", "Mailinator (disposable.nogonad.nl)", "mailinator.com"],
204
+ ["doxu243-buzz", "Mailmomy (doxu243.buzz)", "mailmomy.com"],
205
+ ["easyme-pro", "Mailmomy (easyme.pro)", "mailmomy.com"],
206
+ ["ebs-com-ar", "Mailinator (ebs.com.ar)", "mailinator.com"],
207
+ ["etgdev-de", "Mailinator (etgdev.de)", "mailinator.com"],
208
+ ["evergreenco-shop", "Mailmomy (evergreenco.shop)", "mailmomy.com"],
209
+ ["fwd2m-eszett-es", "Mailinator (fwd2m.eszett.es)", "mailinator.com"],
210
+ ["jama-trenet-eu", "Mailinator (jama.trenet.eu)", "mailinator.com"],
211
+ ["j-fairuse-org", "Mailinator (j.fairuse.org)", "mailinator.com"],
212
+ ["layueming-pics", "Mailmomy (layueming.pics)", "mailmomy.com"],
213
+ ["m-887-at", "Mailinator (m.887.at)", "mailinator.com"],
214
+ ["m8r-davidfuhr-de", "Mailinator (m8r.davidfuhr.de)", "mailinator.com"],
215
+ ["m8r-mcasal-com", "Mailinator (m8r.mcasal.com)", "mailinator.com"],
216
+ ["mail-bentrask-com", "Mailinator (mail.bentrask.com)", "mailinator.com"],
217
+ ["mail-fsmash-org", "Mailinator (mail.fsmash.org)", "mailinator.com"],
218
+ ["mailinatorzz-mooo-com", "Mailinator (mailinatorzz.mooo.com)", "mailinator.com"],
219
+ ["mi-meon-be", "Mailinator (mi.meon.be)", "mailinator.com"],
220
+ ["mingyuekeji-online", "Mailmomy (mingyuekeji.online)", "mailmomy.com"],
221
+ ["mingyueming-click", "Mailmomy (mingyueming.click)", "mailmomy.com"],
222
+ ["mingyueming-shop", "Mailmomy (mingyueming.shop)", "mailmomy.com"],
223
+ ["mingyukeji-lol", "Mailmomy (mingyukeji.lol)", "mailmomy.com"],
224
+ ["mn-curppa-com", "Mailinator (mn.curppa.com)", "mailinator.com"],
225
+ ["m-nik-me", "Mailinator (m.nik.me)", "mailinator.com"],
226
+ ["mtmdev-com", "Mailinator (mtmdev.com)", "mailinator.com"],
227
+ ["nospam-thurstons-us", "Mailinator (nospam.thurstons.us)", "mailinator.com"],
228
+ ["notfond-404-mn", "Mailinator (notfond.404.mn)", "mailinator.com"],
229
+ ["null-k3vin-net", "Mailinator (null.k3vin.net)", "mailinator.com"],
230
+ ["nuxh62-space", "Mailmomy (nuxh62.space)", "mailmomy.com"],
231
+ ["proid-cloud-ip-cc", "Mailmomy (proid.cloud-ip.cc)", "mailmomy.com"],
232
+ ["ramjane-mooo-com", "Mailinator (ramjane.mooo.com)", "mailinator.com"],
233
+ ["rauxa-seny-cat", "Mailinator (rauxa.seny.cat)", "mailinator.com"],
234
+ ["really-istrash-com", "Mailinator (really.istrash.com)", "mailinator.com"],
235
+ ["sbook-pics", "Mailmomy (sbook.pics)", "mailmomy.com"],
236
+ ["spam-hortuk-ovh", "Mailinator (spam.hortuk.ovh)", "mailinator.com"],
237
+ ["sp-woot-at", "Mailinator (sp.woot.at)", "mailinator.com"],
238
+ ["test-unergie-com", "Mailinator (test.unergie.com)", "mailinator.com"],
239
+ ["torch-yi-org", "Mailinator (torch.yi.org)", "mailinator.com"],
240
+ ["t-zibet-net", "Mailinator (t.zibet.net)", "mailinator.com"],
241
+ ["xue32-buzz", "Mailmomy (xue32.buzz)", "mailmomy.com"],
242
+ ["apihz", "ApiHz TempMail", "apihz.cn"],
243
+ ["sogetthis-com", "Mailinator (sogetthis.com)", "mailinator.com"],
244
+ ["bobmail-info", "Mailinator (bobmail.info)", "mailinator.com"],
245
+ ["suremail-info", "Mailinator (suremail.info)", "mailinator.com"],
246
+ ["binkmail-com", "Mailinator (binkmail.com)", "mailinator.com"],
247
+ ["veryrealemail-com", "Mailinator (veryrealemail.com)", "mailinator.com"],
248
+ ["mailmomy", "Mailmomy", "mailmomy.com"],
249
+ ["chammy-info", "Mailinator (chammy.info)", "mailinator.com"],
250
+ ["thisisnotmyrealemail-com", "Mailinator (thisisnotmyrealemail.com)", "mailinator.com"],
251
+ ["notmailinator-com", "Mailinator (notmailinator.com)", "mailinator.com"],
252
+ ["spamhereplease-com", "Mailinator (spamhereplease.com)", "mailinator.com"],
253
+ ["sendspamhere-com", "Mailinator (sendspamhere.com)", "mailinator.com"],
254
+ ["sendfree-org", "Mailinator (sendfree.org)", "mailinator.com"],
255
+ ["junk-beats-org", "Mailinator (junk.beats.org)", "mailinator.com"],
256
+ ["junk-ihmehl-com", "Mailinator (junk.ihmehl.com)", "mailinator.com"],
257
+ ["junk-noplay-org", "Mailinator (junk.noplay.org)", "mailinator.com"],
258
+ ["junk-vanillasystem-com", "Mailinator (junk.vanillasystem.com)", "mailinator.com"],
259
+ ["spam-jasonpearce-com", "Mailinator (spam.jasonpearce.com)", "mailinator.com"],
260
+ ["fish-skytale-net", "Mailinator (fish.skytale.net)", "mailinator.com"],
261
+ ["spam-mccrew-com", "Mailinator (spam.mccrew.com)", "mailinator.com"],
262
+ ["dropmail-click", "DropMail.click", "dropmail.click"],
263
+ ["spam-coroiu-com", "Mailinator (spam.coroiu.com)", "mailinator.com"],
264
+ ["spam-deluser-net", "Mailinator (spam.deluser.net)", "mailinator.com"],
265
+ ["spam-dhsf-net", "Mailinator (spam.dhsf.net)", "mailinator.com"],
266
+ ["spam-lucatnt-com", "Mailinator (spam.lucatnt.com)", "mailinator.com"],
267
+ ["spam-lyceum-life-com-ru", "Mailinator (spam.lyceum-life.com.ru)", "mailinator.com"],
268
+ ["spam-netpirates-net", "Mailinator (spam.netpirates.net)", "mailinator.com"],
269
+ ["spam-no-ip-net", "Mailinator (spam.no-ip.net)", "mailinator.com"],
270
+ ["spam-ozh-org", "Mailinator (spam.ozh.org)", "mailinator.com"],
271
+ ["spam-pyphus-org", "Mailinator (spam.pyphus.org)", "mailinator.com"],
272
+ ["spam-shep-pw", "Mailinator (spam.shep.pw)", "mailinator.com"],
273
+ ["spam-wtf-at", "Mailinator (spam.wtf.at)", "mailinator.com"],
274
+ ["spam-wulczer-org", "Mailinator (spam.wulczer.org)", "mailinator.com"],
275
+ ["crap-kakadua-net", "Mailinator (crap.kakadua.net)", "mailinator.com"],
276
+ ["spam-janlugt-nl", "Mailinator (spam.janlugt.nl)", "mailinator.com"],
277
+ ["min-burningfish-net", "Mailinator (min.burningfish.net)", "mailinator.com"],
278
+ ["sink-fblay-com", "Mailinator (sink.fblay.com)", "mailinator.com"],
279
+ ["tempgmailer", "TempGmailer", "tempgmailer.com"],
280
+ ["temp-mail-org", "Temp-Mail.org", "temp-mail.org"],
281
+ ["xkx-me", "XKX.me", "xkx.me"],
282
+ ["gonebox-email", "Gonebox Email", "gonebox.email"],
283
+ ["mailcat-ai", "Mailcat AI", "mailcat.ai"],
284
+ ["tempgo-email", "TempGo Email", "tempgo.email"],
285
+ ["restmail-net", "Restmail.net", "restmail.net"],
286
+ ["dropmail-me", "DropMail.me", "dropmail.me"],
287
+ ["ten-minute-mail-net", "10MinuteMail.net", "10minutemail.net"],
288
+ ].freeze
289
+ end
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TempmailSdk
4
+ # SDK 主入口:聚合所有渠道逻辑,提供统一的无状态 API 与有状态 Client
5
+ module Client
6
+ module_function
7
+
8
+ # 所有支持的公共渠道标识(有序),由注册表派生
9
+ def all_channels
10
+ Registry::REGISTRY.map(&:channel)
11
+ end
12
+
13
+ # 渠道信息映射表,由注册表派生
14
+ def channel_info_map
15
+ @channel_info_map ||= Registry::REGISTRY.each_with_object({}) do |spec, h|
16
+ h[spec.channel] = ChannelInfo.new(channel: spec.channel, name: spec.name, website: spec.website)
17
+ end
18
+ end
19
+
20
+ # 获取所有支持的渠道列表(有序,与 baseline 逐行一致)
21
+ # @return [Array<ChannelInfo>]
22
+ def list_channels
23
+ map = channel_info_map
24
+ all_channels.map { |ch| map[ch] }
25
+ end
26
+
27
+ # 获取指定渠道的详细信息
28
+ # @param channel [String]
29
+ # @return [ChannelInfo, nil]
30
+ def channel_info(channel)
31
+ channel_info_map[channel]
32
+ end
33
+
34
+ # 创建临时邮箱
35
+ #
36
+ # 错误处理策略:
37
+ # - 指定渠道失败时,自动尝试其他可用渠道(打乱顺序逐个尝试)
38
+ # - 未指定渠道时,打乱全部渠道逐个尝试,直到成功
39
+ # - 所有渠道均不可用时返回 nil(不抛出异常)
40
+ #
41
+ # @param options [GenerateEmailOptions, nil]
42
+ # @return [EmailInfo, nil]
43
+ def generate_email(options = nil)
44
+ options ||= GenerateEmailOptions.new
45
+ logger = Log.logger
46
+ try_order = build_channel_order(options.channel)
47
+
48
+ max_channels = options.max_channels_tried.to_i.positive? ? options.max_channels_tried : 20
49
+ total_timeout = options.total_timeout.to_f.positive? ? options.total_timeout : 60.0
50
+ start_time = Time.now
51
+ channels_tried = 0
52
+ last_err = ""
53
+
54
+ try_order.each do |ch|
55
+ if channels_tried >= max_channels
56
+ logger.warn("已尝试最大渠道数 (#{max_channels}),停止")
57
+ break
58
+ end
59
+ if Time.now - start_time >= total_timeout
60
+ logger.warn("整体超时,停止尝试")
61
+ break
62
+ end
63
+
64
+ channels_tried += 1
65
+ logger.info("创建临时邮箱, 渠道: #{ch}")
66
+ r = Retry.with_retry_with_attempts(options.retry_config) { generate_email_once(ch, options) }
67
+ if r.ok?
68
+ result = r.value
69
+ logger.info("邮箱创建成功: #{result.email} (渠道: #{ch})")
70
+ Telemetry.report(operation: "generate_email", channel: ch, success: true,
71
+ attempt_count: r.attempts, channels_tried: channels_tried, error: "")
72
+ return result
73
+ end
74
+
75
+ last_err = r.error ? r.error.message.to_s : "unknown"
76
+ logger.warn("渠道 #{ch} 不可用: #{last_err},尝试下一个渠道")
77
+ end
78
+
79
+ logger.error("所有渠道均不可用,创建邮箱失败")
80
+ Telemetry.report(operation: "generate_email", channel: "", success: false,
81
+ attempt_count: 0, channels_tried: channels_tried, error: last_err)
82
+ nil
83
+ end
84
+
85
+ # 构建渠道尝试顺序:指定渠道优先,其余打乱追加;未指定则全部打乱
86
+ # 返回值为本端运行时随机顺序,不作为跨 SDK 一致性约束
87
+ def build_channel_order(preferred = nil)
88
+ shuffled = all_channels.shuffle
89
+ return shuffled unless preferred
90
+
91
+ [preferred] + shuffled.reject { |ch| ch == preferred }
92
+ end
93
+
94
+ # 单次创建邮箱(不含重试逻辑)
95
+ def generate_email_once(channel, options)
96
+ spec = Registry::REGISTRY_MAP[channel]
97
+ raise "Unknown channel: #{channel}" if spec.nil?
98
+
99
+ spec.generate.call(options)
100
+ end
101
+
102
+ # 获取邮件列表
103
+ # Channel/Email/Token 等由 SDK 从 EmailInfo 中自动获取,用户无需手动传递
104
+ #
105
+ # @param info [EmailInfo]
106
+ # @param options [GetEmailsOptions, nil]
107
+ # @return [GetEmailsResult]
108
+ def get_emails(info, options = nil)
109
+ if info.nil?
110
+ Telemetry.report(operation: "get_emails", channel: "", success: false, attempt_count: 0,
111
+ channels_tried: 0, error: "EmailInfo is required, call generate_email() first")
112
+ raise ArgumentError, "EmailInfo is required, call generate_email() first"
113
+ end
114
+
115
+ channel = info.channel
116
+ email = info.email
117
+ token = info.token
118
+ retry_config = options&.retry_config
119
+ logger = Log.logger
120
+
121
+ if channel.nil? || channel.empty?
122
+ Telemetry.report(operation: "get_emails", channel: "", success: false, attempt_count: 0,
123
+ channels_tried: 0, error: "channel is required")
124
+ raise ArgumentError, "channel is required"
125
+ end
126
+ if (email.nil? || email.empty?) && channel != "tempmail-lol"
127
+ Telemetry.report(operation: "get_emails", channel: channel, success: false, attempt_count: 0,
128
+ channels_tried: 0, error: "email is required")
129
+ raise ArgumentError, "email is required"
130
+ end
131
+
132
+ logger.debug("获取邮件, 渠道: #{channel}, 邮箱: #{email}")
133
+ r = Retry.with_retry_with_attempts(retry_config) { get_emails_once(channel, email, token) }
134
+
135
+ if r.ok?
136
+ emails = r.value
137
+ if emails.empty?
138
+ logger.debug("暂无邮件, 渠道: #{channel}")
139
+ else
140
+ logger.info("获取到 #{emails.size} 封邮件, 渠道: #{channel}")
141
+ end
142
+ Telemetry.report(operation: "get_emails", channel: channel, success: true,
143
+ attempt_count: r.attempts, channels_tried: 0, error: "")
144
+ return GetEmailsResult.new(channel: channel, email: email, emails: emails, success: true)
145
+ end
146
+
147
+ err_s = r.error ? r.error.message.to_s : "unknown"
148
+ logger.error("获取邮件失败, 渠道: #{channel}, 错误: #{err_s}")
149
+ Telemetry.report(operation: "get_emails", channel: channel, success: false,
150
+ attempt_count: r.attempts, channels_tried: 0, error: err_s)
151
+ GetEmailsResult.new(channel: channel, email: email, emails: [], success: false)
152
+ end
153
+
154
+ # 单次获取邮件(不含重试逻辑)
155
+ def get_emails_once(channel, email, token)
156
+ spec = Registry::REGISTRY_MAP[channel]
157
+ raise "Unknown channel: #{channel}" if spec.nil?
158
+
159
+ spec.get_emails.call(email, token)
160
+ end
161
+ end
162
+
163
+ # 临时邮箱客户端
164
+ # 封装邮箱创建和邮件获取的完整流程,自动管理邮箱信息和认证令牌
165
+ class TempEmailClient
166
+ def initialize
167
+ @email_info = nil
168
+ end
169
+
170
+ # 创建临时邮箱并缓存邮箱信息
171
+ # @param options [GenerateEmailOptions, nil]
172
+ # @return [EmailInfo, nil]
173
+ def generate(options = nil)
174
+ @email_info = Client.generate_email(options)
175
+ end
176
+
177
+ # 获取当前邮箱的邮件列表,必须先调用 generate
178
+ # @param options [GetEmailsOptions, nil]
179
+ # @return [GetEmailsResult]
180
+ def get_emails(options = nil)
181
+ if @email_info.nil?
182
+ Telemetry.report(operation: "get_emails", channel: "", success: false, attempt_count: 0,
183
+ channels_tried: 0, error: "No email generated. Call generate() first")
184
+ raise "No email generated. Call generate() first"
185
+ end
186
+ Client.get_emails(@email_info, options)
187
+ end
188
+
189
+ # 获取当前缓存的邮箱信息
190
+ # @return [EmailInfo, nil]
191
+ attr_reader :email_info
192
+ end
193
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TempmailSdk
4
+ # SDK 全局配置
5
+ # 包含代理、超时、SSL 等设置,作用于所有 HTTP 请求
6
+ #
7
+ # 支持环境变量自动读取(优先级低于代码设置):
8
+ # TEMPMAIL_PROXY - 代理 URL
9
+ # TEMPMAIL_TIMEOUT - 超时秒数
10
+ # TEMPMAIL_INSECURE - 设为 "1" 或 "true" 跳过 SSL 验证
11
+ # DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail af_ 令牌(可选)
12
+ # DROPMAIL_NO_AUTO_TOKEN - 禁止自动拉取/续期
13
+ # DROPMAIL_RENEW_LIFETIME - renew 的 lifetime,默认 1d
14
+ # APIHZ_ID / APIHZ_KEY - apihz(接口盒子)调用凭据(可选)
15
+ # TEMPMAIL_TELEMETRY_ENABLED - true/false,默认 true;false/0/no 关闭匿名上报
16
+ # TEMPMAIL_TELEMETRY_URL - 自定义上报端点
17
+ class SDKConfig
18
+ attr_accessor :proxy, :timeout, :insecure, :headers,
19
+ :dropmail_auth_token, :dropmail_disable_auto_token, :dropmail_renew_lifetime,
20
+ :apihz_id, :apihz_key, :telemetry_enabled, :telemetry_url
21
+
22
+ # rubocop:disable Metrics/ParameterLists
23
+ def initialize(proxy: nil, timeout: 15, insecure: false, headers: nil,
24
+ dropmail_auth_token: nil, dropmail_disable_auto_token: false,
25
+ dropmail_renew_lifetime: nil, apihz_id: nil, apihz_key: nil,
26
+ telemetry_enabled: nil, telemetry_url: nil)
27
+ @proxy = proxy # 代理 URL,支持 http/https/socks5
28
+ @timeout = timeout # 全局默认超时秒数
29
+ @insecure = insecure # 跳过 SSL 证书验证(调试用)
30
+ @headers = headers # 自定义请求头,合并到每个请求
31
+ @dropmail_auth_token = dropmail_auth_token # DropMail af_ 令牌;空则自动申请
32
+ @dropmail_disable_auto_token = dropmail_disable_auto_token # true 时不自动 generate/renew
33
+ @dropmail_renew_lifetime = dropmail_renew_lifetime # renew lifetime,默认 1d
34
+ @apihz_id = apihz_id # apihz 调用 id;空则用公共账号
35
+ @apihz_key = apihz_key # apihz 调用 key;空则用公共账号
36
+ @telemetry_enabled = telemetry_enabled # nil 默认开启;false 关闭
37
+ @telemetry_url = telemetry_url # 非空覆盖默认上报 URL
38
+ end
39
+ # rubocop:enable Metrics/ParameterLists
40
+ end
41
+
42
+ # 配置模块:全局配置读写与版本号(供 HTTP 客户端缓存失效判断)
43
+ module Config
44
+ module_function
45
+
46
+ # 从环境变量读取默认配置
47
+ # @return [SDKConfig]
48
+ def load_env_config
49
+ timeout_str = ENV.fetch("TEMPMAIL_TIMEOUT", nil)
50
+ timeout = timeout_str&.match?(/\A\d+\z/) ? timeout_str.to_i : 15
51
+ insecure = %w[1 true True TRUE].include?(ENV.fetch("TEMPMAIL_INSECURE", ""))
52
+ dm_tok = (ENV["DROPMAIL_AUTH_TOKEN"] || ENV["DROPMAIL_API_TOKEN"] || "").strip
53
+ dm_tok = nil if dm_tok.empty?
54
+ dm_no = %w[1 true yes].include?((ENV["DROPMAIL_NO_AUTO_TOKEN"] || "").strip.downcase)
55
+ dm_renew = (ENV["DROPMAIL_RENEW_LIFETIME"] || "").strip
56
+ dm_renew = nil if dm_renew.empty?
57
+
58
+ te_raw = (ENV["TEMPMAIL_TELEMETRY_ENABLED"] || "").strip.downcase
59
+ telemetry_enabled = nil
60
+ telemetry_enabled = false if %w[false 0 no].include?(te_raw)
61
+ telemetry_enabled = true if %w[true 1 yes].include?(te_raw)
62
+
63
+ tu = (ENV["TEMPMAIL_TELEMETRY_URL"] || "").strip
64
+ tu = nil if tu.empty?
65
+ apihz_id = (ENV["APIHZ_ID"] || "").strip
66
+ apihz_id = nil if apihz_id.empty?
67
+ apihz_key = (ENV["APIHZ_KEY"] || "").strip
68
+ apihz_key = nil if apihz_key.empty?
69
+ proxy = ENV.fetch("TEMPMAIL_PROXY", nil)
70
+ proxy = nil if proxy && proxy.empty?
71
+
72
+ SDKConfig.new(
73
+ proxy: proxy, timeout: timeout, insecure: insecure,
74
+ dropmail_auth_token: dm_tok, dropmail_disable_auto_token: dm_no,
75
+ dropmail_renew_lifetime: dm_renew, telemetry_enabled: telemetry_enabled,
76
+ telemetry_url: tu, apihz_id: apihz_id, apihz_key: apihz_key
77
+ )
78
+ end
79
+
80
+ @global_config = load_env_config
81
+ @config_version = 0
82
+
83
+ class << self
84
+ # 设置 SDK 全局配置
85
+ # 设置后自动使已缓存的 HTTP 客户端失效,下次请求按新配置重建
86
+ # @param config [SDKConfig, nil] 传入配置对象;为 nil 时用关键字参数构造
87
+ def set_config(config = nil, **kwargs)
88
+ @global_config = config || SDKConfig.new(**kwargs)
89
+ @config_version += 1
90
+ nil
91
+ end
92
+
93
+ # @return [SDKConfig] 当前全局配置
94
+ def get_config
95
+ @global_config
96
+ end
97
+
98
+ # @return [Integer] 当前配置版本号
99
+ def config_version
100
+ @config_version
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TempmailSdk
4
+ # HTML 文本提取辅助
5
+ module HtmlUtils
6
+ module_function
7
+
8
+ # 将 HTML 粗略转换为纯文本:剥离 script/style,去标签,压缩空白
9
+ # @param value [String, nil]
10
+ # @return [String]
11
+ def html_to_text(value)
12
+ return "" if value.nil? || value.empty?
13
+
14
+ s = value.gsub(%r{<script\b[^>]*>.*?</script>}mi, " ")
15
+ s = s.gsub(%r{<style\b[^>]*>.*?</style>}mi, " ")
16
+ s = s.gsub(/<[^>]+>/, " ")
17
+ s = unescape_entities(s)
18
+ s.split.join(" ")
19
+ end
20
+
21
+ # 转义 HTML 特殊字符
22
+ # @param text [String]
23
+ # @return [String]
24
+ def escape(text)
25
+ text.to_s
26
+ .gsub("&", "&amp;")
27
+ .gsub("<", "&lt;")
28
+ .gsub(">", "&gt;")
29
+ .gsub('"', "&quot;")
30
+ end
31
+
32
+ # 反转义常见 HTML 实体
33
+ def unescape_entities(text)
34
+ text.gsub("&amp;", "&")
35
+ .gsub("&lt;", "<")
36
+ .gsub("&gt;", ">")
37
+ .gsub("&quot;", '"')
38
+ .gsub("&#39;", "'")
39
+ .gsub("&nbsp;", " ")
40
+ end
41
+ end
42
+ end