]> granicus.if.org Git - php/commitdiff
- Fixed bug #28038 (Sent incorrect RCPT TO commands to SMTP server)
authorGarrett Serack <garretts@php.net>
Tue, 18 Aug 2009 18:58:33 +0000 (18:58 +0000)
committerGarrett Serack <garretts@php.net>
Tue, 18 Aug 2009 18:58:33 +0000 (18:58 +0000)
win32/sendmail.c

index 59831edeb79d5cdb0fb868cdadcd74e68f8f0c0d..d16d023ea60abbcd72b2bdb9b1713001ebddfe21 100644 (file)
@@ -422,7 +422,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
        }
 
        SMTP_SKIP_SPACE(RPath);
-       snprintf(Buffer, MAIL_BUFFER_SIZE, "MAIL FROM:<%s>\r\n", RPath);
+       FormatEmailAddress(Buffer, RPath, "MAIL FROM:<%s>\r\n");
        if ((res = Post(Buffer)) != SUCCESS) {
                return (res);
        }
@@ -437,7 +437,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
        while (token != NULL)
        {
                SMTP_SKIP_SPACE(token);
-               snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token);
+               FormatEmailAddress(Buffer, token, "RCPT TO:<%s>\r\n");
                if ((res = Post(Buffer)) != SUCCESS) {
                        efree(tempMailTo);
                        return (res);
@@ -458,7 +458,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
                while (token != NULL)
                {
                        SMTP_SKIP_SPACE(token);
-                       snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token);
+                       FormatEmailAddress(Buffer, token, "RCPT TO:<%s>\r\n");
                        if ((res = Post(Buffer)) != SUCCESS) {
                                efree(tempMailTo);
                                return (res);
@@ -488,7 +488,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
                while (token != NULL)
                {
                        SMTP_SKIP_SPACE(token);
-                       snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token);
+                       FormatEmailAddress(Buffer, token, "RCPT TO:<%s>\r\n");
                        if ((res = Post(Buffer)) != SUCCESS) {
                                efree(tempMailTo);
                                return (res);
@@ -513,7 +513,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
                while (token != NULL)
                {
                        SMTP_SKIP_SPACE(token);
-                       snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token);
+                       FormatEmailAddress(Buffer, token, "RCPT TO:<%s>\r\n");
                        if ((res = Post(Buffer)) != SUCCESS) {
                                efree(tempMailTo);
                                return (res);
@@ -546,7 +546,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
                        while (token != NULL)
                        {
                                SMTP_SKIP_SPACE(token);
-                               snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", token);
+                               FormatEmailAddress(Buffer, token, "RCPT TO:<%s>\r\n");
                                if ((res = Post(Buffer)) != SUCCESS) {
                                        efree(tempMailTo);
                                        return (res);
@@ -960,3 +960,30 @@ static unsigned long GetAddr(LPSTR szHost)
        }
        return (lAddr);
 } /* end GetAddr() */
+
+
+/*********************************************************************
+// Name:  int FormatEmailAddress
+// Input: 
+// Output:
+// Description: Formats the email address to remove any content ouside
+//   of the angle brackets < > as per RFC 2821.
+//
+//   Returns the invalidly formatted mail address if the < > are 
+//   unbalanced (the SMTP server should reject it if it's out of spec.)
+//  
+// Author/Date:  garretts 08/18/2009
+// History:
+//********************************************************************/
+int FormatEmailAddress(char* Buffer, char* EmailAddress, char* FormatString )  {
+       char *tmpAddress1, *tmpAddress2;
+       int result;
+
+       if( (tmpAddress1 = strchr(EmailAddress, '<')) && (tmpAddress2 = strchr(tmpAddress1, '>'))  ) {
+               *tmpAddress2 = 0; // terminate the string temporarily.
+               result = snprintf(Buffer, MAIL_BUFFER_SIZE, FormatString , tmpAddress1+1);
+               *tmpAddress2 = '>'; // put it back the way it was.
+               return result;
+       } 
+       return snprintf(Buffer, MAIL_BUFFER_SIZE , FormatString , EmailAddress );
+} /* end FormatEmailAddress() */