1 | /* |
2 | SPDX-FileCopyrightText: 2004 Matt Douhan <matt@fruitsalad.org> |
3 | |
4 | SPDX-License-Identifier: LGPL-2.0-or-later |
5 | */ |
6 | |
7 | #ifndef KCODECS_EMAILADDRESS_H |
8 | #define KCODECS_EMAILADDRESS_H |
9 | |
10 | #include <QUrl> |
11 | |
12 | #include <QByteArray> |
13 | #include <QStringList> |
14 | |
15 | #include <kcodecs_export.h> |
16 | |
17 | /*! |
18 | * \namespace KEmailAddress |
19 | * \inmodule KCodecs |
20 | * |
21 | * \since 5.5 |
22 | */ |
23 | namespace KEmailAddress |
24 | { |
25 | |
26 | /*! |
27 | \enum KEmailAddress::EmailParseResult |
28 | |
29 | Email validation result. The only 'success' code in |
30 | this enumeration is AddressOK; all the other values |
31 | indicate some specific problem with the address which |
32 | is being validated. |
33 | |
34 | Result type for splitAddress(), isValidAddress() |
35 | and isValidSimpleAddress(). |
36 | |
37 | \value AddressOk Email is valid |
38 | \value AddressEmpty The address is empty |
39 | \value UnexpectedEnd Something is unbalanced |
40 | \value UnbalancedParens Unbalanced ( ) |
41 | \value MissingDomainPart No domain in address |
42 | \value UnclosedAngleAddr \< with no matching \> |
43 | \value UnopenedAngleAddr \> with no preceding \< |
44 | \value TooManyAts More than one \@ in address |
45 | \value UnexpectedComma Comma not allowed here |
46 | \value TooFewAts Missing \@ in address |
47 | \value MissingLocalPart No address specified, only domain |
48 | \value UnbalancedQuote Quotes (single or double) not matched |
49 | \value NoAddressSpec |
50 | \value DisallowedChar An invalid character detected in address |
51 | \value InvalidDisplayName An invalid displayname detected in address |
52 | \value TooFewDots Missing \. in address |
53 | */ |
54 | enum EmailParseResult { |
55 | AddressOk, |
56 | AddressEmpty, |
57 | UnexpectedEnd, |
58 | UnbalancedParens, |
59 | MissingDomainPart, |
60 | UnclosedAngleAddr, |
61 | UnopenedAngleAddr, |
62 | TooManyAts, |
63 | UnexpectedComma, |
64 | TooFewAts, |
65 | MissingLocalPart, |
66 | UnbalancedQuote, |
67 | NoAddressSpec, |
68 | DisallowedChar, |
69 | InvalidDisplayName, |
70 | TooFewDots, |
71 | }; |
72 | |
73 | /*! Split a comma separated list of email addresses. |
74 | |
75 | \a aStr a single string representing a list of addresses |
76 | |
77 | Returns a list of strings, where each string is one address |
78 | from the original list |
79 | */ |
80 | KCODECS_EXPORT |
81 | QStringList splitAddressList(const QString &aStr); |
82 | |
83 | /*! |
84 | Splits the given address into display name, email address and comment. |
85 | Returns AddressOk if no error was encountered. Otherwise an appropriate |
86 | error code is returned. In case of an error the values of displayName, |
87 | addrSpec and comment are undefined. |
88 | |
89 | \a address a single email address, |
90 | example: Joe User (comment1) <joe.user@example.org> (comment2) |
91 | |
92 | \a displayName only out: the display-name of the email address, i.e. |
93 | "Joe User" in the example; in case of an error the |
94 | return value is undefined |
95 | |
96 | \a addrSpec only out: the addr-spec, i.e. "joe.user@example.org" |
97 | in the example; in case of an error the return value is undefined |
98 | |
99 | \a comment only out: the space-separated comments, i.e. |
100 | "comment1 comment2" in the example; in case of an |
101 | error the return value is undefined |
102 | |
103 | Returns AddressOk if no error was encountered. Otherwise an |
104 | appropriate error code is returned. |
105 | */ |
106 | KCODECS_EXPORT |
107 | EmailParseResult splitAddress(const QByteArray &address, QByteArray &displayName, QByteArray &addrSpec, QByteArray &); |
108 | |
109 | /*! |
110 | This is an overloaded member function, provided for convenience. |
111 | It behaves essentially like the above function. |
112 | |
113 | Splits the given address into display name, email address and comment. |
114 | Returns AddressOk if no error was encountered. Otherwise an appropriate |
115 | error code is returned. In case of an error the values of displayName, |
116 | addrSpec and comment are undefined. |
117 | |
118 | \a address a single email address, |
119 | example: Joe User (comment1) <joe.user@example.org> (comment2) |
120 | |
121 | \a displayName only out: the display-name of the email address, i.e. |
122 | "Joe User" in the example; in case of an error the |
123 | return value is undefined |
124 | |
125 | \a addrSpec only out: the addr-spec, i.e. "joe.user@example.org" |
126 | in the example; in case of an error the return value is undefined |
127 | |
128 | \a comment only out: the space-separated comments, i.e. |
129 | "comment1 comment2" in the example; in case of an |
130 | error the return value is undefined |
131 | |
132 | Returns AddressOk if no error was encountered. Otherwise an |
133 | appropriate error code is returned. |
134 | */ |
135 | KCODECS_EXPORT |
136 | EmailParseResult splitAddress(const QString &address, QString &displayName, QString &addrSpec, QString &); |
137 | |
138 | /*! |
139 | Validates an email address in the form of "Joe User" <joe@example.org>. |
140 | Returns AddressOk if no error was encountered. Otherwise an appropriate |
141 | error code is returned. |
142 | |
143 | \a aStr a single email address, |
144 | example: Joe User (comment1) <joe.user@example.org> |
145 | |
146 | Returns AddressOk if no error was encountered. Otherwise an |
147 | appropriate error code is returned. |
148 | */ |
149 | KCODECS_EXPORT |
150 | EmailParseResult isValidAddress(const QString &aStr); |
151 | |
152 | /*! |
153 | Validates a list of email addresses, and also allow aliases and |
154 | distribution lists to be expanded before validation. |
155 | |
156 | \a aStr a string containing a list of email addresses. |
157 | |
158 | \a badAddr a string to hold the address that was faulty. |
159 | |
160 | Returns AddressOk if no error was encountered. Otherwise an |
161 | appropriate error code is returned. |
162 | */ |
163 | KCODECS_EXPORT |
164 | EmailParseResult isValidAddressList(const QString &aStr, QString &badAddr); |
165 | |
166 | /*! |
167 | Translate the enum errorcodes from emailParseResult |
168 | into i18n'd strings that can be used for msg boxes. |
169 | |
170 | \a errorCode an error code returned from one of the |
171 | email validation functions. Do not pass |
172 | AddressOk as a value, since that will yield |
173 | a misleading error message |
174 | |
175 | Returns human-readable and already translated message describing |
176 | the validation error. |
177 | */ |
178 | KCODECS_EXPORT |
179 | QString emailParseResultToString(EmailParseResult errorCode); |
180 | |
181 | /*! |
182 | Validates an email address in the form of joe@example.org. |
183 | Returns true if no error was encountered. |
184 | This method should be used when the input field should not |
185 | allow a "full" email address with comments and other special |
186 | cases that normally are valid in an email address. |
187 | |
188 | \a aStr a single email address, |
189 | example: joe.user@example.org |
190 | |
191 | Returns true if no error was encountered. |
192 | |
193 | \note This method differs from calling isValidAddress() |
194 | and checking that that returns AddressOk in two ways: |
195 | it is faster, and it does not allow fancy addresses. |
196 | */ |
197 | KCODECS_EXPORT |
198 | bool isValidSimpleAddress(const QString &aStr); |
199 | |
200 | /*! |
201 | Returns a i18n string to be used in msgboxes. This allows for error |
202 | messages to be the same across the board. |
203 | |
204 | Returns An i18n ready string for use in msgboxes. |
205 | */ |
206 | KCODECS_EXPORT |
207 | QString simpleEmailAddressErrorMsg(); |
208 | |
209 | /*! |
210 | Returns the pure email address (addr-spec in RFC2822) of the given address |
211 | (mailbox in RFC2822). |
212 | |
213 | \a address an email address, e.g. "Joe User <joe.user@example.org>" |
214 | |
215 | Returns the addr-spec of \a address, i.e. joe.user@example.org |
216 | in the example |
217 | */ |
218 | KCODECS_EXPORT |
219 | QByteArray (const QByteArray &address); |
220 | |
221 | /*KF6 merge with above*/ |
222 | |
223 | /*! |
224 | Returns the pure email address (addr-spec in RFC2822) of the given address |
225 | (mailbox in RFC2822). |
226 | |
227 | \a address an email address, e.g. "Joe User <joe.user@example.org>" |
228 | |
229 | \a errorMessage return error message when we can't parse email |
230 | |
231 | Returns the addr-spec of \a address, i.e. joe.user@example.org |
232 | in the example |
233 | \since 5.11.0 |
234 | |
235 | */ |
236 | KCODECS_EXPORT |
237 | QByteArray (const QByteArray &address, QString &errorMessage); |
238 | |
239 | /*! |
240 | This is an overloaded member function, provided for convenience. |
241 | It behaves essentially like the above function. |
242 | |
243 | Returns the pure email address (addr-spec in RFC2822) of the given |
244 | address (mailbox in RFC2822). |
245 | |
246 | \a address an email address, e.g. "Joe User <joe.user@example.org>" |
247 | |
248 | Returns the addr-spec of \a address, i.e. joe.user@example.org |
249 | in the example |
250 | */ |
251 | KCODECS_EXPORT |
252 | QString (const QString &address); |
253 | |
254 | /*! |
255 | Returns the pure email address (addr-spec in RFC2822) of the first |
256 | email address of a list of addresses. |
257 | |
258 | \a address an email address, e.g. "Joe User <joe.user@example.org>" |
259 | |
260 | \a errorMessage return error message when we can't parse email |
261 | |
262 | Returns the addr-spec of \a address, i.e. joe.user@example.org |
263 | in the example |
264 | \since 5.11 |
265 | */ |
266 | KCODECS_EXPORT |
267 | QString (const QString &address, QString &errorMessage); |
268 | |
269 | /*KF6 merge with above*/ |
270 | /*! |
271 | Returns the pure email address (addr-spec in RFC2822) of the first |
272 | email address of a list of addresses. |
273 | |
274 | \a addresses an email address, e.g. "Joe User <joe.user@example.org>" |
275 | |
276 | Returns the addr-spec of \a addresses, i.e. joe.user@example.org |
277 | in the example |
278 | */ |
279 | KCODECS_EXPORT |
280 | QByteArray firstEmailAddress(const QByteArray &addresses); |
281 | |
282 | /*! |
283 | Returns the pure email address (addr-spec in RFC2822) of the first |
284 | email address of a list of addresses. |
285 | |
286 | \a addresses an email address, e.g. "Joe User <joe.user@example.org>" |
287 | |
288 | \a errorMessage return error message when we can't parse email |
289 | |
290 | Returns the addr-spec of \a addresses, i.e. joe.user@example.org |
291 | in the example |
292 | \since 5.11.0 |
293 | */ |
294 | |
295 | KCODECS_EXPORT |
296 | QByteArray firstEmailAddress(const QByteArray &addresses, QString &errorMessage); |
297 | |
298 | /*! |
299 | This is an overloaded member function, provided for convenience. |
300 | It behaves essentially like the above function. |
301 | |
302 | Returns the pure email address (addr-spec in RFC2822) of the first |
303 | email address of a list of addresses. |
304 | |
305 | \a addresses an email address, e.g. "Joe User <joe.user@example.org>" |
306 | |
307 | Returns the addr-spec of \a addresses, i.e. joe.user@example.org |
308 | in the example |
309 | */ |
310 | KCODECS_EXPORT |
311 | QString firstEmailAddress(const QString &addresses); |
312 | |
313 | /*! |
314 | This is an overloaded member function, provided for convenience. |
315 | It behaves essentially like the above function. |
316 | |
317 | Returns the pure email address (addr-spec in RFC2822) of the first |
318 | email address of a list of addresses. |
319 | |
320 | \a addresses an email address, e.g. "Joe User <joe.user@example.org>" |
321 | |
322 | \a errorMessage return error message when we can't parse email |
323 | |
324 | Returns the addr-spec of \a addresses, i.e. joe.user@example.org |
325 | in the example |
326 | \since 5.11.0 |
327 | */ |
328 | KCODECS_EXPORT |
329 | QString firstEmailAddress(const QString &addresses, QString &errorMessage); |
330 | |
331 | /*! |
332 | Return email address and name from string. |
333 | Examples: |
334 | "Stefan Taferner <taferner@example.org>" returns "taferner@example.org" |
335 | and "Stefan Taferner". "joe@example.com" returns "joe@example.com" |
336 | and "". Note that this only returns the first address. |
337 | |
338 | Also note that the return value is true if both the name and the |
339 | mail are not empty: this does NOT tell you if mail contains a |
340 | valid email address or just some rubbish. |
341 | |
342 | \a aStr an email address, e.g "Joe User <joe.user@example.org>" |
343 | |
344 | \a name only out: returns the displayname, "Joe User" in the example |
345 | |
346 | \a mail only out: returns the email address "joe.user@example.org" |
347 | in the example |
348 | |
349 | Returns true if both name and email address are not empty |
350 | */ |
351 | KCODECS_EXPORT |
352 | bool extractEmailAddressAndName(const QString &aStr, QString &mail, QString &name); |
353 | |
354 | /*! |
355 | Compare two email addresses. If matchName is false, it just checks |
356 | the email address, and returns true if this matches. If matchName |
357 | is true, both the name and the email must be the same. |
358 | |
359 | \a email1 the first email address to use for comparison |
360 | |
361 | \a email2 the second email address to use for comparison |
362 | |
363 | \a matchName if set to true email address and displayname must match |
364 | |
365 | Returns true if the comparison matches true in all other cases |
366 | */ |
367 | KCODECS_EXPORT |
368 | bool compareEmail(const QString &email1, const QString &email2, bool matchName); |
369 | |
370 | /*! |
371 | Returns a normalized address built from the given parts. The normalized |
372 | address is of one the following forms: |
373 | - displayName (comment) <addrSpec> |
374 | - displayName <addrSpec> |
375 | - comment <addrSpec> |
376 | - addrSpec |
377 | |
378 | \a displayName the display name of the address |
379 | |
380 | \a addrSpec the actual email address (addr-spec in RFC 2822) |
381 | |
382 | \a comment a comment |
383 | |
384 | Returns a normalized address built from the given parts |
385 | */ |
386 | KCODECS_EXPORT |
387 | QString normalizedAddress(const QString &displayName, const QString &addrSpec, const QString & = QString()); |
388 | |
389 | /*! |
390 | Decodes the punycode domain part of the given addr-spec if it's an IDN. |
391 | |
392 | \a addrSpec a pure 7-bit email address (addr-spec in RFC2822) |
393 | |
394 | Returns the email address with Unicode domain |
395 | */ |
396 | KCODECS_EXPORT |
397 | QString fromIdn(const QString &addrSpec); |
398 | |
399 | /*! |
400 | Encodes the domain part of the given addr-spec in punycode if it's an IDN. |
401 | |
402 | \a addrSpec a pure email address with Unicode domain |
403 | |
404 | Returns the email address with domain in punycode |
405 | */ |
406 | KCODECS_EXPORT |
407 | QString toIdn(const QString &addrSpec); |
408 | |
409 | /*! |
410 | Normalizes all email addresses in the given list and decodes all IDNs. |
411 | |
412 | \a addresses a list of email addresses with punycoded IDNs |
413 | |
414 | Returns the email addresses in normalized form with Unicode IDNs |
415 | */ |
416 | KCODECS_EXPORT |
417 | QString normalizeAddressesAndDecodeIdn(const QString &addresses); |
418 | |
419 | /*! |
420 | Normalizes all email addresses in the given list and encodes all IDNs |
421 | in punycode. |
422 | |
423 | \a str a list of email addresses |
424 | |
425 | Returns the email addresses in normalized form |
426 | */ |
427 | KCODECS_EXPORT |
428 | QString normalizeAddressesAndEncodeIdn(const QString &str); |
429 | |
430 | /*! |
431 | Add quote characters around the given string if it contains a |
432 | character that makes that necessary, in an email name, such as ",". |
433 | |
434 | \a str a string that may need quoting |
435 | |
436 | Returns the string quoted if necessary |
437 | */ |
438 | KCODECS_EXPORT |
439 | QString quoteNameIfNecessary(const QString &str); |
440 | |
441 | /*! |
442 | * Creates a valid mailto: URL from the given mailbox. |
443 | * |
444 | * \a mailbox The mailbox, which means the display name and the address specification, for |
445 | * example "Thomas McGuire" <thomas@domain.com>. The display name is optional. |
446 | * |
447 | * Returns a valid mailto: URL for the given mailbox. |
448 | */ |
449 | KCODECS_EXPORT |
450 | QUrl encodeMailtoUrl(const QString &mailbox); |
451 | |
452 | /*! |
453 | * Extracts the mailbox out of the mailto: URL. |
454 | * |
455 | * \a mailtoUrl the URL with the mailto protocol, which contains the mailbox to be extracted |
456 | * |
457 | * Returns the mailbox, which means the display name and the address specification. |
458 | */ |
459 | KCODECS_EXPORT |
460 | QString decodeMailtoUrl(const QUrl &mailtoUrl); |
461 | |
462 | } // namespace KEmailAddress |
463 | |
464 | #endif |
465 | |