Hi,
Sorry if this is done before, but I wanted to support DSN under cygwin.
sendmail isnt the easiest thing to compile under cygwin, and a bit
overkill, so I've tweaked ssmtp to take the DSN flags in a sendmailish
style.
Regards,
Luke
--- ssmtp-2.38.7-3/ssmtp.c Thu Jun 7 13:54:20 2001
+++ ssmtp.c Sun Jan 6 18:42:28 2002
@@ -61,6 +61,8 @@
char *specifiedFrom = NULL; /* Content of the From: field if specified
with the -f option */
char *specifiedName = NULL; /* Same for -F option */
+char *dsnReturn = NULL; /* When to return DSN */
+char *dsnHowMuch = NULL; /* Headers or full */
char *fullName = NULL; /* Sending user's full name */
char *Root = "postmaster"; /* Person to send root's mail to. */
struct passwd *Sender = NULL; /* The person sending the mail. */
@@ -993,6 +995,7 @@
continue;
case 'R':
if (!argv[i][j+1]) { /* amount of the message to be returned */
+ dsnHowMuch = strdup(argv[i+1]);
add++;
goto exit;
}
@@ -1027,8 +1030,11 @@
case 'M': /* Use specified message-id. */
goto exit;
case 'N': /* dsn options */
- add++;
- goto exit;
+ if (!argv[i][j+1]) { /* amount of the message to be returned */
+ dsnReturn = strdup(argv[i+1]);
+ add++;
+ goto exit;
+ }
case 'n': /* No aliasing. */
continue;
case 'o':
@@ -1206,7 +1212,7 @@
/* if user supplied username and password, then try ELHO */
/* do not really know if this is required or not... */
- if (authUsername)
+ if (authUsername || dsnReturn)
putToSmtp (fd, "EHLO %s", HostName);
else
putToSmtp (fd, "HELO %s", HostName);
@@ -1241,11 +1247,21 @@
/* Send "MAIL FROM:" line */
if (msgFromLine && FromLineOverride)
{
+ if (dsnReturn && dsnHowMuch) {
+ putToSmtp (fd, "MAIL FROM:<%s> RET=%s", stripFromLine(msgFromLine),dsnHowMuch);
+ } else {
putToSmtp (fd, "MAIL FROM:<%s>", stripFromLine(msgFromLine));
+ }
free(msgFromLine);
}
- else
+ else {
+ if (dsnReturn && dsnHowMuch) {
+ putToSmtp (fd, "MAIL FROM:<%s> RET=%s", (specifiedFrom!=NULL) ? specifiedFrom :
+stripFromLine(fromLine), dsnHowMuch);
+ } else {
putToSmtp (fd, "MAIL FROM:<%s>", (specifiedFrom!=NULL) ? specifiedFrom :
stripFromLine(fromLine));
+ }
+ free(msgFromLine);
+ }
(void) alarm ((unsigned) MEDWAIT);
if (getOkFromSmtp (fd, buffer) == NO)
@@ -1271,7 +1287,11 @@
i = 0;
do
{
+ if (dsnReturn) {
+ putToSmtp (fd, "RCPT TO:<%s> NOTIFY=%s", properRecipient
+(recipients[i]),dsnReturn);
+ } else {
putToSmtp (fd, "RCPT TO:<%s>", properRecipient (recipients[i]));
+ }
(void) alarm ((unsigned) MEDWAIT);
if (getOkFromSmtp (fd, buffer) == NO)
{
@@ -1290,7 +1310,11 @@
{
/* RFC822 Address -> "foo@bar" */
parseaddr(p, buffer, sizeof(buffer));
+ if (dsnReturn) {
+ putToSmtp (fd, "RCPT TO:<%s> NOTIFY=%s", properRecipient
+(buffer),dsnReturn);
+ } else {
putToSmtp (fd, "RCPT TO:<%s>", properRecipient (buffer));
+ }
(void) alarm ((unsigned) MEDWAIT);
if (getOkFromSmtp (fd, buffer) == NO)
{