3.9 Validating Email Addresses
3.9.1 Problem
Your program accepts an email address
as input, and you need to verify that the supplied address is valid.
3.9.2 Solution
Scan the email address supplied by the user, and validate it against
the lexical rules set forth in RFC 822.
3.9.3 Discussion
RFC 822 defines the syntax for
email addresses. Unfortunately, the syntax is complex, and it
supports several address formats that are no longer relevant. The
fortunate thing is that if anyone attempts to use one of these
no-longer-relevant address formats, you can be reasonably certain
they are attempting to do something they are not supposed to do.
You can use the following spc_email_isvalid(
) function to check the format of an email
address. It will perform only a syntactical check and will not
actually attempt to verify the authenticity of the address by
attempting to deliver mail to it or by performing any DNS lookups on
the domain name portion of the address.
The function only validates the actual email address and will not
accept any associated data. For example, it will fail to validate
"Bob Bobson
<bob@bobson.com>", but it will successfully
validate "bob@bobson.com". If the
supplied email address is syntactically valid,
spc_email_isvalid( ) will return 1; otherwise, it
will return 0.
|
Keep in mind that almost any character is legal in an email address
if it is properly quoted, so if you are passing an email address to
something that may be sensitive to certain characters or character
sequences (such as a command shell), you must be sure to properly
escape those characters.
|
|
#include <string.h>
int spc_email_isvalid(const char *address) {
int count = 0;
const char *c, *domain;
static char *rfc822_specials = "()<>@,;:\\\"[]";
/* first we validate the name portion (name@domain) */
for (c = address; *c; c++) {
if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) ==
'\"')) {
while (*++c) {
if (*c == '\"') break;
if (*c == '\\' && (*++c == ' ')) continue;
if (*c <= ' ' || *c >= 127) return 0;
}
if (!*c++) return 0;
if (*c == '@') break;
if (*c != '.') return 0;
continue;
}
if (*c == '@') break;
if (*c <= ' ' || *c >= 127) return 0;
if (strchr(rfc822_specials, *c)) return 0;
}
if (c == address || *(c - 1) == '.') return 0;
/* next we validate the domain portion (name@domain) */
if (!*(domain = ++c)) return 0;
do {
if (*c == '.') {
if (c == domain || *(c - 1) == '.') return 0;
count++;
}
if (*c <= ' ' || *c >= 127) return 0;
if (strchr(rfc822_specials, *c)) return 0;
} while (*++c);
return (count >= 1);
}
3.9.4 See Also
RFC 822: Standard for the Format of ARPA Internet Text
Messages
|