php-developer-list | 2002112

Re: [PHP-DEV] Default Return-Path with mail() and qmail From: Daniel Lorch (ml-daniel <email protected>)
Date: 11/28/02

--- php-4.2.3/ext/standard/mail.c Thu Nov 28 11:37:12 2002
+++ php-4.2.3-daniel/ext/standard/mail.c Fri Nov 29 01:50:09 2002
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <string.h>
 #include "php.h"
 #include "ext/standard/info.h"
 #if !defined(PHP_WIN32)
@@ -124,6 +125,66 @@
 }
 /* }}} */
 
+char *get_header(char *header_name, char *headers)
+{
+ char *tmp;
+ char *header_value = NULL;
+ int len=0, i;
+
+ do {
+ if(*headers == '\n' || *headers == '\0') {
+ if(len < strlen(header_name)) {
+ len = 0;
+ continue;
+ }
+
+ if((tmp = (char *)malloc(strlen(header_name) + 1)) == NULL)
+ return NULL;
+
+ /* rewind pointer */
+ for(i = 0; i < len; ++i)
+ --headers;
+
+ /* copy data */
+ for(i = 0; i < strlen(header_name); ++i) {
+ tmp[i] = *headers++;
+ }
+
+ tmp[i] = '\0';
+
+ /* compare */
+ if(strcasecmp(header_name, tmp) == 0) {
+ header_value = (char *)malloc(len - strlen(header_name) - 2 /* colon and space */ + 1);
+
+ *headers++; /* colon */
+ *headers++; /* space */
+
+ for(i = 0; i < len - strlen(header_name) - 2 /* colon and space */; ++i) {
+ header_value[i] = *headers++;
+ }
+
+ header_value[i] = '\0';
+ }
+ else {
+ /* fast foward pointer :) */
+ for(i = strlen(header_name); i < len; ++i) {
+ headers++;
+ }
+ }
+
+ free(tmp);
+
+ len = 0;
+ }
+ else {
+ ++len;
+ }
+ }
+ while(*headers++ && header_value == NULL);
+
+ return header_value;
+}
+
 /* {{{ php_mail
  */
 PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd)
@@ -135,6 +196,7 @@
         int ret;
         char *sendmail_path = INI_STR("sendmail_path");
         char *sendmail_cmd = NULL;
+ char *return_path;
 
         if (!sendmail_path) {
 #ifdef PHP_WIN32
@@ -169,6 +231,21 @@
                 fprintf(sendmail, "To: %s\n", to);
                 fprintf(sendmail, "Subject: %s\n", subject);
                 if (headers != NULL) {
+
+ if((return_path = get_header("Return-Path", headers)) == NULL) {
+ if((return_path = get_header("From", headers)) != NULL) {
+ if(strchr(return_path, '<'))
+ fprintf(sendmail, "Return-Path: %s\n", return_path);
+ else
+ fprintf(sendmail, "Return-Path: <%s>\n", return_path);
+
+ free(return_path);
+ }
+ }
+ else {
+ free(return_path);
+ }
+
                         fprintf(sendmail, "%s\n", headers);
                 }
                 fprintf(sendmail, "\n%s\n", message);

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php