'From Squeak3.7alpha of 11 September 2003 [latest update: #5816] on 23 March 2004 at 5:17:18 pm'! "Change Set: SMTPClientBracket-fbs Date: 23 March 2004 Author: Frank Shearer Allows sender email addresses of the form ""Someone"" or as well as someone@somewhere Upon further inspection (in RFC 2821), MAIL FROM takes a reverse-path. So MailAddressParser Does The Right Thing already. Whee. Herewith attached then a changeset with my previously-mentioned implementation, plus a suitably amended test case. -- Frank (Updated changeset comment. -dew) "! Stream subclass: #MockSocketStream instanceVariableNames: 'atEnd inStream outStream' classVariableNames: '' poolDictionaries: '' category: 'Network-Kernel-Test'! TestCase subclass: #SMTPClientTest instanceVariableNames: 'smtp socket' classVariableNames: '' poolDictionaries: '' category: 'Network-Protocols-Test'! !MockSocketStream methodsFor: 'accessing' stamp: 'fbs 3/22/2004 12:51'! atEnd: aBoolean atEnd := aBoolean.! ! !MockSocketStream methodsFor: 'accessing' stamp: 'fbs 3/22/2004 13:29'! inStream ^inStream! ! !MockSocketStream methodsFor: 'accessing' stamp: 'fbs 3/22/2004 13:08'! outStream ^outStream! ! !MockSocketStream methodsFor: 'initialize-release' stamp: 'fbs 3/22/2004 13:29'! initialize self resetInStream. self resetOutStream.! ! !MockSocketStream methodsFor: 'stream in' stamp: 'fbs 3/22/2004 13:10'! nextLine ^self nextLineCrLf! ! !MockSocketStream methodsFor: 'stream in' stamp: 'fbs 3/22/2004 13:09'! nextLineCrLf ^(self upToAll: String crlf).! ! !MockSocketStream methodsFor: 'stream in' stamp: 'fbs 3/22/2004 13:28'! resetInStream inStream := WriteStream on: ''.! ! !MockSocketStream methodsFor: 'stream in' stamp: 'fbs 3/22/2004 13:09'! upToAll: delims ^self inStream upToAll: delims.! ! !MockSocketStream methodsFor: 'stream out' stamp: 'fbs 3/22/2004 13:28'! resetOutStream outStream := WriteStream on: ''.! ! !MockSocketStream methodsFor: 'stream out' stamp: 'fbs 3/22/2004 13:07'! sendCommand: aString self outStream nextPutAll: aString; nextPutAll: String crlf.! ! !MockSocketStream methodsFor: 'testing' stamp: 'fbs 3/22/2004 13:08'! atEnd ^self inStream atEnd.! ! !MockSocketStream class methodsFor: 'instance creation' stamp: 'fbs 3/22/2004 12:46'! on: socket ^self basicNew initialize! ! !SMTPClient methodsFor: 'private protocol' stamp: 'fbs 3/23/2004 17:16'! mailFrom: fromAddress " MAIL FROM: " | address | address _ (MailAddressParser addressesIn: fromAddress) first. self sendCommand: 'MAIL FROM: <', address, '>'. self checkResponse.! ! !SMTPClientTest methodsFor: 'running' stamp: 'fbs 3/22/2004 13:11'! setUp socket := MockSocketStream on: ''. smtp := SMTPClient new. smtp stream: socket.! ! !SMTPClientTest methodsFor: 'testing' stamp: 'fbs 3/23/2004 17:15'! testMailFrom smtp mailFrom: 'frank@angband.za.org'. self assert: socket outStream contents = ('MAIL FROM: ', String crlf). socket resetOutStream. smtp mailFrom: ''. self assert: socket outStream contents = ('MAIL FROM: ', String crlf). socket resetOutStream. smtp mailFrom: 'Frank '. self assert: socket outStream contents = ('MAIL FROM: ', String crlf).! ! MockSocketStream removeSelector: #outboundData! MockSocketStream removeSelector: #outboundStream! !MockSocketStream reorganize! ('accessing' atEnd: inStream outStream) ('initialize-release' initialize) ('stream in' nextLine nextLineCrLf resetInStream upToAll:) ('stream out' resetOutStream sendCommand:) ('testing' atEnd) !