diff --git a/doc/CHANGELOG.TXT b/doc/CHANGELOG.TXT
index c1c7900c..3097ae53 100755
--- a/doc/CHANGELOG.TXT
+++ b/doc/CHANGELOG.TXT
@@ -1,3 +1,9 @@
+Version 2.2.5, released December 12th, 2002
+===========================================
+
+- Improved speed for sending many email notifications
+- Added "Omit email to" option
+
Version 2.2.4, released December 12th, 2002
===========================================
diff --git a/doc/config.html b/doc/config.html
index c6404dd3..4723a34c 100755
--- a/doc/config.html
+++ b/doc/config.html
@@ -830,6 +830,8 @@ individual logbook sections, one has to log in to each logbook separately.
Email <attribute> <value> = <list>
Use Email Subject = <string>
Use Email From = <string>
+Omit Email To = 0|1
+
To send email automatically when new entries are created in a logbook, a SMTP host =
@@ -852,7 +854,10 @@ used as the email subject. The text can contain $<attribute>
statements which are substituted with the current value of that
attribute. For a full list of possible substitutions, see the
"Subst <attribute>" option. The option Use Email From = <string>
- is used for the "from" field in the email.
+ is used for the "from" field in the email. If the flag
+Omit Email To is set to 1, the To: field in the email is
+left empty insted set to the real email address of the recipients. This can
+be useful if one recipient should not see the email addresses of the other recipients.
diff --git a/elogd.c b/elogd.c
index 477f8469..02e5a3c0 100755
--- a/elogd.c
+++ b/elogd.c
@@ -6,6 +6,9 @@
Contents: Web server program for Electronic Logbook ELOG
$Log$
+ Revision 2.115 2002/12/13 12:07:01 midas
+ Improved email sending
+
Revision 2.114 2002/12/12 13:25:59 midas
Make active logbook tab also a link
@@ -446,7 +449,7 @@
\********************************************************************/
/* Version of ELOG */
-#define VERSION "2.2.4"
+#define VERSION "2.2.5"
#include
#include
@@ -1014,15 +1017,16 @@ struct timeval timeout;
}
-INT sendmail(char *smtp_host, char *from, char *to, char *subject, char *text)
+INT sendmail(char *smtp_host, char *from, char *to, char *subject, char *text, BOOL email_to)
{
struct sockaddr_in bind_addr;
struct hostent *phe;
-int s, offset;
+int i, n, s, offset;
char buf[80];
char str[TEXT_SIZE+1000];
time_t now;
struct tm *ts;
+char list[1024][NAME_LENGTH];
if (verbose)
printf("\n\nEmail from %s to %s, SMTP host %s:\n", from, to, smtp_host);
@@ -1071,11 +1075,17 @@ struct tm *ts;
recv_string(s, str, sizeof(str), 3000);
if (verbose) puts(str);
- snprintf(str, sizeof(str) - 1, "RCPT TO: <%s>\r\n", to);
- send(s, str, strlen(str), 0);
- if (verbose) puts(str);
- recv_string(s, str, sizeof(str), 3000);
- if (verbose) puts(str);
+ /* break recipients into list */
+ n = strbreak(to, list, 1024);
+
+ for (i=0 ; i\r\n", list[i]);
+ send(s, str, strlen(str), 0);
+ if (verbose) puts(str);
+ recv_string(s, str, sizeof(str), 3000);
+ if (verbose) puts(str);
+ }
snprintf(str, sizeof(str) - 1, "DATA\r\n");
send(s, str, strlen(str), 0);
@@ -1083,7 +1093,18 @@ struct tm *ts;
recv_string(s, str, sizeof(str), 3000);
if (verbose) puts(str);
- snprintf(str, sizeof(str) - 1, "To: %s\r\nFrom: %s\r\nSubject: %s\r\n", to, from, subject);
+ if (email_to)
+ {
+ snprintf(str, sizeof(str) - 1, "To: %s\r\n", to);
+ send(s, str, strlen(str), 0);
+ if (verbose) puts(str);
+ }
+
+ snprintf(str, sizeof(str) - 1, "From: %s\r\nSubject: %s\r\n", from, subject);
+ send(s, str, strlen(str), 0);
+ if (verbose) puts(str);
+
+ snprintf(str, sizeof(str) - 1, "From: %s\r\nSubject: %s\r\n", from, subject);
send(s, str, strlen(str), 0);
if (verbose) puts(str);
@@ -5500,7 +5521,7 @@ int i, fh, size, self_register;
sprintf(url+strlen(url), "?cmd=Login&unm=%s", getparam("new_user_name"));
sprintf(mail_text+strlen(mail_text), "%s %s\r\n", loc("You can access it at"), url);
- sendmail(smtp_host, mail_from, getparam("new_user_email"), subject, mail_text);
+ sendmail(smtp_host, mail_from, getparam("new_user_email"), subject, mail_text, TRUE);
}
else
{
@@ -5555,7 +5576,7 @@ int i, fh, size, self_register;
loc("Logbook"), url, getparam("new_user_name"), pl);
}
- sendmail(smtp_host, mail_from, email_addr, subject, mail_text);
+ sendmail(smtp_host, mail_from, email_addr, subject, mail_text, TRUE);
}
pl = strtok(NULL, " ,");
@@ -8236,11 +8257,12 @@ LOGBOOK *lbs_cur;
/*------------------------------------------------------------------*/
int compose_mail(LOGBOOK *lbs, char *mail_to, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH],
- char *mail_param, int *n_mail, int old_mail)
+ char *mail_param, int old_mail)
{
-int j;
+int i, j, n;
char str[256], mail_from[256], mail_text[TEXT_SIZE+1000], smtp_host[256], subject[256];
char slist[MAX_N_ATTR+10][NAME_LENGTH], svalue[MAX_N_ATTR+10][NAME_LENGTH];
+char list[MAX_PARAM][NAME_LENGTH];
if (!getcfg("global", "SMTP host", smtp_host))
{
@@ -8318,7 +8340,10 @@ char slist[MAX_N_ATTR+10][NAME_LENGTH], svalue[MAX_N_ATTR+10][NAME_LENGTH];
getparam("text"));
}
- sendmail(smtp_host, mail_from, mail_to, subject, mail_text);
+ if (getcfg(lbs->name, "Omit Email to", str) && atoi(str) == 1)
+ sendmail(smtp_host, mail_from, mail_to, subject, mail_text, FALSE);
+ else
+ sendmail(smtp_host, mail_from, mail_to, subject, mail_text, TRUE);
if (!getcfg(lbs->name, "Display email recipients", str) ||
atoi(str) == 1)
@@ -8327,7 +8352,14 @@ char slist[MAX_N_ATTR+10][NAME_LENGTH], svalue[MAX_N_ATTR+10][NAME_LENGTH];
strcpy(mail_param, "?");
else
strcat(mail_param, "&");
- sprintf(mail_param+strlen(mail_param), "mail%d=%s", (*n_mail)++, mail_to);
+
+ n = strbreak(mail_to, list, MAX_PARAM);
+ for (i=0 ; i= mail_to_size)
+ {
+ mail_to_size += 256;
+ mail_to = realloc(mail_to, mail_to_size);
+ }
+ strcat(mail_to, mail_list[i]);
+ strcat(mail_to, ",");
+ }
}
}
@@ -8568,12 +8609,27 @@ int i, j, n, missing, first, index, n_mail, suppress, message_id, resubmit_or
get_user_line(lbs->name, user, NULL, NULL, user_email, email_notify);
if (email_notify[0])
- if (!compose_mail(lbs, user_email, message_id, attrib, mail_param, &n_mail, *getparam("edit")))
- return;
+ {
+ if ((int)strlen(mail_to) + (int)strlen(user_email) >= mail_to_size)
+ {
+ mail_to_size += 256;
+ mail_to = realloc(mail_to, mail_to_size);
+ }
+ strcat(mail_to, user_email);
+ strcat(mail_to, ",");
+ }
}
}
}
+ if (strlen(mail_to) > 0)
+ {
+ mail_to[strlen(mail_to)-1] = 0; /* strip last ',' */
+ compose_mail(lbs, mail_to, message_id, attrib, mail_param, *getparam("edit"));
+ }
+
+ free(mail_to);
+
for (i=0 ; i