/*
* Auto-generate an Internet email address for a user account
*/
-void AutoGenerateEmailAddressForUser(struct ctdluser *user)
-{
+void AutoGenerateEmailAddressForUser(struct ctdluser *user) {
char synthetic_email_addr[1024];
int i, j;
int u = 0;
strncpy(CC->user.emailaddrs, synthetic_email_addr, sizeof(user->emailaddrs));
syslog(LOG_DEBUG, "user_ops: auto-generated email address <%s> for <%s>", synthetic_email_addr, user->fullname);
}
+
+
+// Determine whether the supplied email address is subscribed to the supplied room's mailing list service.
+int is_email_subscribed_to_list(char *email, char *room_name) {
+ struct ctdlroom room;
+ long roomnum;
+ char *roomnetconfig;
+ int found_it = 0;
+
+ if (CtdlGetRoom(&room, room_name)) {
+ return(0); // room not found, so definitely not subscribed
+ }
+ roomnum = room.QRnumber;
+ roomnetconfig = LoadRoomNetConfigFile(roomnum);
+ if (roomnetconfig == NULL) {
+ return(0);
+ }
+
+ // We're going to do a very sloppy match here and simply search for the specified email address
+ // anywhere in the room's netconfig. If you don't like this, fix it yourself.
+ if (bmstrcasestr(roomnetconfig, email)) {
+ found_it = 1;
+ }
+ else {
+ found_it = 0;
+ }
+
+ free(roomnetconfig);
+ return(found_it);
+}
int CtdlIsMe(char *addr, int addr_buf_len);
int CtdlHostAlias(char *fqdn);
char *harvest_collected_addresses(struct CtdlMessage *msg);
+int is_email_subscribed_to_list(char *email, char *room_name);
/*
* Values that can be returned by CtdlHostAlias()
return;
}
+ if (
+ (valid->num_room > 0) // If it's mail to a room (mailing list)...
+ && (SMTP->message_originated_locally == 0) // ...and also inbound Internet mail...
+ && (is_email_subscribed_to_list((char *)ChrPtr(SMTP->from), valid->recp_room) == 0) // ...and not a subscriber
+ ) {
+ cprintf("551 <%s> - This mailing list only accepts messages from subscribers.\r\n", ChrPtr(SMTP->OneRcpt));
+ free_recipients(valid);
+ return;
+ }
+
cprintf("250 RCPT ok <%s>\r\n", ChrPtr(SMTP->OneRcpt));
if (StrLength(SMTP->recipients) > 0) {
StrBufAppendBufPlain(SMTP->recipients, HKEY(","), 0);