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.
- checksums.yaml +7 -0
- data/README.md +116 -0
- data/lib/tempmail_sdk/channels.rb +289 -0
- data/lib/tempmail_sdk/channels_data.rb +289 -0
- data/lib/tempmail_sdk/client.rb +193 -0
- data/lib/tempmail_sdk/config.rb +104 -0
- data/lib/tempmail_sdk/html_utils.rb +42 -0
- data/lib/tempmail_sdk/http.rb +225 -0
- data/lib/tempmail_sdk/logger.rb +38 -0
- data/lib/tempmail_sdk/normalize.rb +193 -0
- data/lib/tempmail_sdk/providers/anonbox.rb +248 -0
- data/lib/tempmail_sdk/providers/anonymmail.rb +92 -0
- data/lib/tempmail_sdk/providers/byom.rb +48 -0
- data/lib/tempmail_sdk/providers/catchmail.rb +110 -0
- data/lib/tempmail_sdk/providers/cleantempmail.rb +49 -0
- data/lib/tempmail_sdk/providers/devmail_uk.rb +58 -0
- data/lib/tempmail_sdk/providers/dropmail.rb +133 -0
- data/lib/tempmail_sdk/providers/dropmail_click.rb +81 -0
- data/lib/tempmail_sdk/providers/dropmail_me.rb +163 -0
- data/lib/tempmail_sdk/providers/duckmail.rb +63 -0
- data/lib/tempmail_sdk/providers/eyepaste.rb +119 -0
- data/lib/tempmail_sdk/providers/fake_email_site.rb +48 -0
- data/lib/tempmail_sdk/providers/fake_legal.rb +109 -0
- data/lib/tempmail_sdk/providers/fmail.rb +87 -0
- data/lib/tempmail_sdk/providers/freecustom.rb +135 -0
- data/lib/tempmail_sdk/providers/getnada.rb +146 -0
- data/lib/tempmail_sdk/providers/gonebox_email.rb +89 -0
- data/lib/tempmail_sdk/providers/guerrillamail.rb +62 -0
- data/lib/tempmail_sdk/providers/guerrillamail_mirrors.rb +81 -0
- data/lib/tempmail_sdk/providers/harakirimail.rb +84 -0
- data/lib/tempmail_sdk/providers/haribu.rb +176 -0
- data/lib/tempmail_sdk/providers/inboxes.rb +110 -0
- data/lib/tempmail_sdk/providers/inboxkitten.rb +90 -0
- data/lib/tempmail_sdk/providers/linshiyou.rb +157 -0
- data/lib/tempmail_sdk/providers/lroid.rb +170 -0
- data/lib/tempmail_sdk/providers/m2u.rb +126 -0
- data/lib/tempmail_sdk/providers/mail10s.rb +59 -0
- data/lib/tempmail_sdk/providers/mail123.rb +82 -0
- data/lib/tempmail_sdk/providers/mail_cx.rb +133 -0
- data/lib/tempmail_sdk/providers/mail_sunls.rb +68 -0
- data/lib/tempmail_sdk/providers/mail_tm.rb +99 -0
- data/lib/tempmail_sdk/providers/mailcatch.rb +91 -0
- data/lib/tempmail_sdk/providers/maildrop.rb +92 -0
- data/lib/tempmail_sdk/providers/maildrop_cc.rb +110 -0
- data/lib/tempmail_sdk/providers/mailforspam.rb +96 -0
- data/lib/tempmail_sdk/providers/mailhole_de.rb +70 -0
- data/lib/tempmail_sdk/providers/mailinator.rb +182 -0
- data/lib/tempmail_sdk/providers/mailmomy.rb +108 -0
- data/lib/tempmail_sdk/providers/mailnesia.rb +141 -0
- data/lib/tempmail_sdk/providers/mffac.rb +101 -0
- data/lib/tempmail_sdk/providers/moakt.rb +296 -0
- data/lib/tempmail_sdk/providers/neighbours.rb +140 -0
- data/lib/tempmail_sdk/providers/neighbours_sh.rb +117 -0
- data/lib/tempmail_sdk/providers/nimail.rb +100 -0
- data/lib/tempmail_sdk/providers/ockito.rb +163 -0
- data/lib/tempmail_sdk/providers/one_sec_mail.rb +46 -0
- data/lib/tempmail_sdk/providers/restmail_net.rb +60 -0
- data/lib/tempmail_sdk/providers/rootsh.rb +167 -0
- data/lib/tempmail_sdk/providers/shitty_email.rb +84 -0
- data/lib/tempmail_sdk/providers/smailpro.rb +103 -0
- data/lib/tempmail_sdk/providers/ta_easy.rb +53 -0
- data/lib/tempmail_sdk/providers/temp_mail_io.rb +67 -0
- data/lib/tempmail_sdk/providers/temp_mail_now.rb +103 -0
- data/lib/tempmail_sdk/providers/temp_mail_org.rb +89 -0
- data/lib/tempmail_sdk/providers/tempemail_co.rb +142 -0
- data/lib/tempmail_sdk/providers/tempemail_info.rb +121 -0
- data/lib/tempmail_sdk/providers/tempemails_net.rb +159 -0
- data/lib/tempmail_sdk/providers/tempfastmail.rb +76 -0
- data/lib/tempmail_sdk/providers/tempgmailer.rb +126 -0
- data/lib/tempmail_sdk/providers/tempgo_email.rb +74 -0
- data/lib/tempmail_sdk/providers/tempinbox.rb +70 -0
- data/lib/tempmail_sdk/providers/tempmail.rb +66 -0
- data/lib/tempmail_sdk/providers/tempmail365.rb +119 -0
- data/lib/tempmail_sdk/providers/tempmail_fish.rb +89 -0
- data/lib/tempmail_sdk/providers/tempmail_fyi.rb +124 -0
- data/lib/tempmail_sdk/providers/tempmail_lol.rb +42 -0
- data/lib/tempmail_sdk/providers/tempmail_lol_v2.rb +57 -0
- data/lib/tempmail_sdk/providers/tempmail_plus.rb +80 -0
- data/lib/tempmail_sdk/providers/tempmailc.rb +80 -0
- data/lib/tempmail_sdk/providers/tempmailpro.rb +89 -0
- data/lib/tempmail_sdk/providers/tempmailten.rb +150 -0
- data/lib/tempmail_sdk/providers/temporam.rb +95 -0
- data/lib/tempmail_sdk/providers/tempp_mails.rb +150 -0
- data/lib/tempmail_sdk/providers/tempy_email.rb +73 -0
- data/lib/tempmail_sdk/providers/ten_minute_mail_net.rb +125 -0
- data/lib/tempmail_sdk/providers/tenminute_one.rb +255 -0
- data/lib/tempmail_sdk/providers/throwawaymail.rb +80 -0
- data/lib/tempmail_sdk/providers/tmail_link.rb +98 -0
- data/lib/tempmail_sdk/providers/uncorreotemporal.rb +84 -0
- data/lib/tempmail_sdk/providers/webmailtemp.rb +108 -0
- data/lib/tempmail_sdk/providers/xkx_me.rb +125 -0
- data/lib/tempmail_sdk/providers/zhujump.rb +256 -0
- data/lib/tempmail_sdk/registry.rb +1097 -0
- data/lib/tempmail_sdk/retry.rb +91 -0
- data/lib/tempmail_sdk/telemetry.rb +134 -0
- data/lib/tempmail_sdk/types.rb +164 -0
- data/lib/tempmail_sdk/version.rb +6 -0
- data/lib/tempmail_sdk/webui.rb +360 -0
- data/lib/tempmail_sdk.rb +76 -0
- 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("&", "&")
|
|
27
|
+
.gsub("<", "<")
|
|
28
|
+
.gsub(">", ">")
|
|
29
|
+
.gsub('"', """)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# 反转义常见 HTML 实体
|
|
33
|
+
def unescape_entities(text)
|
|
34
|
+
text.gsub("&", "&")
|
|
35
|
+
.gsub("<", "<")
|
|
36
|
+
.gsub(">", ">")
|
|
37
|
+
.gsub(""", '"')
|
|
38
|
+
.gsub("'", "'")
|
|
39
|
+
.gsub(" ", " ")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|