Судя по коду, у вас лишние переводы строки внутри заголовков письма.
Код письма должен выглядеть так:
... Здесь основная часть заголовка...
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=abcdef
Content-Transfer-Encoding: 7bit
This is a message in multipart MIME format.
--abcdef
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Привет!
--abcdef
Content-Type: application/xlsx; name=hello.xlsx
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=hello.xlsx
/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJ
...
/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJ
--abcdef--
Обратите внимание, что блок заголовков начинается с --boundary, внутри себя пустых строк не содержит, заканчивается первой же пустой строкой, после которой идут данные до следующего --boundary.