'From Squeak3.3alpha of 30 January 2002 [latest update: #4857] on 17 May 2002 at 1:28:11 pm'!
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!
Celeste class removeSelector: #userName!
Celeste class removeSelector: #setUserName!
Celeste class removeSelector: #isSmtpServerSet!
Celeste class removeSelector: #setSmtpServer!
Celeste class removeSelector: #smtpServer!
Smalltalk removeClassNamed: #AdHocComposition!
Smalltalk removeClassNamed: #FancyCelesteComposition!
Smalltalk removeClassNamed: #CelesteComposition!