0

基本的な電子メールを送信するための UI を設計しました。

    SMTPClient  
    deliverMailFrom: sender
to: recipients
text: message
usingServer: '' .

ユーザーからのすべてのヘッダーを対象として、電子メールを取得するメソッドがあります。これが私の方法です。

 AddHeader:Headername Email: asString Message:message --> "I want to update this"

 " update is nothing but adding dictionay values to that "
|data|
 data:= Dictionary new.
 'To'= Headername ifTrue[data at:#To put:Email.].
 'From'= Headername ifTrue[data at: #From put:Email].
 'subject'= Headername ifTrue[data at: #subject put:Email].

"adding dicitonay values to message"
message:= String streamContents:[:stream|
data values do:[:each| stream nextPutAll: each ]
    separatedBy: [ stream nextPut: Character space ]].

このメソッドを保存しようとすると、メッセージに保存できないというエラーが表示されます。すでに定義されているメッセージに値を追加する正しい方法は何ですか。

また、辞書から追加されたその他の値は、配置された順序では追加されません。これらの値を順番に追加して、To first、From next、次に subject..

4

1 に答える 1

2

エラーだけを求めているのか、コードの動作に加えて何か他のことを達成しようとしているのかはわかりません。コードが散らばっていて不完全なので、適切な答えを出すことはできませんが、あなたのコードに似たコードを適用すると、うまくいくようです:

|data|
data:= Dictionary new.
('To'= 'To') ifTrue: [data at:#To put:'someone@mail.com'].
('To'= 'Another thing') ifTrue: [data at:#To put:'shouldnt appear'].
data at:#From put:'me@mail.com'.

message:= String streamContents:
            [:stream|
                    data values 
                            do:[:each| stream nextPutAll: each ]
                            separatedBy: [ stream nextPut: Character space ]].

これをワークスペースにコピーしてdata内容を調べると、次のようになりますByteString 'someone@mail.com me@mail.com'。しかし、あなたはすでにこの仕事を成し遂げたと思います。探しているものについてもう少し詳しく説明し、コーディングしたとおりに完全なコードを入れていただけますか?

OPの明確化に基づいて編集

さて、問題がわかりました。message問題は、Smalltalk には "out" パラメーターがないため、コンパイラーは新しい内容をパラメーターに格納できないことを伝えているのです。メッセージを送信するオブジェクトの観点からは、メッセージは、オブジェクトにアクションを実行するように指示し、必要なコラボレーターをそのオブジェクトに渡して実行するように送信されることがわかります。メッセージ送信からの応答がある場合、それは戻り値にあると予想されます。それを行うために、ここであなたのメソッドを少し書き直しました:

addHeader: headerName email: aString message: aMessage 

| data newValues |

 data:= Dictionary new.
 'To'= headerName ifTrue: [data at:#To put: aString.].
 'From'= headerName ifTrue: [data at: #From put: aString].
 'subject'= headerName ifTrue: [data at: #subject put: aString].

"adding dicitonay values to message"
newValues := String streamContents:[:stream|
data values do:[:each| stream nextPutAll: each ]
    separatedBy: [ stream nextPut: Character space ]].
^aMessage  , newValues.

ご覧のとおり、#,メッセージを使用して 2 つの文字列を結合し、新しい値を返すという考え方です。ここで注意すべき点は次のとおりです。

  1. より一般的な大文字パターンを使用するために、名前を少し変更しました。
  2. #asSymbolif ステートメントを避けるために、メッセージを確認することをお勧めします。

HTH

于 2013-01-28T19:23:02.133 に答える