nie wiem czego używasz do wysyłania ale to jakaś pomyłka. Pobaw się Synapse - przy jego pomocy zrobiłem sobie moduł do wysyłania emaili i spokojnie śle maile po kilka MB. Nie interesuje mnie żadne dzielenie na bloki, czy coś takiego - podaję mu cały plik a on już sam sobie to dzieli i wysyła. Poniżej masz kawałek kodu - może to Ci rozjaśni sprawę
function TSMTPSend.MailData(const Value: TStrings): Boolean;
var
n: Integer;
s: string;
t: string;
x: integer;
begin
Result := False;
t := '';
x := 1500; //"ozmiar" pakietu
for n := 0 to Value.Count - 1 do
begin
s := Value[n]; //pobranie n-tej lini
if Length(t) + Length(s) >= x then //sprawdzenie, czy "przepełnienie" bufora
begin //jak tak to wysłanie bufora i wyczyszczenie
FSock.SendString(t);
t := '';
end;
t := t + s + CRLF; //dodanie do bufora kolejnej lini i CRLF
end;
if t <> '' then //wysłanie "końcówki"
FSock.SendString(t);
FSock.SendString('.' + CRLF); // . to znak końca maila
Result := ReadResult = 250;
end;
jak widzisz nie ma tu żadnego sleep. Funkcja SendString sama blokuje wykonywanie dalszego kodu aż nie zostaną wysłane WSZYSTKIE dane z bufora.
I jeszcze małe info, dlaczego dane są jako TStringList - otóż załączniki przed wysłaniem są kodowane (np. do BASE64) i można je spokojnie przekazać razem z treścią właściwą maila jako string.