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
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.