(*Createanewlist:*)emailListCreate[name_String]:=Module[{dirobj},(*createthedirectoryholdingthewholelist*)dirobj=Quiet[CreateDirectory[CloudObject[name]]];(*createAPIendpoints*)CloudPublish[APIFunction[{"email"->"EmailAddress","verifier"->String},emailListSubscribe[dirobj,#email,#verifier]&,"Text"],subscribeAPIObj[dirobj]];(*createunsubscribeAPI*)CloudPublish[APIFunction[{"email"->"EmailAddress","verifier"->String},emailListUnsubscribe[dirobj,#email,#verifier]&,"Text"],unsubscribeAPIObj[dirobj]];(*createdatadirectories*)Quiet[CreateDirectory[subscribersDir[dirobj]],CreateDirectory::filex];Quiet[CreateDirectory[invitedDir[dirobj]],CreateDirectory::filex];dirobj](*Confirmedsubscribersdirectory*)subscribersDir[listObj_CloudObject]:=FileNameJoin[{listObj,"subscribers"}](*Subscribedusercloudobject*)subscribedUserObj[listObj_CloudObject,email_]:=Module[{userMail},userMail=StringSplit[email,{"@","."}];FileNameJoin[{listObj,"subscribers",StringJoin[userMail]<>".wl"}]](*Invitedusersdirectory*)invitedDir[listObj_CloudObject]:=FileNameJoin[{listObj,"invited"}](*Invitedusercloudobject*)invitedUserObj[listObj_CloudObject,email_]:=Module[{userMail},userMail=StringSplit[email,{"@","."}];FileNameJoin[{listObj,"invited",StringJoin[userMail]<>".wl"}]](*SubscribeAPIobject*)subscribeAPIObj[listObj_CloudObject]:=FileNameJoin[{listObj,"subscribe"}](*UnsubscribeAPIobject*)unsubscribeAPIObj[listObj_CloudObject]:=FileNameJoin[{listObj,"unsubscribe"}](*Returnsifamemberisinthelist.*)listMemberQ[listObj_CloudObject,userMail_String]:=FileExistsQ[FileNameJoin[{listObj,userMail<>".wl"}]](*Createsaninviteduserobject*)createInvitedUser[listObj_,email_String]:=Module[{userMail,userData,userObj},(*userMailseparatestheuseremailfromthe@symbolsoitcanbeavalidpathfortheuserObj.*)userMail=StringSplit[email,{"@","."}];If[listMemberQ[invitedDir[listObj],StringJoin[userMail]]=!=True,userData=<| "Email"->email, "Code"->generateVerificationCode[]|>;userObj=CloudPut[userData,invitedUserObj[listObj,email]];userData]](*Generatesacodeforeachinviteduser.*)generateVerificationCode[]:=IntegerString[RandomInteger[10^9],36](**Sendaninvitationemail:*ThisisanemailthatsendsalinktoconfirmtheirsubscriptionwithanAPIfunction*)emailListInvite[list_String,email_String]:=emailListInvite[CloudObject[list],email]emailListInvite[listobj_CloudObject,email_String]:=Module[{inviteObj,subscribeURL,userData},userData=createInvitedUser[listobj,email];subscribeURL=URLBuild[First[subscribeAPIObj[listobj]],{"email"->email,"verifier"->userData["Code"]}];SendMail[<| "To"->email, "Subject"->"Invitation to our subscribers list", "Body"->{"Here's the invitation ",subscribeURL}|>];](*Completelyremovetheemaillist:*)emailListDelete[listobj_]:= DeleteObject[CloudObject[listobj]](*Functiontoaddusertosubscriberslist*)emailListSubscribe[listObj_CloudObject,email_String,code_]:=Module[{userData,unsubscribeURL},userData=CloudGet[invitedUserObj[listObj,email]];unsubscribeURL=emailListUnsubscribeAPIURL[listObj,userData];(*ifobjectwasn'tfound,thentheuserwasneverinvited*)If[AssociationQ[userData],Print["userData: ",InputForm[userData]];(*IfcomparingtheuserData"Code"toquecodegiven*)If[code===userData["Code"],RenameFile[invitedUserObj[listObj,email],subscribedUserObj[listObj,email]];"Welcome, "<>email<>"\n\n Unsubscribe from the list: "<>unsubscribeURL,(*Elsethecodesdon'tmatch*)"Something went wrong."],(*userwasneversubscribed*)"Something went wrong."]](*UnsubscribeAPIURL*)emailListUnsubscribeAPIURL[listObj_CloudObject,userData_?AssociationQ]:=URLBuild[First[unsubscribeAPIObj[listObj]],{"email"->email,"verifier"->userData["Code"]}](*Listssubscribercloudobjects*)emailListSubscriberObjects[listObj_]:=CloudObjects[subscribersDir[listObj]](*Listssubscribersdata*)emailListSubscribersData[listObj_CloudObject]:=Map[CloudGet,emailListSubscriberObjects[listObj]](*Listssubscriberemails*)emailListMembers[listObj_CloudObject]:=Map[Key["Email"],emailListSubscribersData[listObj]](*Sendsemailtosubscriberslist*)emailListSend[listObj_CloudObject,subject_String,body_String]:=(*TODOwouldbenicetowrapthisinMonitorwithaProgressIndicator*)Do[SendMail[<| "To"->subscriber["Email"], "Subject"->subject, "Body"->StringTemplate["`1`\n\nUnsubscribe: `2`"][body,emailListUnsubscribeAPIURL[listObj,subscriber]]|>],{subscriber,emailListSubscribersData[listObj]}](*Listsemailsofsubscribedusers*)emailListGetSubscriberEmail[listobj_CloudObject]:=Module[{subscribers},subscribers=Map[Get,emailListSubscriberObjects[listObj]];Lookup[subscribers,"Email"]](*Functiontoremoveuserfromsubscriberslist*)emailListUnsubscribe[listObj_CloudObject,email_String,code_]:=Module[{userData},userData=CloudGet[subscribedUserObj[listObj,email]];(*ifobjectwasn'tfound,thentheuserwasnotsubscribed*)If[AssociationQ[userData],(*IfcomparingtheuserData"Code"toquecodegiven*)If[code===userData["Code"],DeleteFile[subscribedUserObj[listObj,email]];"Bye, "<>email,(*Elsethecodesdon'tmatch*)"Something went wrong."],(*userwasneversubscribed*)"Something went wrong."]]