Pues... lleva un trabajo...
Debes convertir el fichero en base 64. Luego, en la cabecera del correo debes indicar que el contenido es de tipo múltiple, algo como esto:
Content-Type: multipart/mixed; boundary="===============1887506022=="Luego, en el cuerpo, debes agregar tantas entradas como partes distintas tenga el mensaje. Lo normal es que exista un poco de texto, aparte del fichero adjunto. Te recomiendo que veas el código fuente de un correo con un adjunto para que veas cómo se pueden crear y separar esas partes.
Yo he escogido uno al azar y me sale esto:
Using text Syntax Highlighting
This is a multi-part message in MIME format.
--===============1887506022==
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_0007_01CAA402.25882650"
Content-Language: es-ar
This is a multi-part message in MIME format.
------=_NextPart_000_0007_01CAA402.25882650
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
que, curiosamente, indica otra forma de indicar las distintas partes del correo: de forma tradicional vale con separar las partes con la cadena indicada en la cabecera del correo, pero en este texto ves que se pueden tener subcontenidos, indicando otra línea de separación distinta de la principal.
Lo normal es que las partes se inicien así:
Using text Syntax Highlighting
--===============1887506022==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
En la parte del adjunto, codificada en base 64 (por ejemplo), metes el flujo de bytes del adjunto, poniendo una cabecera correcta (indicando que sea base 64). Y ya está... (puff)
Casi mejor si usas un módulo de Perl que te lo da todo hecho, como por ejemplo
Email::Stuff:
Using perl Syntax Highlighting
use Email
::Stuff;
Email
::Stuff->from ('[email protected]' )
->to ('[email protected]' )
->text_body('Te envío el documento PDF')
->attach (filename
=> 'documento.pdf')
->send;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4