]> granicus.if.org Git - php/commitdiff
Adding files to enable imap_mail() on win32
authorFrank M. Kromann <fmk@php.net>
Tue, 4 Dec 2001 18:46:49 +0000 (18:46 +0000)
committerFrank M. Kromann <fmk@php.net>
Tue, 4 Dec 2001 18:46:49 +0000 (18:46 +0000)
win32/imap_sendmail.c [new file with mode: 0644]
win32/imap_sendmail.h [new file with mode: 0644]

diff --git a/win32/imap_sendmail.c b/win32/imap_sendmail.c
new file mode 100644 (file)
index 0000000..9b9baca
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2001 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Frank M. Kromann    <frank@kromann.info>                    |
+   +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#include "php.h"                               /*php specific */
+#include <stdio.h>
+#include <stdlib.h>
+#include <winsock.h>
+#include "time.h"
+#include <string.h>
+#include <malloc.h>
+#include <memory.h>
+#include <winbase.h>
+#include "ext/imap/php_imap.h"
+#include "sendmail.h"
+#include "imap_sendmail.h"
+#include "php_ini.h"
+
+char Buffer[MAIL_BUFFER_SIZE];
+
+extern int WinsockStarted;
+extern char MailHost[HOST_NAME_LEN];
+extern char LocalHost[HOST_NAME_LEN];
+
+
+/********************************************************************
+ Name:  imap_TSendMail
+ Input:   1) host:    Name of the mail host where the SMTP server resides
+                      max accepted length of name = 256
+          2) appname: Name of the application to use in the X-mailer
+                      field of the message. if NULL is given the application
+                      name is used as given by the GetCommandLine() function
+                      max accespted length of name = 100
+ Output:  1) error:   Returns the error code if something went wrong or
+                      SUCCESS otherwise.
+
+ See SendText() for additional args!
+********************************************************************/
+int imap_TSendMail(char *host, int *error,
+                         char *headers, char *Subject, char *mailTo, char *data, char *mailCc, char *mailBcc, char *mailRPath)
+{
+       int ret;
+       char *RPath = NULL;
+
+       WinsockStarted = FALSE;
+
+       if (host == NULL) {
+               *error = BAD_MAIL_HOST;
+               return BAD_MAIL_HOST;
+       } else if (strlen(host) >= HOST_NAME_LEN) {
+               *error = BAD_MAIL_HOST;
+               return BAD_MAIL_HOST;
+       } else {
+               strcpy(MailHost, host);
+       }
+
+       if (mailRPath)
+               RPath = estrdup(mailRPath);
+       else if (INI_STR("sendmail_from")){
+               RPath = estrdup(INI_STR("sendmail_from"));
+       } else {
+               return 19;
+       }
+
+       // attempt to connect with mail host
+       *error = MailConnect();
+       if (*error != 0) {
+               if(RPath)efree(RPath);
+               return *error;
+       } else {
+               ret = imap_SendText(RPath, Subject, mailTo, data, headers, mailCc, mailBcc);
+               TSMClose();
+               if (ret != SUCCESS) {
+                       *error = ret;
+               }
+               if(RPath)efree(RPath);
+               return ret;
+       }
+}
+
+/********************************************************************
+ Name:  imap_TSendText
+ Input:       1) RPath:   return path of the message
+                          Is used to fill the "Return-Path" and the
+                          "X-Sender" fields of the message.
+              2) Subject: Subject field of the message. If NULL is given
+                          the subject is set to "No Subject"
+              3) mailTo:  Destination address
+              4) data:    Null terminated string containing the data to be send.
+                         5) headers: Null terminated string containing extra headers
+                         6) mailCc:  Additional destination addresses
+                         7) mailBcc: Send the mail to these addresses as well, but do not 
+                                     list these in the headers
+ Output:      Error code or SUCCESS
+ Description:
+ Author/Date:  fmk/12-13-2001
+ History:
+********************************************************************/
+int imap_SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *mailCc, char *mailBcc)
+{
+       int res, i;
+       char *p;
+       char *tempMailTo;
+       ADDRESS *addr;
+
+       /* check for NULL parameters */
+       if (data == NULL)
+               return (BAD_MSG_CONTENTS);
+       if (mailTo == NULL)
+               return (BAD_MSG_DESTINATION);
+       if (RPath == NULL)
+               return (BAD_MSG_RPATH);
+
+       /* simple checks for the mailto address */
+       /* have ampersand ? */
+       if (strchr(mailTo, '@') == NULL)
+               return (BAD_MSG_DESTINATION);
+
+       sprintf(Buffer, "HELO %s\r\n", LocalHost);
+
+       /* in the beggining of the dialog */
+       /* attempt reconnect if the first Post fail */
+       if ((res = Post(Buffer)) != SUCCESS) {
+               MailConnect();
+               if ((res = Post(Buffer)) != SUCCESS)
+                       return (res);
+       }
+       if ((res = Ack()) != SUCCESS)
+               return (res);
+
+       sprintf(Buffer, "MAIL FROM:<%s>\r\n", RPath);
+       if ((res = Post(Buffer)) != SUCCESS)
+               return (res);
+       if ((res = Ack()) != SUCCESS)
+               return (res);
+
+       // Send mail to all rcpt's
+       tempMailTo = estrdup(mailTo);   // rfc822_parse_adrlist will change the string
+       addr = NULL;
+       rfc822_parse_adrlist(&addr, tempMailTo, NULL);
+       while (addr) {
+               if (strcmp(addr->host, ERRHOST) == 0)
+                       return (BAD_MSG_DESTINATION);
+               else {
+                       sprintf(Buffer, "RCPT TO:<%s@%s>\r\n", addr->mailbox, addr->host);
+                       if ((res = Post(Buffer)) != SUCCESS)
+                               return (res);
+                       if ((res = Ack()) != SUCCESS)
+                               return (res);
+               }
+               addr = addr->next;
+       }
+       efree(tempMailTo);
+
+       /* Send mail to all Cc rcpt's */
+       if (mailCc && *mailCc) {
+               tempMailTo = estrdup(mailCc);
+               addr = NULL;
+               rfc822_parse_adrlist(&addr, tempMailTo, NULL);
+               while (addr) {
+                       if (strcmp(addr->host, ERRHOST) == 0)
+                               return (BAD_MSG_DESTINATION);
+                       else {
+                               sprintf(Buffer, "RCPT TO:<%s@%s>\r\n", addr->mailbox, addr->host);
+                               if ((res = Post(Buffer)) != SUCCESS)
+                                       return (res);
+                               if ((res = Ack()) != SUCCESS)
+                                       return (res);
+                       }
+                       addr = addr->next;
+               }
+               efree(tempMailTo);
+       }
+
+       if (mailBcc && *mailBcc) {
+               tempMailTo = estrdup(mailBcc);
+               addr = NULL;
+               rfc822_parse_adrlist(&addr, tempMailTo, NULL);
+               while (addr) {
+                       if (strcmp(addr->host, ERRHOST) == 0)
+                               return (BAD_MSG_DESTINATION);
+                       else {
+                               sprintf(Buffer, "RCPT TO:<%s@%s>\r\n", addr->mailbox, addr->host);
+                               if ((res = Post(Buffer)) != SUCCESS)
+                                       return (res);
+                               if ((res = Ack()) != SUCCESS)
+                                       return (res);
+                       }
+                       addr = addr->next;
+               }
+               efree(tempMailTo);
+       }
+
+       if ((res = Post("DATA\r\n")) != SUCCESS)
+               return (res);
+       if ((res = Ack()) != SUCCESS)
+               return (res);
+
+
+       // send message header
+       if (Subject == NULL)
+               res = PostHeader(RPath, "No Subject", mailTo, headers, mailCc);
+       else
+               res = PostHeader(RPath, Subject, mailTo, headers, mailCc);
+       if (res != SUCCESS)
+               return (res);
+
+
+       /* send message contents in 1024 chunks */
+       if (strlen(data) <= 1024) {
+               if ((res = Post(data)) != SUCCESS)
+                       return (res);
+       } else {
+               p = data;
+               while (1) {
+                       if (*p == '\0')
+                               break;
+                       if (strlen(p) >= 1024)
+                               i = 1024;
+                       else
+                               i = strlen(p);
+
+                       /* put next chunk in buffer */
+                       strncpy(Buffer, p, i);
+                       Buffer[i] = '\0';
+                       p += i;
+
+                       /* send chunk */
+                       if ((res = Post(Buffer)) != SUCCESS)
+                               return (res);
+               }
+       }
+
+       /*send termination dot */
+       if ((res = Post("\r\n.\r\n")) != SUCCESS)
+               return (res);
+       if ((res = Ack()) != SUCCESS)
+               return (res);
+
+       return (SUCCESS);
+}
diff --git a/win32/imap_sendmail.h b/win32/imap_sendmail.h
new file mode 100644 (file)
index 0000000..7dd4028
--- /dev/null
@@ -0,0 +1,11 @@
+#if !defined(imap_sendmail_h)          // Sentry, use file only if it's not already included.
+#define imap_sendmail_h
+
+int imap_TSendMail(char *host, int *error,
+                         char *headers, char *Subject, char *mailTo, char *data, char *mailCc, char *mailBcc, char *mailRPath);
+int imap_SendText(char *RPath, char *Subject, char *mailTo, char *data, char *headers, char *mailCc, char *mailBcc);
+
+int imap_PostHeader(char *, char *, char *, char *, char *);
+
+extern char *GetSMErrorText(int index);
+#endif