SendToEx does it very well.
Here is an old console program, where I use it:
var from, receiver,subject,line: string;
sl: TStringList;
i: Integer;
begin
from := 'default sender @ somewhere';
receiver:= 'default receiver @ somewhere';
for i:=1 to Paramcount do
if ParamStr(i) = '--from' then from := ParamStr(i+1)
else if ParamStr(i) = '--to' then receiver:= ParamStr(i+1)
else if ParamStr(i) = '--subject' then subject:= ParamStr(i+1);
sl:= TStringList.Create;
while not eof(Input) do begin
ReadLn(line);
sl.Add(Utf8ToAnsi(line));
end;
SendToEx(from,receiver,'=?utf-8?B?'+ EncodeBase64(subject)+ '?=','<your smtp server>',sl,'<your username>','<your password>');
end.