SimpleMailerImpl.mesa
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Carl Hauser, July 1, 1988 5:24:47 pm PDT
Swinehart, February 18, 1987 2:23:13 pm PST
Don Curry March 15, 1988 11:36:22 am PST
Doug Terry, July 19, 1990 1:22:18 pm PDT
Willie-s, July 1, 1992 11:10 am PDT
DIRECTORY
BasicTime, Commander, CommanderOps, Convert, MailBasics, MailBasicsItemTypes, MailSend, MailUtils, IO, Rope, SimpleMailer, SystemSite;
SimpleMailerImpl: CEDAR PROGRAM
IMPORTS BasicTime, Commander, CommanderOps, Convert, MailSend, MailUtils, IO, Rope, SystemSite
EXPORTS SimpleMailer
~ BEGIN
ROPE: TYPE = Rope.ROPE;
RName: TYPE = MailBasics.RName;
MailSendHandle: TYPE = MailSend.MailSendHandle;
defaultNames: SystemSite.Names ¬ SystemSite.Get[];
SendMessage: PUBLIC PROC [
from: ROPE ¬ NIL,
to: LIST OF RName ¬ NIL,
cc: LIST OF RName ¬ NIL,
subject: ROPE ¬ NIL,
otherHeader: ROPE ¬ NIL,
body: ROPE ¬ NIL,
validate: BOOL ¬ TRUE,
sendIfValidateFails: BOOL ¬ FALSE,
credentials: MailSend.SendingCredentialsList ¬ NIL]
RETURNS [sent: BOOL, failureReason: ROPE] ~ {
senderList: LIST OF MailUtils.Credentials ¬ MailUtils.GetUserCredentials[];
sender: RName;
invalidRecipients: MailBasics.RNameList;
header: ROPE;
transport: ATOM ¬ $any;
h: MailSendHandle;
IF senderList = NIL THEN RETURN[FALSE, "No UserCredentials"];
sender ¬ senderList.first.rName;
IF from = NIL THEN from ¬ "Anonymous";
h ¬ MailSend.Create[];
MailSend.StartSend[msH: h, credentialsList: credentials];
AddRecipients[h, to];
AddRecipients[h, cc];
MailSend.StartItem[h, MailBasicsItemTypes.header];
header ¬ ConsHeader[sender, subject, from, to, cc, otherHeader];
MailSend.AddToItem[h, header];
MailSend.StartItem[h, MailBasicsItemTypes.multinationalNote];
{
Loop here because GVSend.AddToItem doesn't deliver on its promise to be able to take any ROPE.
added: INT ¬ 0;
togo: INT ¬ body.Length[];
WHILE togo > 0 DO
thisTime: INT ¬ MIN[togo, INT16.LAST];
MailSend.AddToItem[h, body.Substr[added, thisTime]];
added ¬ added + thisTime;
togo ¬ togo - thisTime;
ENDLOOP;
};
IF to # NIL THEN
transport ¬ to.first.ns;
[sent, failureReason, invalidRecipients] ¬ MailSend.Send[h, validate, sendIfValidateFails, transport];
RETURN[sent, failureReason];
};
AddRecipients: PROC [h: MailSendHandle, recipients: LIST OF RName] = {
AddDefaultGVRegistry: PROC [name: ROPE] RETURNS [full: ROPE] = {
full ¬ IF Rope.Find[s1: name, s2: "."] = -1 THEN Rope.Cat[name, ".", defaultNames.registry] ELSE name;
};
AddDefaultCHSDomain: PROC [name: ROPE] RETURNS [full: ROPE] = {
numColons: INT ¬ 0;
i: INT ¬ Rope.Find[s1: name, s2: ":"];
IF i > -1 THEN {
numColons ¬ numColons + 1;
i ¬ Rope.Find[s1: name, s2: ":", pos1: i+1];
IF i > -1 THEN
numColons ¬ numColons + 1;
};
full ¬ SELECT numColons FROM
0 => Rope.Cat[name, ":", defaultNames.domain, ":", defaultNames.organization],
1 => Rope.Cat[name, ":", defaultNames.organization],
ENDCASE => name;
};
FOR r: LIST OF RName ¬ recipients, r.rest UNTIL r = NIL DO
recip: RName ¬ r.first;
recip.name ¬ SELECT recip.ns FROM
$gv => AddDefaultGVRegistry[recip.name],
$xns => AddDefaultCHSDomain[recip.name],
ENDCASE => recip.name;
MailSend.AddRecipient[msH: h, recipient: recip]
ENDLOOP;
};
ConsHeader: PROC [sender: RName, subject, from: ROPE, to, cc: LIST OF RName, otherHeader: ROPE]
RETURNS [ROPE] = {
dateRope: ROPE = ConsField["Date", Convert.RopeFromTimeRFC822[BasicTime.Now[]]];
senderRope: ROPE = IF from # sender.name THEN ConsField["Sender", sender.name] ELSE NIL;
subjectRope: ROPE = ConsField["Subject", subject];
fromRope: ROPE = ConsField["From", from];
toRope: ROPE = ConsListField["To", to];
ccRope: ROPE = IF cc # NIL THEN ConsListField["cc", cc] ELSE NIL;
header: ROPE = Rope.Cat[dateRope, senderRope, subjectRope, Rope.Cat[fromRope, toRope, ccRope]];
RETURN[Rope.Concat[header, otherHeader]]};
ConsField: PROC [fieldName, fieldContents: ROPE] RETURNS [ROPE] = {
RETURN [IF fieldContents.IsEmpty[] THEN NIL
ELSE IO.PutFR["%g: %g\n", IO.rope[fieldName], IO.rope[fieldContents]]]};
ConsListField: PROC [fieldName: ROPE, fieldContents: LIST OF RName] RETURNS [ROPE]= {
result: ROPE ¬ NIL;
IF fieldContents # NIL THEN {
result ¬ fieldName.Concat[": "];
DO
result ¬ result.Concat[fieldContents.first.name];
fieldContents ¬ fieldContents.rest;
IF fieldContents = NIL THEN EXIT;
result ¬ result.Concat[", "];
ENDLOOP;
result ¬ result.Concat["\n"]
};
RETURN [result.Flatten[]]
};
SimpleSendCmd: Commander.CommandProc = {
to, subject, from, body: ROPE;
sent: BOOL;
to ¬ CommanderOps.NextArgument[cmd];
subject ¬ CommanderOps.NextArgument[cmd];
body ¬ CommanderOps.NextArgument[cmd];
from ¬ CommanderOps.NextArgument[cmd];
IF ( to = NIL ) OR ( subject = NIL ) THEN {
result ¬ $Failure;
msg ¬ usage;
RETURN;
};
[sent, msg] ¬ SendMessage[from: from, to: LIST[[$xns, to]], subject: subject, body: body];
IF sent THEN {
msg ¬ "Message has been sent\n";
RETURN;
};
result ¬ $Failure;
msg ¬ Rope.Concat["Message NOT sent: ", msg];
};
usage: ROPE ~ "usage: to subject {body from}\n";
Commander.Register["SimpleSend", SimpleSendCmd, usage];
END.