'From Squeak3.3alpha of 30 January 2002 [latest update: #4857] on 11 May 2002 at 2:05:13 am'! Object subclass: #MailSender instanceVariableNames: '' classVariableNames: 'MailSenderRegistry PreferredMailSender SmtpServer UserName ' module: #(Squeak Network Applications MailSending)! !ChangeSet methodsFor: 'fileIn/Out' stamp: 'dvf 5/11/2002 00:45'! mailOut "Email a compressed version of this changeset to the squeak-dev list, so that it can be shared with everyone. (You will be able to edit the email before it is sent.)" | userName message slips | userName _ MailSender userName. self checkForConversionMethods. Cursor write showWhile: [message _ self buildMessageForMailOutWithUser: userName]. MailSender sendMessage: message. Preferences suppressCheckForSlips ifTrue: [^ self]. slips _ self checkForSlips. (slips size > 0 and: [self confirm: 'Methods in this fileOut have halts or references to the Transcript or other ''slips'' in them. Would you like to browse them?']) ifTrue: [Smalltalk browseMessageList: slips name: 'Possible slips in ' , name] ! ! !Debugger methodsFor: 'context stack menu' stamp: 'dvf 5/11/2002 00:51'! mailOutBugReport "Compose a useful bug report showing the state of the process as well as vital image statistics as suggested by Chris Norton - 'Squeak could pre-fill the bug form with lots of vital, but oft-repeated, information like what is the image version, last update number, VM version, platform, available RAM, author...' and address it to the list with the appropriate subject prefix." | messageStrm | (Smalltalk includesKey: #Celeste) ifFalse: [^ self inform: 'no mail reader present']. Cursor write showWhile: ["Prepare the message" messageStrm _ WriteStream on: (String new: 1500). messageStrm nextPutAll: 'From: '; nextPutAll: MailSender userName; cr; nextPutAll: 'To: squeak-dev@lists.squeakfoundation.org'; cr; nextPutAll: 'Subject: '; nextPutAll: '[BUG]'; nextPutAll: self interruptedContext printString; cr;cr; nextPutAll: 'here insert explanation of what you were doing, suspect changes you''ve made and so forth.';cr;cr. self interruptedContext errorReportOn: messageStrm. MailSender sendMessage: (MailMessage from: messageStrm contents)]. ! ! !HTTPClient class methodsFor: 'utilities' stamp: 'dvf 5/11/2002 00:32'! tellAFriend: emailAddressOrNil url: urlForLoading name: projectName | recipient subject body linkToInclude newText strm | recipient _ emailAddressOrNil ifNil: ['RECIPIENT.GOESHERE']. subject _ 'New/Updated Squeak project'. body _ 'This is a link to the Squeak project ' , projectName , ': ' , SimpleClientSocket crLf. linkToInclude _ urlForLoading. HTTPClient shouldUsePluginAPI ifTrue: [ self composeMailTo: recipient subject: subject body: body , (linkToInclude copyReplaceAll: '%' with: '%25')] ifFalse: [Preferences allowCelesteTell ifTrue: [newText _ String new: 200. strm _ WriteStream on: newText. strm nextPutAll: 'Content-Type: text/html'; cr; nextPutAll: 'To: ',recipient; cr; nextPutAll: 'Subject: ',subject; cr; cr; nextPutAll: '
'; cr; nextPutAll: 'write a message here'; cr; nextPutAll: '

',linkToInclude,'
'. MailSender sendMessage: (MailMessage from: strm contents)] ifFalse: [self inform: 'You need to run inside a web browser to use the tell function.']]! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 01:31'! isSmtpServerSet ^ SmtpServer notNil and: [SmtpServer notEmpty] ! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 00:37'! preferredMailSender | menu | ^PreferredMailSender ifNil: [ menu _ CustomMenu new. self registeredMailSenderClasses do: [:c | menu add: c name printString action: c]. PreferredMailSender _ menu startUp]. ! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/10/2002 23:32'! registerMailSender: aProviderClass | registeredSenders | registeredSenders := self registeredMailSenderClasses. (registeredSenders includes: aProviderClass) ifFalse: [ registeredSenders addLast: aProviderClass ]! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/10/2002 23:33'! registeredMailSenderClasses MailSenderRegistry ifNil: [MailSenderRegistry _ OrderedCollection new]. ^ MailSenderRegistry ! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 00:36'! sendMessage: aMailMessage | menu | menu _ CustomMenu new. self preferredMailSender sendMailMessage: aMailMessage.! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 01:34'! setSmtpServer "Set the SMTP server used to send outgoing messages via" SmtpServer ifNil: [SmtpServer _ '']. SmtpServer _ FillInTheBlank request: 'What is your mail server for outgoing mail?' initialAnswer: SmtpServer. ! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 00:49'! setUserName "Change the user's email name for use in composing messages." (UserName isNil) ifTrue: [UserName _ '']. UserName _ FillInTheBlank request: 'What is your email address?\(This is the address other people will reply to you)' withCRs initialAnswer: UserName isoToSqueak. UserName ifNotNil: [UserName _ UserName squeakToIso]! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 01:29'! smtpServer "Answer the server for sending email" self isSmtpServerSet ifFalse: [self setSmtpServer]. SmtpServer isEmpty ifTrue: [ self error: 'no SMTP server specified' ]. ^SmtpServer! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 00:35'! unregisterMailSender: aProviderClass | | (PreferredMailSender = aProviderClass) ifTrue: [PreferredMailSender _ nil]. self registeredMailSenderClasses remove: aProviderClass ifAbsent: [].! ! !MailSender class methodsFor: 'as yet unclassified' stamp: 'dvf 5/11/2002 00:49'! userName "Answer the user name to be used in composing messages." (UserName isNil or: [UserName isEmpty]) ifTrue: [self setUserName]. UserName isEmpty ifTrue: [ self error: 'no user name specified' ]. ^UserName! ! !MailtoUrl methodsFor: 'downloading' stamp: 'dvf 5/11/2002 00:47'! activate "Activate a Celeste window for the receiver" MailSender sendMessage: (MailMessage from: self composeText)! ! !MailtoUrl methodsFor: 'downloading' stamp: 'dvf 5/11/2002 01:00'! composeText "Answer the template for a new message." ^ String streamContents: [:str | str nextPutAll: 'From: '. str nextPutAll: MailSender userName; cr. str nextPutAll: 'To: '. str nextPutAll: locator asString; cr. str nextPutAll: 'Subject: '; cr. str cr].! ! !TheWorldMenu methodsFor: 'construction' stamp: 'dvf 5/11/2002 01:09'! openMenu "Build the open window menu for the world." | menu | menu _ self menu: 'open...'. self fillIn: menu from: { {'browser (b)' . { Browser . #openBrowser} }. {'package browser' . { PackagePaneBrowser . #openBrowser} }. {'workspace (k)' . {self . #openWorkspace} }. {'file list' . {self . #openFileList} }. {'file...' . { FileList . #openFileDirectly} }. {'transcript (t)' . {self . #openTranscript} }. "{'inner world' . { WorldWindow . #test1} }." nil. {'method finder' . { self . #openSelectorBrowser} }. {'message names (W)' . { self . #openMessageNames} }. nil. {'simple change sorter' . {self . #openChangeSorter1} }. {'dual change sorter' . {self . #openChangeSorter2} }. nil. {'web browser' . { Scamper . #openAsMorph} }. {'IRC chat' . {self . #openIRC} }. nil. }. self mvcProjectsAllowed ifTrue: [self fillIn: menu from: { {'mvc project' . {self. #openMVCProject} } }]. ^ self fillIn: menu from: { {'morphic project' . {self. #openMorphicProject} }. }.! ! TheWorldMenu removeSelector: #openEmail! Smalltalk removeClassNamed: #AdHocComposition! Smalltalk removeClassNamed: #CategoriesFile! Smalltalk removeClassNamed: #Celeste! Smalltalk removeClassNamed: #CelesteComposition! Smalltalk removeClassNamed: #CelesteTestCase! Smalltalk removeClassNamed: #FancyCelesteComposition! Smalltalk removeClassNamed: #IndexFile! Smalltalk removeClassNamed: #IndexFileEntry! Smalltalk removeClassNamed: #MHMailInboxFile! Smalltalk removeClassNamed: #MailDB! Smalltalk removeClassNamed: #MailDBFile! Smalltalk removeClassNamed: #MailInboxFile! Smalltalk removeClassNamed: #MailNotifier! Smalltalk removeClassNamed: #MessageFile! Smalltalk removeClassNamed: #RNInboxFile! Smalltalk removeClassNamed: #ReadNewsInboxFile! "Postscript: Leave the line above, and replace the rest of this comment by a useful one. Executable statements should follow this comment, and should be separated by periods, with no exclamation points (!!). Be sure to put any further comments in double-quotes, like this one." mailReaderMod _ (Module fromPath: #(Squeak Network Applications MailReader)). urlMod _ Module fromPath: #(Squeak Network Library URL). mailReaderMod moveName: #TextMessageLink toModule: urlMod. mailReaderMod moveName: #MIMEHeaderValue toModule: urlMod. mailReaderMod moveName: #MailMessage toModule: urlMod. !