addr_parse.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:4k
源码类别:

Email客户端

开发平台:

C/C++

  1. /**
  2.     eMail is a command line SMTP client.
  3.     Copyright (C) 2001 - 2008 email by Dean Jones
  4.     Software supplied and written by http://www.cleancode.org
  5.     This file is part of eMail.
  6.     eMail is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.     eMail is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with eMail; if not, write to the Free Software
  16.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. **/
  18. #if HAVE_CONFIG_H
  19. # include "config.h"
  20. #endif
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <ctype.h>
  24. #include <string.h>
  25. #include <unistd.h>
  26. #include "email.h"
  27. #include "utils.h"
  28. /**
  29.  * strip any quotes from the begining and end of the
  30.  * email name passed.  
  31. **/
  32. char *
  33. stripEmailName(char *str)
  34. {
  35. char *end_quote;
  36. if (!str) {
  37. return NULL;
  38. }
  39. /* first remove end quote */
  40. if ((end_quote = strrchr(str, '"'))) {
  41. *end_quote = '';
  42. }
  43. /* now remove begining quote */
  44. if (*str == '"') {
  45. str++;
  46. }
  47. return str;
  48. }
  49. /**
  50.  * strip any quotes and brackets from the begining of the 
  51.  * email address that is passed.
  52. **/
  53. char *
  54. stripEmailAddr(char *str)
  55. {
  56. char *end_quote, *end_bracket;
  57. if (!str) {
  58. return NULL;
  59. }
  60. /* first check if we have an end quote */
  61. if ((end_quote = strrchr(str, '"'))) {
  62. *end_quote = '';
  63. }
  64. /* now check for end brace */
  65. if ((end_bracket = strrchr(str, '>'))) {
  66. *end_bracket = '';
  67. }
  68. /* now check for begining quote and bracket */
  69. if ((*str == '"') || (*str == '<')) {
  70. str++;
  71. }
  72. if ((*str == '<') || (*str == '"')) {
  73. str++;
  74. }
  75. return str;
  76. }
  77. /**
  78.  * Parses a given address to separate the name from the address.
  79.  */
  80. int
  81. parseAddr(const char *addr, dstrbuf *ret_name, dstrbuf *ret_addr)
  82. {
  83. int retval = 0;
  84. dstrbuf *copy = DSB_NEW;
  85. dsbCopy(copy, addr);
  86. /* If there is a formatted email address, break it up */
  87. if (strchr(copy->str, '<') && copy->str[0] != '<') {
  88. char *tok = strtok(copy->str, "<");
  89. dsbCopy(ret_name, tok);
  90. tok = strtok(NULL, "<");
  91. tok = strtok(tok, ">");
  92. if (tok == NULL) {
  93. retval = ERROR;
  94. goto end;
  95. } else {
  96. dsbCopy(ret_addr, tok);
  97. }
  98. } else {
  99. /* it's just a regular addr (no name) */
  100. char *stripped = stripEmailAddr(copy->str);
  101. dsbCopy(ret_addr, stripped);
  102. }
  103. end:
  104. dsbDestroy(copy);
  105. return retval;
  106. }
  107. /** 
  108.  * just a wrapper for snprintf() to make code
  109.  * more readable.  A reader will know that the email address is being
  110.  * formated by reading this name.
  111. **/
  112. dstrbuf *
  113. formatEmailAddr(char *name, char *address)
  114. {
  115. char *proper_name, *proper_addr;
  116. dstrbuf *ret = DSB_NEW, *dsb=NULL;
  117. CharSetType charset;
  118. assert(address != NULL);
  119. proper_addr = stripEmailAddr(address);
  120. if (name) {
  121. proper_name = stripEmailName(name);
  122. if (Mopts.encoding) {
  123. charset = getCharSet((u_char *)proper_name);
  124. if (charset == IS_UTF8) {
  125. dsb = encodeUtf8String((u_char *)proper_name, false);
  126. proper_name = dsb->str;
  127. } else if (charset == IS_PARTIAL_UTF8) {
  128. dsb = encodeUtf8String((u_char *)proper_name, true);
  129. proper_name = dsb->str;
  130. }
  131. }
  132. dsbPrintf(ret, ""%s" <%s>", proper_name, proper_addr);
  133. if (dsb) {
  134. dsbDestroy(dsb);
  135. }
  136. } else {
  137. dsbPrintf(ret, "<%s>", proper_addr);
  138. }
  139. return ret;
  140. }
  141. /**
  142.  * will take one email address as an argument 
  143.  * and make sure it has the appropriate syntax of an email address. 
  144.  * if so, return TRUE, else return FALSE 
  145. **/
  146. int
  147. validateEmail(const char *email_addy)
  148. {
  149. char *copy;
  150. char *name, *domain;
  151. int retval = SUCCESS;
  152. /* make a copy of email_addy so we don't ruin it with strtok */
  153. copy = xstrdup(email_addy);
  154. /* Get the name before the @ character. */
  155. name = strtok(copy, "@");
  156. if (name != NULL) {
  157. /* Get the domain after the @ character. */
  158. domain = strtok(NULL, "@");
  159. if (domain == NULL) {
  160. retval = ERROR;
  161. }
  162. } else {
  163. retval = ERROR;
  164. }
  165. free(copy);
  166. return retval;
  167. }