home *** CD-ROM | disk | FTP | other *** search
- % Mail for VMS and Unix systems
- %
- % On VMS, this uses callable mail interface.
- % For Unix, uses /usr/ucb/mail
- %
- % Calls mailhook if defined. "mail_hook" can either load a file
- % to override some of the functions here. This is because one cannot
- % define a function from within a function unless one writes the function
- % as a string and evals the string. For example:
- %
- % define create_sum_function ()
- % {
- % eval ("define sum (x, y) { x + y; }");
- % }
- %
-
-
- #ifdef UNIX
- %%% University of Calififornia, Berkeley mail program
- %%% "/usr/ucb/mail" on most unix, "/usr/sbin/Mail" on others
-
- !if (is_defined("UCB_Mailer"))
- {
- variable UCB_Mailer;
- UCB_Mailer = "/usr/ucb/mail";
- if (1 != file_status(UCB_Mailer))
- {
- UCB_Mailer = "/usr/sbin/Mail";
- if (1 != file_status (UCB_Mailer))
- {
- error ("UCB Mail program not found!");
- }
- }
- }
-
- define unix_send_mail (to, cc, subj)
- {
- subj = str_quote_string (subj, "'", '\'');
- % This is a total crock. For ucb mail, we need to 'quote' lines beginning
- % with '~'. Lets do it now:
- check_region (0);
- dupmark(); pop();
- narrow ();
- bob();
- while (bol_fsearch("~")) insert (" ");
- bob ();
- if (strlen(cc))
- {
- push_spot ();
- insert (Sprintf("~c %s\n", cc, 1));
- }
- eob();
- widen();
- pipe_region (Sprintf("%s -s '%s' '%s'", UCB_Mailer, subj, to, 3));
- if (strlen(cc))
- {
- pop_spot ();
- delete_line();
- }
-
- }
-
- #endif
-
-
- variable Mail_Previous_Buffer = Null_String;
- variable Mail_Previous_Windows = 1;
-
- define send ()
- {
- variable mail_cmd, to = Null_String, subj = Null_String;
- variable dir, file, cc = Null_String, sent;
-
- push_spot ();
- bob ();
-
- !if (bol_fsearch ("---text follows this line---"))
- {
- pop_spot ();
- error ("Failed to find text divider.");
- }
-
- push_mark ();
- bob (); narrow ();
- if (re_fsearch("^To:[ \t]*\\(.*\\)"))
- {
- to = regexp_nth_match (1);
- }
- if (re_fsearch("^Cc:[ \t]*\\(.*\\)"))
- {
- cc = regexp_nth_match (1);
- }
- if (re_fsearch("^Subject:[ \t]*\\(.*\\)"))
- {
- subj = regexp_nth_match (1);
- }
-
- eob();
- widen ();
-
- !if (strlen(to))
- {
- pop_spot ();
- error ("Bad To: field.");
- }
- #ifdef VMS
- if (strlen(cc))
- {
- to = strcat (strcat(to, ","), cc);
- }
- #endif
-
- !if (down(1))
- {
- pop_spot();
- error ("No message!");
- }
-
- push_mark ();
- eob ();
- flush("Sending...");
-
- #ifdef UNIX
- sent = unix_send_mail (to, cc, subj);
- #endif
- #ifdef VMS
- narrow();
- sent = vms_send_mail (to, subj);
- widen ();
- #endif
- if (sent)
- {
- flush ("Sending...done");
- set_buffer_modified_flag (0);
- getbuf_info(); pop(); pop(); =dir; =file;
- delete_file (make_autosave_filename(dir, file)); pop();
- }
- else
- {
- message ("No message sent.");
- }
-
- pop_spot ();
- whatbuf();
- if (bufferp(Mail_Previous_Buffer)) sw2buf (Mail_Previous_Buffer);
- if (1 == Mail_Previous_Windows) onewindow();
- bury_buffer(());
- }
-
- add_completion("send");
-
- define mail_format_buffer ()
- {
- variable mail_map = "mail_map";
- erase_buffer();
- text_mode();
- insert("To: \nCc: \nSubject: \n---text follows this line---\n");
- bob(); eol();
- set_buffer_modified_flag(0);
- set_buffer_undo(1);
- !if (keymap_p(mail_map)) make_keymap(mail_map);
- use_keymap(mail_map);
- }
-
- define mail()
- {
- variable mail_buf, old, status;
- mail_buf = "*mail*";
- variable file, dir;
-
- old = bufferp(mail_buf);
- Mail_Previous_Windows = nwindows();
- Mail_Previous_Buffer = pop2buf_whatbuf(mail_buf);
-
- %% if buffer is not old, turn autosave on
- if (old == 0)
- {
- #ifdef VMS
- dir = "sys$login:";
- #else
- dir = dircat(getenv("HOME"), Null_String);
- #endif
- file = "__jed_mail__";
- setbuf_info(file, dir, mail_buf, 2);
- }
- else
- {
- status = getbuf_info() & 1; pop(); pop(); pop();
- if (status) return();
- }
-
- mail_format_buffer ();
- runhooks("mail_hook");
- }
-
-