--- art.c.base	Tue Jul  8 12:24:32 1997
+++ art.c	Fri Jul 11 11:45:14 1997
@@ -2732,12 +2732,6 @@
    if (-1 == slrn_check_batch ())
      return;
 
-   if (Slrn_Post_Obj->po_can_post == 0)
-     {
-	slrn_error ("Posting not allowed by server.");
-	return;
-     }
-   
    slrn_uncollapse_this_thread (Slrn_Current_Header, 1);
    if (read_article (Slrn_Current_Header, 1, 1) < 0) return;
 
@@ -2770,7 +2764,8 @@
    perform_cc = -1;		       /* Don't know */
    cc_address = NULL;
 
-   if (NULL != (newsgroups = slrn_extract_header ("Followup-To: ", 13)))
+   if (Slrn_Post_Obj->po_news &&
+       (NULL != (newsgroups = slrn_extract_header ("Followup-To: ", 13))))
      {
 	newsgroups = slrn_skip_whitespace (newsgroups);
 	cc_address = parse_from (newsgroups);
@@ -2801,15 +2796,15 @@
    
    if (Slrn_Post_Obj->po_can_post == 0)
      {
-	slrn_error ("Posting not allowed.");
+	slrn_error ("Posting not allowed by server.");
 	return;
      }
 
-   if ((newsgroups == NULL)
+   if (Slrn_Post_Obj->po_news && ((newsgroups == NULL)
        /* Hmm..  I have also seen an empty Followup-To: header on a GNU
 	* newsgroup.
 	*/
-       || (*newsgroups == 0))
+       || (*newsgroups == 0)))
      {
 	if (NULL == (newsgroups = slrn_extract_header ("Newsgroups: ", 12)))
 	  newsgroups = "";
@@ -2895,8 +2890,18 @@
 	return;
      }
    
-   fprintf (fp, "Newsgroups: %s\nSubject: Re: %s\n",
-	    newsgroups, subject);  n = 3;
+   if (Slrn_Post_Obj->po_news)
+     {
+	fprintf (fp, "Newsgroups: %s\nSubject: Re: %s\n", newsgroups, subject);
+	n = 3;
+     }
+   else
+     {
+	/* For now, assume the group name is the list e-mail address */
+	fprintf (fp, "To: %s\nSubject: Re: %s\n",
+		 Slrn_Current_Group_Name, subject);
+	n = 3;
+     }
    
    xref = slrn_extract_header("References: ", 12);
    if (msgid != NULL)
@@ -2926,9 +2931,12 @@
 	n++;
      }
    
-   fprintf (fp, "Followup-To: \n");
-   n++;
-   
+   if (Slrn_Post_Obj->po_news)
+     {
+	fprintf (fp, "Followup-To: \n");
+	n++;
+     }
+
    n += slrn_add_custom_headers (fp, Slrn_Followup_Custom_Headers, slrn_insert_followup_format);
    
    fputs ("\n", fp);
--- post.c.base	Tue Jul  8 14:25:51 1997
+++ post.c	Tue Jul  8 14:31:41 1997
@@ -380,7 +380,8 @@
 	     continue;
 	  }
 	
-	if (!slrn_case_strncmp ((unsigned char *) line, (unsigned char *) "Newsgroups:", 11))
+	if (Slrn_Post_Obj->po_news &&
+	    (!slrn_case_strncmp ((unsigned char *) line, (unsigned char *) "Newsgroups:", 11)))
 	  {
 	     if (is_empty_header (line)) 
 	       {
@@ -414,7 +415,7 @@
 	     err = "Subject header is required.";
 	     num = 0;
 	  }
-	else if (newsgroups_found == 0)
+	else if (Slrn_Post_Obj->po_news && (newsgroups_found == 0))
 	  {
 	     err = "Newsgroups header is required.";
 	     num = 0;
@@ -681,7 +682,7 @@
 	return -1;
      }
    
-   if (Slrn_User_Info.username != NULL)
+   if (Slrn_Post_Obj->po_news && (Slrn_User_Info.username != NULL))
      Slrn_Post_Obj->po_printf ("Path: %s\n", Slrn_User_Info.username);
    
    Slrn_Post_Obj->po_printf ("From: %s@%s (%s)\n", Slrn_User_Info.username, Slrn_User_Info.host, Slrn_User_Info.realname);
@@ -716,8 +717,12 @@
 		  if (Slrn_Use_Mime)
 		    slrn_mime_add_headers (0);   /* 0 --> Slrn_Post_Obj->po_puts */
 #endif
-		  Slrn_Post_Obj->po_printf ("X-Newsreader: slrn (%s %s)\n\n", Slrn_Version, 
-			       SYSTEM_OS_NAME);
+		  if (Slrn_Post_Obj->po_news)
+		    Slrn_Post_Obj->po_printf ("X-Newsreader: slrn (%s %s)\n\n",
+					      Slrn_Version, SYSTEM_OS_NAME);
+		  else
+		    Slrn_Post_Obj->po_printf ("X-Mailer: slrn (%s %s)\n\n",
+					      Slrn_Version, SYSTEM_OS_NAME);
 		  header = 0;
 #if SLRN_HAS_MIME
 		  if (Slrn_Use_Mime) fp = slrn_mime_encode (fp);
@@ -726,8 +731,9 @@
 		  continue;
 	       }
 	     
-	     if (!slrn_case_strncmp ((unsigned char *)"Cc: ", 
-				     (unsigned char *)linep, 4))
+	     if (Slrn_Post_Obj->po_news &&
+		 (!slrn_case_strncmp ((unsigned char *)"Cc: ",
+				      (unsigned char *)linep, 4)))
 	       {
 		  b = (unsigned char *) linep + 4;
 		  b = (unsigned char *) slrn_skip_whitespace ((char *) b);
--- server.c.base	Tue Jul  8 18:02:48 1997
+++ server.c	Wed Jul  9 10:08:30 1997
@@ -114,6 +114,7 @@
    Inews_Post_Obj.po_printf = inews_printf;
    Inews_Post_Obj.po_puts = inews_puts;
    Inews_Post_Obj.po_can_post = 1;
+   Inews_Post_Obj.po_news = 1;
    Slrn_Inews_Pgm = slrn_safe_strmalloc (SLRN_INEWS_PROGRAM);
    return 0;
 }
@@ -165,6 +166,98 @@
 #endif				       /* HAS_INEWS_SUPPORT */
 
 
+#if SLRN_HAS_MAIL_SUPPORT
+static FILE *Fp_Sendmail;
+
+static int mail_start_post (void)
+{
+   /* pipe a message to sendmail */
+   if (NULL == (Fp_Sendmail = slrn_popen (Slrn_SendMail_Command, "w")))
+     {
+	slrn_error ("Couldn't open pipe to sendmail! -- Article not posted.");
+	return -1;
+     }
+   return CONT_POST;
+}
+
+static int mail_end_post (void)
+{
+   int res = 0;
+   
+   if (-1 == slrn_pclose (Fp_Sendmail))
+     {
+	slrn_error ("pclose() failed -- check if article was posted"); /* !HACK! can we do better? */
+	res = -1;
+     }
+   Fp_Sendmail=NULL;
+   
+   return res;
+}
+
+static int mail_puts (char *s)
+{
+   fputs (s, Fp_Sendmail );
+   return 0;
+}
+
+static int mail_printf (char *fmt, ...)
+{
+   va_list ap;
+
+   char buf [1024];
+   
+   va_start (ap, fmt);
+   vsprintf (buf, fmt, ap);
+   va_end (ap);
+   
+   return mail_puts(buf);
+}
+
+
+static Slrn_Post_Obj_Type Mail_Post_Obj;
+
+static int mail_init_objects (void)
+{
+   Mail_Post_Obj.po_start = mail_start_post;
+   Mail_Post_Obj.po_end = mail_end_post;
+   Mail_Post_Obj.po_printf = mail_printf;
+   Mail_Post_Obj.po_puts = mail_puts;
+   Mail_Post_Obj.po_can_post = 1;
+   Mail_Post_Obj.po_news = 0;
+   return 0;
+}
+
+static int mail_select_post_object (void)
+{   
+   Slrn_Post_Obj = &Mail_Post_Obj;
+   return 0;
+}
+
+static void mail_usage (void)
+{
+   fputs ("--mail options:\n\
+",
+	  stdout);
+   exit (0);
+}
+
+static int mail_parse_args (char **argv, int argc)
+{
+   int i;
+   
+   for (i = 0; i < argc; i++)
+     {
+	if (!strcmp (argv[i], "--help"))
+	  mail_usage ();
+	else break;
+     }
+   
+   return i;
+}
+
+#endif				       /* HAS_INEWS_SUPPORT */
+
+
 int slrn_init_objects (void)
 {
    char *server;
@@ -185,6 +278,10 @@
    if (-1 == pull_init_objects ())
      return -1;
 #endif
+#if SLRN_HAS_MAIL_SUPPORT
+   if (-1 == mail_init_objects ())
+     return -1;
+#endif
    
    switch (Slrn_Server_Id)
      {
@@ -245,6 +342,11 @@
 	return pull_select_post_object ();
 #endif
 
+#if SLRN_HAS_MAIL_SUPPORT
+      case SLRN_POST_ID_MAIL:
+	return mail_select_post_object ();
+#endif
+
       default:
 	post = slrn_map_object_id_to_name (1, id);
 	if (post == NULL)
@@ -350,6 +452,17 @@
 #endif
      }
 
+   if (!strcmp (name, "mail"))
+     {
+#if SLRN_HAS_MAIL_SUPPORT
+	num_parsed = pull_parse_args (argv, argc);
+	Slrn_Post_Id = SLRN_POST_ID_MAIL;
+	return num_parsed;
+#else
+	return -2;
+#endif
+     }
+
    return num_parsed;
 }
 
@@ -585,6 +698,7 @@
    Pull_Post_Obj.po_printf = pull_printf;
    Pull_Post_Obj.po_puts = pull_puts;
    Pull_Post_Obj.po_can_post = 1;
+   Pull_Post_Obj.po_news = 1;
 
    return 0;
 }
--- server.h.base	Tue Jul  8 18:10:49 1997
+++ server.h	Tue Jul  8 18:11:16 1997
@@ -10,6 +10,7 @@
    int (*po_printf)(char *, ...);
    int (*po_puts)(char *);
    int po_can_post;
+   int po_news;
 } Slrn_Post_Obj_Type;
 
 typedef struct 
--- slrnfeat.h.base	Mon Jul  7 06:11:02 1997
+++ slrnfeat.h	Tue Jul  8 18:12:36 1997
@@ -12,6 +12,7 @@
 #define SLRN_HAS_NNTP_SUPPORT	1
 #define SLRN_HAS_SPOOL_SUPPORT	1
 #define SLRN_HAS_INEWS_SUPPORT	1
+#define SLRN_HAS_MAIL_SUPPORT	1
 /* Set this to 1 to force the user to use INEWS for posting.  This also means
  * that slrn will use the hardcoded inews program pathname.
  */
--- spool.c.base	Mon Jul  7 06:11:03 1997
+++ spool.c	Fri Jul 11 11:42:32 1997
@@ -140,7 +140,9 @@
    FILE *fp;
    
    /* The spool_dircat function will exit if it fails to malloc. */
-   p = slrn_spool_dircat (Slrn_Nov_Root, Spool_Group_Name, 1);
+   /* Don't map '.' to '/' if the group name is an email address */
+   p = slrn_spool_dircat (Slrn_Nov_Root, Spool_Group_Name,
+			  (NULL == strchr(Spool_Group_Name, '@')));
    q = slrn_spool_dircat (p, Slrn_Nov_File, 0);
    
    fp = fopen (q,"rb");
@@ -878,7 +880,9 @@
    slrn_free (Spool_Group);
    slrn_free (Spool_Group_Name);
    
-   Spool_Group = slrn_spool_dircat (Slrn_Spool_Root, name, 1);
+   /* Don't map '.' to '/' if the group name is an email address */
+   Spool_Group = slrn_spool_dircat (Slrn_Spool_Root, name,
+				    (NULL == strchr(name, '@')));
    Spool_Group_Name = slrn_safe_strmalloc (name);
    
 #if DEBUG_SPOOL
--- sysconf.h.base	Mon Jul  7 12:11:35 1997
+++ sysconf.h	Tue Jul  8 18:16:55 1997
@@ -114,6 +114,7 @@
 #define SLRN_POST_ID_NNTP 1
 #define SLRN_POST_ID_INEWS 2
 #define SLRN_POST_ID_PULL 3
+#define SLRN_POST_ID_MAIL 4
 
 #define SLRN_PATH_SLASH_CHAR	'/'
 
