/*
* $Id$
*
- * This module implements the following protocols for the Citadel system:
+ * This module is an SMTP and ESMTP implementation for the Citadel system.
+ * It is compliant with all of the following:
*
- * RFC 821 (Simple Mail Transfer Protocol)
- * RFC 1854 (command pipelining)
- * RFC 1869 (Extended Simple Mail Transfer Protocol)
- * RFC 2033 (Local Mail Transfer Protocol)
- * RFC 2034 (enhanced status codes)
+ * RFC 821 - Simple Mail Transfer Protocol
+ * RFC 876 - Survey of SMTP Implementations
+ * RFC 1047 - Duplicate messages and SMTP
+ * RFC 1854 - command pipelining
+ * RFC 1869 - Extended Simple Mail Transfer Protocol
+ * RFC 1870 - SMTP Service Extension for Message Size Declaration
+ * RFC 1893 - Enhanced Mail System Status Codes
+ * RFC 2033 - Local Mail Transfer Protocol
+ * RFC 2034 - SMTP Service Extension for Returning Enhanced Error Codes
+ * RFC 2197 - SMTP Service Extension for Command Pipelining
+ * RFC 2554 - SMTP Service Extension for Authentication
+ * RFC 2821 - Simple Mail Transfer Protocol
+ * RFC 2822 - Internet Message Format
+ * RFC 2920 - SMTP Service Extension for Command Pipelining
*
*/
}
if (which_command == 0) {
- cprintf("250 Greetings and joyous salutations.\r\n");
+ cprintf("250 Hello %s (%s [%s])\r\n",
+ SMTP->helo_node,
+ CC->cs_host,
+ CC->cs_addr
+ );
}
else {
- cprintf("250-Greetings and joyous salutations.\r\n");
+ if (which_command == 1) {
+ cprintf("250-Hello %s (%s [%s])\r\n",
+ SMTP->helo_node,
+ CC->cs_host,
+ CC->cs_addr
+ );
+ }
+ else {
+ cprintf("250-Greetings and joyous salutations.\r\n");
+ }
cprintf("250-HELP\r\n");
cprintf("250-SIZE %ld\r\n", config.c_maxmsglen);
cprintf("250-PIPELINING\r\n");
}
+
/*
* Implement HELP command.
*/
CC->cs_flags &= ~CS_STEALTH;
}
else {
- cprintf("500 5.7.0 Authentication failed.\r\n");
+ cprintf("535 5.7.0 Authentication failed.\r\n");
}
SMTP->command_state = smtp_command;
}
char buf[SIZ];
if (strncasecmp(argbuf, "login", 5) ) {
- cprintf("550 5.7.4 We only support LOGIN authentication.\r\n");
+ cprintf("504 5.7.4 We only support LOGIN authentication.\r\n");
return;
}
* be sure to phree() them first!
*/
void smtp_rset(void) {
+ int is_lmtp;
+
+ /*
+ * Our entire SMTP state is discarded when a RSET command is issued,
+ * but we need to preserve this one little piece of information, so
+ * we save it for later.
+ */
+ is_lmtp = SMTP->is_lmtp;
+
memset(SMTP, 0, sizeof(struct citsmtp));
/*
* }
*/
+ /*
+ * Reinstate this little piece of information we saved (see above).
+ */
+ SMTP->is_lmtp = is_lmtp;
+
cprintf("250 2.0.0 Zap!\r\n");
}
}
else {
- cprintf("%d Invalid command.\n", ERROR+ILLEGAL_VALUE);
+ cprintf("%d Invalid command.\n", ERROR + ILLEGAL_VALUE);
}
}