react-native-email-imap-smtp 0.1.0

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 (201) hide show
  1. package/EmailImapSmtp.podspec +29 -0
  2. package/LICENSE +20 -0
  3. package/README.md +121 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +117 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  8. package/android/src/main/java/com/margelo/nitro/emailimapsmtp/EmailImapSmtp.kt +1533 -0
  9. package/android/src/main/java/com/margelo/nitro/emailimapsmtp/EmailImapSmtpPackage.kt +22 -0
  10. package/ios/EmailImapSmtp.swift +5 -0
  11. package/lib/module/EmailImapSmtp.nitro.js +4 -0
  12. package/lib/module/EmailImapSmtp.nitro.js.map +1 -0
  13. package/lib/module/NativeEmailImapSmtp.js +14 -0
  14. package/lib/module/NativeEmailImapSmtp.js.map +1 -0
  15. package/lib/module/index.js +64 -0
  16. package/lib/module/index.js.map +1 -0
  17. package/lib/module/native.js +227 -0
  18. package/lib/module/native.js.map +1 -0
  19. package/lib/module/package.json +1 -0
  20. package/lib/module/types.js +2 -0
  21. package/lib/module/types.js.map +1 -0
  22. package/lib/module/web.js +107 -0
  23. package/lib/module/web.js.map +1 -0
  24. package/lib/module/windows.js +156 -0
  25. package/lib/module/windows.js.map +1 -0
  26. package/lib/typescript/package.json +1 -0
  27. package/lib/typescript/src/EmailImapSmtp.nitro.d.ts +268 -0
  28. package/lib/typescript/src/EmailImapSmtp.nitro.d.ts.map +1 -0
  29. package/lib/typescript/src/NativeEmailImapSmtp.d.ts +36 -0
  30. package/lib/typescript/src/NativeEmailImapSmtp.d.ts.map +1 -0
  31. package/lib/typescript/src/index.d.ts +33 -0
  32. package/lib/typescript/src/index.d.ts.map +1 -0
  33. package/lib/typescript/src/native.d.ts +32 -0
  34. package/lib/typescript/src/native.d.ts.map +1 -0
  35. package/lib/typescript/src/types.d.ts +261 -0
  36. package/lib/typescript/src/types.d.ts.map +1 -0
  37. package/lib/typescript/src/web.d.ts +32 -0
  38. package/lib/typescript/src/web.d.ts.map +1 -0
  39. package/lib/typescript/src/windows.d.ts +32 -0
  40. package/lib/typescript/src/windows.d.ts.map +1 -0
  41. package/nitro.json +23 -0
  42. package/nitrogen/generated/android/c++/JAppendResult.hpp +65 -0
  43. package/nitrogen/generated/android/c++/JAttachmentInfo.hpp +96 -0
  44. package/nitrogen/generated/android/c++/JConnectionConfig.hpp +94 -0
  45. package/nitrogen/generated/android/c++/JConnectionResult.hpp +73 -0
  46. package/nitrogen/generated/android/c++/JDeleteResult.hpp +87 -0
  47. package/nitrogen/generated/android/c++/JEmailAddress.hpp +61 -0
  48. package/nitrogen/generated/android/c++/JEmailBody.hpp +84 -0
  49. package/nitrogen/generated/android/c++/JEmailMessage.hpp +273 -0
  50. package/nitrogen/generated/android/c++/JFetchEmailsOptions.hpp +110 -0
  51. package/nitrogen/generated/android/c++/JFolderInfo.hpp +126 -0
  52. package/nitrogen/generated/android/c++/JFunc_void_IdleNotification.hpp +79 -0
  53. package/nitrogen/generated/android/c++/JHybridEmailImapSmtpSpec.cpp +697 -0
  54. package/nitrogen/generated/android/c++/JHybridEmailImapSmtpSpec.hpp +92 -0
  55. package/nitrogen/generated/android/c++/JIdleNotification.hpp +78 -0
  56. package/nitrogen/generated/android/c++/JImapServerInfo.hpp +84 -0
  57. package/nitrogen/generated/android/c++/JMailboxInfo.hpp +134 -0
  58. package/nitrogen/generated/android/c++/JMailboxListItem.hpp +92 -0
  59. package/nitrogen/generated/android/c++/JQuotaInfo.hpp +78 -0
  60. package/nitrogen/generated/android/c++/JSearchCriteria.hpp +187 -0
  61. package/nitrogen/generated/android/c++/JSearchHeader.hpp +61 -0
  62. package/nitrogen/generated/android/c++/JSendMailOptions.hpp +229 -0
  63. package/nitrogen/generated/android/c++/JSendMailResult.hpp +88 -0
  64. package/nitrogen/generated/android/c++/JSmtpAttachment.hpp +80 -0
  65. package/nitrogen/generated/android/c++/JSmtpConnectionConfig.hpp +98 -0
  66. package/nitrogen/generated/android/c++/JSmtpServerInfo.hpp +102 -0
  67. package/nitrogen/generated/android/c++/JVariant_ImapServerInfo_SmtpServerInfo.cpp +26 -0
  68. package/nitrogen/generated/android/c++/JVariant_ImapServerInfo_SmtpServerInfo.hpp +73 -0
  69. package/nitrogen/generated/android/c++/JVariant_NullType_AttachmentInfo.cpp +26 -0
  70. package/nitrogen/generated/android/c++/JVariant_NullType_AttachmentInfo.hpp +75 -0
  71. package/nitrogen/generated/android/c++/JVariant_NullType_EmailMessage.cpp +26 -0
  72. package/nitrogen/generated/android/c++/JVariant_NullType_EmailMessage.hpp +83 -0
  73. package/nitrogen/generated/android/emailimapsmtp+autolinking.cmake +84 -0
  74. package/nitrogen/generated/android/emailimapsmtp+autolinking.gradle +27 -0
  75. package/nitrogen/generated/android/emailimapsmtpOnLoad.cpp +56 -0
  76. package/nitrogen/generated/android/emailimapsmtpOnLoad.hpp +34 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/AppendResult.kt +61 -0
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/AttachmentInfo.kt +96 -0
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/ConnectionConfig.kt +96 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/ConnectionResult.kt +61 -0
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/DeleteResult.kt +61 -0
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/EmailAddress.kt +56 -0
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/EmailBody.kt +61 -0
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/EmailMessage.kt +156 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/FetchEmailsOptions.kt +116 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/FolderInfo.kt +91 -0
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/Func_void_IdleNotification.kt +80 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/HybridEmailImapSmtpSpec.kt +178 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/IdleNotification.kt +76 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/ImapServerInfo.kt +61 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/MailboxInfo.kt +101 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/MailboxListItem.kt +71 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/QuotaInfo.kt +76 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SearchCriteria.kt +196 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SearchHeader.kt +56 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SendMailOptions.kt +126 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SendMailResult.kt +86 -0
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SmtpAttachment.kt +76 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SmtpConnectionConfig.kt +101 -0
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/SmtpServerInfo.kt +61 -0
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/Variant_ImapServerInfo_SmtpServerInfo.kt +62 -0
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/Variant_NullType_AttachmentInfo.kt +62 -0
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/Variant_NullType_EmailMessage.kt +62 -0
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/emailimapsmtp/emailimapsmtpOnLoad.kt +35 -0
  105. package/nitrogen/generated/ios/EmailImapSmtp+autolinking.rb +62 -0
  106. package/nitrogen/generated/ios/EmailImapSmtp-Swift-Cxx-Bridge.cpp +161 -0
  107. package/nitrogen/generated/ios/EmailImapSmtp-Swift-Cxx-Bridge.hpp +1132 -0
  108. package/nitrogen/generated/ios/EmailImapSmtp-Swift-Cxx-Umbrella.hpp +118 -0
  109. package/nitrogen/generated/ios/EmailImapSmtpAutolinking.mm +33 -0
  110. package/nitrogen/generated/ios/EmailImapSmtpAutolinking.swift +26 -0
  111. package/nitrogen/generated/ios/c++/HybridEmailImapSmtpSpecSwift.cpp +11 -0
  112. package/nitrogen/generated/ios/c++/HybridEmailImapSmtpSpecSwift.hpp +390 -0
  113. package/nitrogen/generated/ios/swift/AppendResult.swift +39 -0
  114. package/nitrogen/generated/ios/swift/AttachmentInfo.swift +113 -0
  115. package/nitrogen/generated/ios/swift/ConnectionConfig.swift +87 -0
  116. package/nitrogen/generated/ios/swift/ConnectionResult.swift +84 -0
  117. package/nitrogen/generated/ios/swift/DeleteResult.swift +64 -0
  118. package/nitrogen/generated/ios/swift/EmailAddress.swift +34 -0
  119. package/nitrogen/generated/ios/swift/EmailBody.swift +45 -0
  120. package/nitrogen/generated/ios/swift/EmailMessage.swift +184 -0
  121. package/nitrogen/generated/ios/swift/FetchEmailsOptions.swift +198 -0
  122. package/nitrogen/generated/ios/swift/FolderInfo.swift +81 -0
  123. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  124. package/nitrogen/generated/ios/swift/Func_void_AppendResult.swift +46 -0
  125. package/nitrogen/generated/ios/swift/Func_void_ConnectionResult.swift +46 -0
  126. package/nitrogen/generated/ios/swift/Func_void_DeleteResult.swift +46 -0
  127. package/nitrogen/generated/ios/swift/Func_void_IdleNotification.swift +46 -0
  128. package/nitrogen/generated/ios/swift/Func_void_MailboxInfo.swift +46 -0
  129. package/nitrogen/generated/ios/swift/Func_void_QuotaInfo.swift +46 -0
  130. package/nitrogen/generated/ios/swift/Func_void_SendMailResult.swift +46 -0
  131. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  132. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  133. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__AttachmentInfo_.swift +58 -0
  134. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__EmailMessage_.swift +58 -0
  135. package/nitrogen/generated/ios/swift/Func_void_std__vector_AttachmentInfo_.swift +46 -0
  136. package/nitrogen/generated/ios/swift/Func_void_std__vector_EmailMessage_.swift +46 -0
  137. package/nitrogen/generated/ios/swift/Func_void_std__vector_FolderInfo_.swift +46 -0
  138. package/nitrogen/generated/ios/swift/Func_void_std__vector_MailboxListItem_.swift +46 -0
  139. package/nitrogen/generated/ios/swift/HybridEmailImapSmtpSpec.swift +84 -0
  140. package/nitrogen/generated/ios/swift/HybridEmailImapSmtpSpec_cxx.swift +759 -0
  141. package/nitrogen/generated/ios/swift/IdleNotification.swift +93 -0
  142. package/nitrogen/generated/ios/swift/ImapServerInfo.swift +45 -0
  143. package/nitrogen/generated/ios/swift/MailboxInfo.swift +91 -0
  144. package/nitrogen/generated/ios/swift/MailboxListItem.swift +55 -0
  145. package/nitrogen/generated/ios/swift/QuotaInfo.swift +80 -0
  146. package/nitrogen/generated/ios/swift/SearchCriteria.swift +485 -0
  147. package/nitrogen/generated/ios/swift/SearchHeader.swift +34 -0
  148. package/nitrogen/generated/ios/swift/SendMailOptions.swift +310 -0
  149. package/nitrogen/generated/ios/swift/SendMailResult.swift +155 -0
  150. package/nitrogen/generated/ios/swift/SmtpAttachment.swift +80 -0
  151. package/nitrogen/generated/ios/swift/SmtpConnectionConfig.swift +105 -0
  152. package/nitrogen/generated/ios/swift/SmtpServerInfo.swift +51 -0
  153. package/nitrogen/generated/ios/swift/Variant_ImapServerInfo_SmtpServerInfo.swift +30 -0
  154. package/nitrogen/generated/ios/swift/Variant_NullType_AttachmentInfo.swift +30 -0
  155. package/nitrogen/generated/ios/swift/Variant_NullType_EmailMessage.swift +30 -0
  156. package/nitrogen/generated/shared/c++/AppendResult.hpp +91 -0
  157. package/nitrogen/generated/shared/c++/AttachmentInfo.hpp +121 -0
  158. package/nitrogen/generated/shared/c++/ConnectionConfig.hpp +120 -0
  159. package/nitrogen/generated/shared/c++/ConnectionResult.hpp +98 -0
  160. package/nitrogen/generated/shared/c++/DeleteResult.hpp +93 -0
  161. package/nitrogen/generated/shared/c++/EmailAddress.hpp +87 -0
  162. package/nitrogen/generated/shared/c++/EmailBody.hpp +92 -0
  163. package/nitrogen/generated/shared/c++/EmailMessage.hpp +177 -0
  164. package/nitrogen/generated/shared/c++/FetchEmailsOptions.hpp +136 -0
  165. package/nitrogen/generated/shared/c++/FolderInfo.hpp +116 -0
  166. package/nitrogen/generated/shared/c++/HybridEmailImapSmtpSpec.cpp +50 -0
  167. package/nitrogen/generated/shared/c++/HybridEmailImapSmtpSpec.hpp +145 -0
  168. package/nitrogen/generated/shared/c++/IdleNotification.hpp +104 -0
  169. package/nitrogen/generated/shared/c++/ImapServerInfo.hpp +92 -0
  170. package/nitrogen/generated/shared/c++/MailboxInfo.hpp +124 -0
  171. package/nitrogen/generated/shared/c++/MailboxListItem.hpp +100 -0
  172. package/nitrogen/generated/shared/c++/QuotaInfo.hpp +104 -0
  173. package/nitrogen/generated/shared/c++/SearchCriteria.hpp +203 -0
  174. package/nitrogen/generated/shared/c++/SearchHeader.hpp +87 -0
  175. package/nitrogen/generated/shared/c++/SendMailOptions.hpp +151 -0
  176. package/nitrogen/generated/shared/c++/SendMailResult.hpp +113 -0
  177. package/nitrogen/generated/shared/c++/SmtpAttachment.hpp +105 -0
  178. package/nitrogen/generated/shared/c++/SmtpConnectionConfig.hpp +124 -0
  179. package/nitrogen/generated/shared/c++/SmtpServerInfo.hpp +92 -0
  180. package/package.json +196 -0
  181. package/react-native.config.js +27 -0
  182. package/src/EmailImapSmtp.nitro.ts +333 -0
  183. package/src/NativeEmailImapSmtp.ts +100 -0
  184. package/src/index.tsx +166 -0
  185. package/src/native.ts +305 -0
  186. package/src/types.ts +328 -0
  187. package/src/web.ts +196 -0
  188. package/src/windows.ts +304 -0
  189. package/windows/EmailImapSmtp.cpp +735 -0
  190. package/windows/EmailImapSmtp.h +137 -0
  191. package/windows/EmailImapSmtpModule.cpp +10 -0
  192. package/windows/EmailImapSmtpModule.h +139 -0
  193. package/windows/EmailImapSmtpPackage.cpp +15 -0
  194. package/windows/EmailImapSmtpPackage.h +13 -0
  195. package/windows/ImapProtocol.cpp +1382 -0
  196. package/windows/ImapProtocol.h +97 -0
  197. package/windows/ProtocolDefs.h +300 -0
  198. package/windows/SmtpProtocol.cpp +334 -0
  199. package/windows/SmtpProtocol.h +36 -0
  200. package/windows/TlsSocket.cpp +818 -0
  201. package/windows/TlsSocket.h +87 -0
@@ -0,0 +1,735 @@
1
+ // ============================================================
2
+ // EmailImapSmtp.cpp — Nitro HybridObject 桥接层
3
+ // 将 Nitro struct ↔ emailimap:: struct 转换,委托协议层
4
+ // ============================================================
5
+
6
+ #include "EmailImapSmtp.h"
7
+ #include "ImapProtocol.h"
8
+ #include "SmtpProtocol.h"
9
+
10
+ #include <chrono>
11
+ #include <thread>
12
+
13
+ namespace margelo::nitro::emailimapsmtp {
14
+
15
+ // ═══════════════════════════════════════════════════════════
16
+ // Conversion helpers: Nitro → emailimap:: (toProto)
17
+ // ═══════════════════════════════════════════════════════════
18
+
19
+ static emailimap::ConnectionConfig toProto(const ConnectionConfig& src) {
20
+ emailimap::ConnectionConfig dst;
21
+ dst.host = src.host;
22
+ dst.port = src.port;
23
+ dst.username = src.username;
24
+ dst.password = src.password;
25
+ dst.tls = src.tls;
26
+ dst.authType = src.authType;
27
+ dst.accessToken = src.accessToken;
28
+ dst.timeout = src.timeout;
29
+ dst.checkCertificate = src.checkCertificate;
30
+ dst.debug = src.debug;
31
+ return dst;
32
+ }
33
+
34
+ static emailimap::SmtpConnectionConfig toProto(const SmtpConnectionConfig& src) {
35
+ emailimap::SmtpConnectionConfig dst;
36
+ dst.host = src.host;
37
+ dst.port = src.port;
38
+ dst.username = src.username;
39
+ dst.password = src.password;
40
+ dst.tls = src.tls;
41
+ dst.authType = src.authType;
42
+ dst.accessToken = src.accessToken;
43
+ dst.timeout = src.timeout;
44
+ dst.checkCertificate = src.checkCertificate;
45
+ dst.helloName = src.helloName;
46
+ dst.debug = src.debug;
47
+ return dst;
48
+ }
49
+
50
+ static emailimap::FetchEmailsOptions toProto(const FetchEmailsOptions& src) {
51
+ emailimap::FetchEmailsOptions dst;
52
+ dst.mailbox = src.mailbox;
53
+ dst.from = src.from;
54
+ dst.to = src.to;
55
+ dst.rangeType = src.rangeType;
56
+ dst.page = src.page;
57
+ dst.pageSize = src.pageSize;
58
+ dst.since = src.since;
59
+ dst.before = src.before;
60
+ dst.fetchBody = src.fetchBody;
61
+ dst.fetchAttachments = src.fetchAttachments;
62
+ dst.fetchFlags = src.fetchFlags;
63
+ dst.fetchHeaders = src.fetchHeaders;
64
+ dst.fetchFullContent = src.fetchFullContent;
65
+ dst.maxBodySize = src.maxBodySize;
66
+ return dst;
67
+ }
68
+
69
+ static emailimap::SearchCriteria toProto(const SearchCriteria& src) {
70
+ emailimap::SearchCriteria dst;
71
+ dst.text = src.text;
72
+ dst.subject = src.subject;
73
+ dst.from = src.from;
74
+ dst.to = src.to;
75
+ dst.body = src.body;
76
+ dst.since = src.since;
77
+ dst.before = src.before;
78
+ dst.on = src.on;
79
+ dst.sentSince = src.sentSince;
80
+ dst.sentBefore = src.sentBefore;
81
+ dst.flagged = src.flagged;
82
+ dst.seen = src.seen;
83
+ dst.answered = src.answered;
84
+ dst.draft = src.draft;
85
+ dst.deleted = src.deleted;
86
+ dst.junk = src.junk;
87
+ dst.hasAttachment = src.hasAttachment;
88
+ dst.uids = src.uids;
89
+ if (src.header.has_value()) {
90
+ emailimap::SearchHeader h;
91
+ h.key = src.header.value().key;
92
+ h.value = src.header.value().value;
93
+ dst.header = h;
94
+ }
95
+ dst.larger = src.larger;
96
+ dst.smaller = src.smaller;
97
+ dst.mailbox = src.mailbox;
98
+ dst.sortOrder = src.sortOrder;
99
+ dst.limit = src.limit;
100
+ dst.fetchBody = src.fetchBody;
101
+ dst.fetchAttachments = src.fetchAttachments;
102
+ dst.fetchFlags = src.fetchFlags;
103
+ dst.fetchHeaders = src.fetchHeaders;
104
+ dst.fetchFullContent = src.fetchFullContent;
105
+ dst.maxBodySize = src.maxBodySize;
106
+ return dst;
107
+ }
108
+
109
+ static emailimap::SendMailOptions toProto(const SendMailOptions& src) {
110
+ emailimap::SendMailOptions dst;
111
+ dst.from.name = src.from.name;
112
+ dst.from.email = src.from.email;
113
+ for (const auto& a : src.to) {
114
+ emailimap::EmailAddress addr;
115
+ addr.name = a.name; addr.email = a.email;
116
+ dst.to.push_back(addr);
117
+ }
118
+ if (src.cc.has_value()) {
119
+ std::vector<emailimap::EmailAddress> cc;
120
+ for (const auto& a : src.cc.value()) {
121
+ emailimap::EmailAddress addr;
122
+ addr.name = a.name; addr.email = a.email;
123
+ cc.push_back(addr);
124
+ }
125
+ dst.cc = cc;
126
+ }
127
+ if (src.bcc.has_value()) {
128
+ std::vector<emailimap::EmailAddress> bcc;
129
+ for (const auto& a : src.bcc.value()) {
130
+ emailimap::EmailAddress addr;
131
+ addr.name = a.name; addr.email = a.email;
132
+ bcc.push_back(addr);
133
+ }
134
+ dst.bcc = bcc;
135
+ }
136
+ dst.subject = src.subject;
137
+ dst.textBody = src.textBody;
138
+ dst.htmlBody = src.htmlBody;
139
+ if (src.attachments.has_value()) {
140
+ std::vector<emailimap::SmtpAttachment> atts;
141
+ for (const auto& a : src.attachments.value()) {
142
+ emailimap::SmtpAttachment att;
143
+ att.filename = a.filename;
144
+ att.mimeType = a.mimeType;
145
+ if (a.data) {
146
+ att.data.assign(a.data->data(), a.data->data() + a.data->size());
147
+ }
148
+ att.contentId = a.contentId;
149
+ att.isInline = a.isInline;
150
+ att.disposition = a.disposition;
151
+ atts.push_back(att);
152
+ }
153
+ dst.attachments = atts;
154
+ }
155
+ if (src.replyTo.has_value()) {
156
+ std::vector<emailimap::EmailAddress> replyTo;
157
+ for (const auto& a : src.replyTo.value()) {
158
+ emailimap::EmailAddress addr;
159
+ addr.name = a.name; addr.email = a.email;
160
+ replyTo.push_back(addr);
161
+ }
162
+ dst.replyTo = replyTo;
163
+ }
164
+ dst.priority = src.priority;
165
+ dst.headers = src.headers;
166
+ dst.inReplyTo = src.inReplyTo;
167
+ dst.references = src.references;
168
+ dst.charset = src.charset;
169
+ dst.encoding = src.encoding;
170
+ if (src.readReceiptTo.has_value()) {
171
+ emailimap::EmailAddress addr;
172
+ addr.name = src.readReceiptTo.value().name;
173
+ addr.email = src.readReceiptTo.value().email;
174
+ dst.readReceiptTo = addr;
175
+ }
176
+ return dst;
177
+ }
178
+
179
+ // ═══════════════════════════════════════════════════════════
180
+ // Conversion helpers: emailimap:: → Nitro (toNitro)
181
+ // ═══════════════════════════════════════════════════════════
182
+
183
+ static ConnectionResult toNitro(const emailimap::ConnectionResult& src) {
184
+ ConnectionResult dst;
185
+ dst.success = src.success;
186
+ dst.error = src.error;
187
+ // serverInfo is set directly by callers (imapConnect/smtpConnect)
188
+ // since Nitro uses variant<ImapServerInfo, SmtpServerInfo>.
189
+ return dst;
190
+ }
191
+
192
+ static MailboxListItem toNitro(const emailimap::MailboxListItem& src) {
193
+ MailboxListItem dst;
194
+ dst.name = src.name;
195
+ dst.path = src.path;
196
+ dst.delimiter = src.delimiter;
197
+ dst.flags = src.flags;
198
+ dst.subscribed = src.subscribed;
199
+ return dst;
200
+ }
201
+
202
+ static MailboxInfo toNitro(const emailimap::MailboxInfo& src) {
203
+ MailboxInfo dst;
204
+ dst.name = src.name;
205
+ dst.path = src.path;
206
+ dst.uidNext = src.uidNext;
207
+ dst.uidValidity = src.uidValidity;
208
+ dst.messageCount = src.messageCount;
209
+ dst.recentCount = src.recentCount;
210
+ dst.unseenCount = src.unseenCount;
211
+ dst.firstUnseenUid = src.firstUnseenUid;
212
+ dst.highestModSeq = src.highestModSeq;
213
+ dst.flags = src.flags;
214
+ dst.permanentFlags = src.permanentFlags;
215
+ return dst;
216
+ }
217
+
218
+ static FolderInfo toNitro(const emailimap::FolderInfo& src) {
219
+ FolderInfo dst;
220
+ dst.name = src.name;
221
+ dst.path = src.path;
222
+ dst.delimiter = src.delimiter;
223
+ dst.parent = src.parent;
224
+ dst.children = src.children;
225
+ dst.flags = src.flags;
226
+ dst.subscribed = src.subscribed;
227
+ dst.messageCount = src.messageCount;
228
+ dst.unseenCount = src.unseenCount;
229
+ return dst;
230
+ }
231
+
232
+ static EmailAddress toNitro(const emailimap::EmailAddress& src) {
233
+ EmailAddress dst;
234
+ dst.name = src.name;
235
+ dst.email = src.email;
236
+ return dst;
237
+ }
238
+
239
+ static EmailBody toNitro(const emailimap::EmailBody& src) {
240
+ EmailBody dst;
241
+ dst.text = src.text;
242
+ dst.html = src.html;
243
+ dst.embeddedAttachments = src.embeddedAttachments;
244
+ return dst;
245
+ }
246
+
247
+ static AttachmentInfo toNitro(const emailimap::AttachmentInfo& src) {
248
+ AttachmentInfo dst;
249
+ dst.filename = src.filename;
250
+ dst.mimeType = src.mimeType;
251
+ dst.partId = src.partId;
252
+ dst.size = src.size;
253
+ // vector<uint8_t> → ArrayBuffer
254
+ if (!src.data.empty()) {
255
+ dst.data = ArrayBuffer::copy(src.data.data(), src.data.size());
256
+ } else {
257
+ dst.data = ArrayBuffer::copy(nullptr, 0);
258
+ }
259
+ dst.contentId = src.contentId;
260
+ dst.isInline = src.isInline;
261
+ dst.charset = src.charset;
262
+ dst.contentDisposition = src.contentDisposition;
263
+ dst.localPath = src.localPath;
264
+ return dst;
265
+ }
266
+
267
+ static EmailMessage toNitro(const emailimap::EmailMessage& src) {
268
+ EmailMessage dst;
269
+ dst.uid = src.uid;
270
+ dst.sequenceNumber = src.sequenceNumber;
271
+ dst.subject = src.subject;
272
+ dst.from = toNitro(src.from);
273
+ for (const auto& a : src.to) dst.to.push_back(toNitro(a));
274
+ for (const auto& a : src.cc) dst.cc.push_back(toNitro(a));
275
+ for (const auto& a : src.bcc) dst.bcc.push_back(toNitro(a));
276
+ for (const auto& a : src.replyTo) dst.replyTo.push_back(toNitro(a));
277
+ dst.date = src.date;
278
+ dst.receivedDate = src.receivedDate;
279
+ dst.messageId = src.messageId;
280
+ dst.inReplyTo = src.inReplyTo;
281
+ dst.references = src.references;
282
+ dst.body = toNitro(src.body);
283
+ for (const auto& a : src.attachments) dst.attachments.push_back(toNitro(a));
284
+ dst.flags = src.flags;
285
+ dst.mimeType = src.mimeType;
286
+ dst.charset = src.charset;
287
+ dst.priority = src.priority;
288
+ dst.isEncrypted = src.isEncrypted;
289
+ dst.headers = src.headers;
290
+ dst.size = src.size;
291
+ return dst;
292
+ }
293
+
294
+ static DeleteResult toNitro(const emailimap::DeleteResult& src) {
295
+ DeleteResult dst;
296
+ dst.success = src.success;
297
+ dst.failed = src.failed;
298
+ dst.error = src.error;
299
+ return dst;
300
+ }
301
+
302
+ static QuotaInfo toNitro(const emailimap::QuotaInfo& src) {
303
+ QuotaInfo dst;
304
+ dst.storageUsed = src.storageUsed;
305
+ dst.storageLimit = src.storageLimit;
306
+ dst.storageUnit = src.storageUnit;
307
+ dst.messagesUsed = src.messagesUsed;
308
+ dst.messagesLimit = src.messagesLimit;
309
+ dst.root = src.root;
310
+ return dst;
311
+ }
312
+
313
+ static AppendResult toNitro(const emailimap::AppendResult& src) {
314
+ AppendResult dst;
315
+ dst.uid = src.uid;
316
+ dst.uidValidity = src.uidValidity;
317
+ dst.date = src.date;
318
+ return dst;
319
+ }
320
+
321
+ static SendMailResult toNitro(const emailimap::SendMailResult& src) {
322
+ SendMailResult dst;
323
+ dst.success = src.success;
324
+ dst.messageId = src.messageId;
325
+ dst.date = src.date;
326
+ dst.serverResponseCode = src.serverResponseCode;
327
+ if (src.rawMimeData.has_value() && !src.rawMimeData.value().empty()) {
328
+ dst.rawMimeData = ArrayBuffer::copy(
329
+ src.rawMimeData.value().data(),
330
+ src.rawMimeData.value().size());
331
+ }
332
+ dst.queueId = src.queueId;
333
+ dst.error = src.error;
334
+ dst.retryable = src.retryable;
335
+ return dst;
336
+ }
337
+
338
+ // ═══════════════════════════════════════════════════════════
339
+ // EmailImapSmtp — HybridObject Implementation
340
+ // ═══════════════════════════════════════════════════════════
341
+
342
+ EmailImapSmtp::EmailImapSmtp()
343
+ : HybridObject(TAG)
344
+ , m_imapClient(std::make_unique<emailimap::ImapClient>())
345
+ , m_smtpClient(std::make_unique<emailimap::SmtpClient>())
346
+ , m_keepAliveRunning(false)
347
+ , m_idling(false)
348
+ {
349
+ }
350
+
351
+ EmailImapSmtp::~EmailImapSmtp() {
352
+ stopKeepAlive();
353
+ }
354
+
355
+ // ─── Keep-Alive ─────────────────────────────────────────────
356
+
357
+ void EmailImapSmtp::startKeepAlive() {
358
+ stopKeepAlive();
359
+ m_keepAliveRunning = true;
360
+ m_keepAliveThread = std::make_unique<std::thread>([this]() {
361
+ while (m_keepAliveRunning) {
362
+ std::this_thread::sleep_for(std::chrono::seconds(60));
363
+ if (!m_keepAliveRunning) break;
364
+ if (m_imapClient && m_imapClient->isConnected()) {
365
+ std::string response, error;
366
+ m_imapClient->sendCommand("NOOP", response, error);
367
+ }
368
+ }
369
+ });
370
+ m_keepAliveThread->detach();
371
+ }
372
+
373
+ void EmailImapSmtp::stopKeepAlive() {
374
+ m_keepAliveRunning = false;
375
+ if (m_keepAliveThread && m_keepAliveThread->joinable()) {
376
+ m_keepAliveThread->join();
377
+ }
378
+ m_keepAliveThread.reset();
379
+ }
380
+
381
+ // ═══ IMAP Methods ═══════════════════════════════════════════
382
+
383
+ std::shared_ptr<Promise<ConnectionResult>> EmailImapSmtp::imapConnect(const ConnectionConfig& config) {
384
+ return Promise::async([this, config]() -> ConnectionResult {
385
+ std::string error;
386
+ if (m_imapClient->connect(toProto(config), error)) {
387
+ ConnectionResult result;
388
+ result.success = true;
389
+ ImapServerInfo serverInfo;
390
+ serverInfo.serverName = config.host;
391
+ serverInfo.isCompressed = false;
392
+ result.serverInfo = serverInfo;
393
+ return result;
394
+ }
395
+ ConnectionResult result;
396
+ result.success = false;
397
+ result.error = error;
398
+ return result;
399
+ });
400
+ }
401
+
402
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapDisconnect() {
403
+ return Promise::async([this]() {
404
+ stopKeepAlive();
405
+ m_imapClient->disconnect();
406
+ });
407
+ }
408
+
409
+ std::shared_ptr<Promise<std::vector<MailboxListItem>>> EmailImapSmtp::imapListMailboxes() {
410
+ return Promise::async([this]() -> std::vector<MailboxListItem> {
411
+ std::string error;
412
+ auto list = m_imapClient->listMailboxes(error);
413
+ std::vector<MailboxListItem> result;
414
+ for (const auto& item : list) result.push_back(toNitro(item));
415
+ return result;
416
+ });
417
+ }
418
+
419
+ std::shared_ptr<Promise<MailboxInfo>> EmailImapSmtp::imapSelectMailbox(const std::string& mailbox, bool readOnly) {
420
+ return Promise::async([this, mailbox, readOnly]() -> MailboxInfo {
421
+ std::string error;
422
+ auto info = m_imapClient->selectMailbox(mailbox, readOnly, error);
423
+ startKeepAlive();
424
+ return toNitro(info);
425
+ });
426
+ }
427
+
428
+ std::shared_ptr<Promise<MailboxInfo>> EmailImapSmtp::imapRefreshMailbox() {
429
+ return Promise::async([this]() -> MailboxInfo {
430
+ std::string error;
431
+ return toNitro(m_imapClient->refreshMailbox(error));
432
+ });
433
+ }
434
+
435
+ std::shared_ptr<Promise<std::vector<FolderInfo>>> EmailImapSmtp::imapFetchFolders() {
436
+ return Promise::async([this]() -> std::vector<FolderInfo> {
437
+ std::string error;
438
+ auto list = m_imapClient->fetchFolders(error);
439
+ std::vector<FolderInfo> result;
440
+ for (const auto& f : list) result.push_back(toNitro(f));
441
+ return result;
442
+ });
443
+ }
444
+
445
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapCreateFolder(const std::string& folderName) {
446
+ return Promise::async([this, folderName]() {
447
+ std::string error;
448
+ if (!m_imapClient->createFolder(folderName, error)) {
449
+ throw std::runtime_error(error);
450
+ }
451
+ });
452
+ }
453
+
454
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapDeleteFolder(const std::string& folderName) {
455
+ return Promise::async([this, folderName]() {
456
+ std::string error;
457
+ if (!m_imapClient->deleteFolder(folderName, error)) {
458
+ throw std::runtime_error(error);
459
+ }
460
+ });
461
+ }
462
+
463
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapRenameFolder(const std::string& oldName, const std::string& newName) {
464
+ return Promise::async([this, oldName, newName]() {
465
+ std::string error;
466
+ if (!m_imapClient->renameFolder(oldName, newName, error)) {
467
+ throw std::runtime_error(error);
468
+ }
469
+ });
470
+ }
471
+
472
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapSubscribeFolder(const std::string& folderName) {
473
+ return Promise::async([this, folderName]() {
474
+ std::string error;
475
+ if (!m_imapClient->subscribeFolder(folderName, error)) {
476
+ throw std::runtime_error(error);
477
+ }
478
+ });
479
+ }
480
+
481
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapUnsubscribeFolder(const std::string& folderName) {
482
+ return Promise::async([this, folderName]() {
483
+ std::string error;
484
+ if (!m_imapClient->unsubscribeFolder(folderName, error)) {
485
+ throw std::runtime_error(error);
486
+ }
487
+ });
488
+ }
489
+
490
+ std::shared_ptr<Promise<std::vector<EmailMessage>>> EmailImapSmtp::imapFetchEmails(const FetchEmailsOptions& options) {
491
+ return Promise::async([this, options]() -> std::vector<EmailMessage> {
492
+ std::string error;
493
+ auto list = m_imapClient->fetchEmails(toProto(options), error);
494
+ std::vector<EmailMessage> result;
495
+ for (const auto& e : list) result.push_back(toNitro(e));
496
+ return result;
497
+ });
498
+ }
499
+
500
+ std::shared_ptr<Promise<std::variant<NullType, EmailMessage>>> EmailImapSmtp::imapFetchEmailByUID(double uid) {
501
+ return Promise::async([this, uid]() -> std::variant<NullType, EmailMessage> {
502
+ std::string error;
503
+ auto* msg = m_imapClient->fetchEmailByUID(uid, error);
504
+ if (msg) {
505
+ auto result = toNitro(*msg);
506
+ delete msg;
507
+ return result;
508
+ }
509
+ return NullType{};
510
+ });
511
+ }
512
+
513
+ std::shared_ptr<Promise<std::vector<EmailMessage>>> EmailImapSmtp::imapSearchEmails(const SearchCriteria& criteria) {
514
+ return Promise::async([this, criteria]() -> std::vector<EmailMessage> {
515
+ std::string error;
516
+ auto list = m_imapClient->searchEmails(toProto(criteria), error);
517
+ std::vector<EmailMessage> result;
518
+ for (const auto& e : list) result.push_back(toNitro(e));
519
+ return result;
520
+ });
521
+ }
522
+
523
+ // 匹配 Android 行为:逐条处理,部分失败不抛异常
524
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapMarkAsRead(const std::vector<double>& uids, bool silent) {
525
+ return Promise::async([this, uids, silent]() {
526
+ for (double uid : uids) {
527
+ std::string error;
528
+ m_imapClient->markAsRead({uid}, silent, error);
529
+ }
530
+ });
531
+ }
532
+
533
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapMarkAsFlagged(const std::vector<double>& uids, bool flagged) {
534
+ return Promise::async([this, uids, flagged]() {
535
+ for (double uid : uids) {
536
+ std::string error;
537
+ m_imapClient->markAsFlagged({uid}, flagged, error);
538
+ }
539
+ });
540
+ }
541
+
542
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapMoveEmails(const std::vector<double>& uids, const std::string& destinationMailbox) {
543
+ return Promise::async([this, uids, destinationMailbox]() {
544
+ std::string error;
545
+ if (!m_imapClient->moveEmails(uids, destinationMailbox, error)) {
546
+ throw std::runtime_error(error);
547
+ }
548
+ });
549
+ }
550
+
551
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapCopyEmails(const std::vector<double>& uids, const std::string& destinationMailbox) {
552
+ return Promise::async([this, uids, destinationMailbox]() {
553
+ std::string error;
554
+ if (!m_imapClient->copyEmails(uids, destinationMailbox, error)) {
555
+ throw std::runtime_error(error);
556
+ }
557
+ });
558
+ }
559
+
560
+ std::shared_ptr<Promise<DeleteResult>> EmailImapSmtp::imapDeleteEmails(const std::vector<double>& uids) {
561
+ return Promise::async([this, uids]() -> DeleteResult {
562
+ std::string error;
563
+ return toNitro(m_imapClient->deleteEmails(uids, error));
564
+ });
565
+ }
566
+
567
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapExpunge() {
568
+ return Promise::async([this]() {
569
+ std::string error;
570
+ if (!m_imapClient->expunge(error)) {
571
+ throw std::runtime_error(error);
572
+ }
573
+ });
574
+ }
575
+
576
+ std::shared_ptr<Promise<std::variant<NullType, AttachmentInfo>>> EmailImapSmtp::imapFetchAttachments(double uid, const std::string& partId) {
577
+ return Promise::async([this, uid, partId]() -> std::variant<NullType, AttachmentInfo> {
578
+ std::string error;
579
+ auto* att = m_imapClient->fetchAttachment(uid, partId, error);
580
+ if (att) {
581
+ auto result = toNitro(*att);
582
+ delete att;
583
+ return result;
584
+ }
585
+ return NullType{};
586
+ });
587
+ }
588
+
589
+ std::shared_ptr<Promise<std::vector<AttachmentInfo>>> EmailImapSmtp::imapFetchAllAttachments(double uid) {
590
+ return Promise::async([this, uid]() -> std::vector<AttachmentInfo> {
591
+ std::string error;
592
+ auto list = m_imapClient->fetchAllAttachments(uid, error);
593
+ std::vector<AttachmentInfo> result;
594
+ for (const auto& a : list) result.push_back(toNitro(a));
595
+ return result;
596
+ });
597
+ }
598
+
599
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapIdle(const std::function<void(const IdleNotification&)>& callback) {
600
+ return Promise::async([this, callback]() {
601
+ m_idling = true;
602
+ m_idleCallback = callback;
603
+
604
+ // Wrap callback to convert emailimap::IdleNotification → Nitro IdleNotification
605
+ auto protoCallback = [this](const emailimap::IdleNotification& protoNote) {
606
+ if (m_idleCallback) {
607
+ IdleNotification nitroNote;
608
+ nitroNote.type = protoNote.type;
609
+ nitroNote.mailbox = protoNote.mailbox;
610
+ nitroNote.uid = protoNote.uid;
611
+ nitroNote.flag = protoNote.flag;
612
+ nitroNote.messageCount = protoNote.messageCount;
613
+ nitroNote.timestamp = protoNote.timestamp;
614
+ m_idleCallback(nitroNote);
615
+ }
616
+ };
617
+
618
+ std::string error;
619
+ if (!m_imapClient->idle(protoCallback, error)) {
620
+ m_idling = false;
621
+ throw std::runtime_error(error);
622
+ }
623
+
624
+ {
625
+ std::unique_lock<std::mutex> lock(m_idleMutex);
626
+ m_idleCV.wait(lock, [this]() { return !m_idling || !m_imapClient->isConnected(); });
627
+ }
628
+
629
+ if (!m_imapClient->isConnected() && m_idleCallback) {
630
+ IdleNotification notification;
631
+ notification.type = "connectionLost";
632
+ notification.mailbox = "";
633
+ notification.timestamp = static_cast<double>(
634
+ std::chrono::duration_cast<std::chrono::milliseconds>(
635
+ std::chrono::system_clock::now().time_since_epoch()).count());
636
+ m_idleCallback(notification);
637
+ }
638
+ m_idling = false;
639
+ });
640
+ }
641
+
642
+ std::shared_ptr<Promise<void>> EmailImapSmtp::imapStopIdle() {
643
+ return Promise::async([this]() {
644
+ m_idling = false;
645
+ std::string error;
646
+ m_imapClient->stopIdle(error);
647
+ m_idleCV.notify_one();
648
+ });
649
+ }
650
+
651
+ std::shared_ptr<Promise<QuotaInfo>> EmailImapSmtp::imapGetQuota(const std::optional<std::string>& root) {
652
+ return Promise::async([this, root]() -> QuotaInfo {
653
+ std::string error;
654
+ return toNitro(m_imapClient->getQuota(root, error));
655
+ });
656
+ }
657
+
658
+ std::shared_ptr<Promise<AppendResult>> EmailImapSmtp::imapAppendMessage(
659
+ const std::string& mailbox,
660
+ const std::shared_ptr<ArrayBuffer>& rawMimeData,
661
+ const std::optional<std::vector<std::string>>& flags) {
662
+ return Promise::async([this, mailbox, rawMimeData, flags]() -> AppendResult {
663
+ // Convert ArrayBuffer → vector<uint8_t> on JS thread (Nitro requirement)
664
+ std::vector<uint8_t> mimeData;
665
+ if (rawMimeData) {
666
+ mimeData.assign(rawMimeData->data(), rawMimeData->data() + rawMimeData->size());
667
+ }
668
+ std::string error;
669
+ return toNitro(m_imapClient->appendMessage(mailbox, mimeData, flags, error));
670
+ });
671
+ }
672
+
673
+ // ═══ SMTP Methods ═══════════════════════════════════════════
674
+
675
+ std::shared_ptr<Promise<ConnectionResult>> EmailImapSmtp::smtpConnect(const SmtpConnectionConfig& config) {
676
+ return Promise::async([this, config]() -> ConnectionResult {
677
+ std::string error;
678
+ auto protoConfig = toProto(config);
679
+ if (m_smtpClient->connect(protoConfig, error)) {
680
+ m_smtpConfig = protoConfig;
681
+ ConnectionResult result;
682
+ result.success = true;
683
+ SmtpServerInfo serverInfo;
684
+ serverInfo.serverName = config.host;
685
+ serverInfo.supportedAuthMethods = {"LOGIN", "PLAIN"};
686
+ result.serverInfo = serverInfo;
687
+ return result;
688
+ }
689
+ ConnectionResult result;
690
+ result.success = false;
691
+ result.error = error;
692
+ return result;
693
+ });
694
+ }
695
+
696
+ std::shared_ptr<Promise<void>> EmailImapSmtp::smtpDisconnect() {
697
+ return Promise::async([this]() {
698
+ m_smtpClient->disconnect();
699
+ m_smtpConfig.reset();
700
+ });
701
+ }
702
+
703
+ std::shared_ptr<Promise<SendMailResult>> EmailImapSmtp::smtpSendMail(const SendMailOptions& options) {
704
+ return Promise::async([this, options]() -> SendMailResult {
705
+ emailimap::SendMailResult protoResult;
706
+ std::string error;
707
+
708
+ if (!m_smtpConfig.has_value()) {
709
+ protoResult.success = false;
710
+ protoResult.error = "SMTP not configured. Call smtpConnect first.";
711
+ protoResult.retryable = true;
712
+ return toNitro(protoResult);
713
+ }
714
+
715
+ // 匹配 Android 行为:每次发送创建临时连接,发完保留连接供 verify 检查
716
+ m_smtpClient->disconnect();
717
+ if (m_smtpClient->connect(m_smtpConfig.value(), error)) {
718
+ m_smtpClient->sendMail(toProto(options), protoResult, error);
719
+ // 不 disconnect:保持连接状态,供 smtpVerifyConnection 检查(匹配 Android)
720
+ } else {
721
+ protoResult.success = false;
722
+ protoResult.error = error;
723
+ protoResult.retryable = true;
724
+ }
725
+ return toNitro(protoResult);
726
+ });
727
+ }
728
+
729
+ std::shared_ptr<Promise<bool>> EmailImapSmtp::smtpVerifyConnection() {
730
+ return Promise::async([this]() -> bool {
731
+ return m_smtpClient->isConnected();
732
+ });
733
+ }
734
+
735
+ } // namespace margelo::nitro::emailimapsmtp