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]; { 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. „ 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 Loop here because GVSend.AddToItem doesn't deliver on its promise to be able to take any ROPE. ΚΌ–(cedarcode) style•NewlineDelimiter ™šœ™Jšœ Οeœ1™