El problema de la '@' es que la tienes dentro de una cadena de caracteres que está entrecomillada doble, y Perl piensa que lo que quieres hacer es sacar el contenido del array @servidor
La solución pasa por "escapar" la '@' para que Perl sepa que tiene que sacarlo de forma literal, y que no inicia una variable array. Eso lo haces poniendo una '\' delante de la arroba. Perl te habría avisado de esto si hubieras puesto 'use warnings;' al principio del programa.
No sé porqué estás obligada a poner un doble carácter de fin de línea, pero deberíamos saber si estamos hablando de la parte de texto simple, o de la HTML.
Te aconsejo que no uses el carácter "\r", salvo que el protocolo de red así lo indique. Por regla general, no hace falta.
Una cosilla... no hace repetir la variable en asignaciones como esta:
$cuerpoCorreo = $cuerpoCorreo . "Servicio de Compras\n\n";La forma abreviada es esta:
$cuerpoCorreo .= "Servicio de Compras\n\n";Con el siguiente programa he conseguido enviar correo con varias partes MIME:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Email::MIME;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP qw();
use Try::Tiny;
use utf8;
my $correo = Email::MIME->create(
attributes => {
content_type => 'multipart/alternative',
},
header_str => [
Subject => 'Asunto: pruebas',
],
parts => [
Email::MIME->create(
attributes => {
content_type => 'text/plain' ,
# encoding => 'quoted-printable',
charset => 'utf-8',
},
body => "Este es el cuerpo. áéíóúñÁÉÍÓÚÑ",
),
Email::MIME->create(
attributes => {
content_type => 'text/html'
},
body => '<h1>Test</h1>',
)
],
);
try {
sendmail(
$correo,
{
transport => Email::Sender::Transport::SMTP->new(
host => 'correo.servidor.com',
helo => 'nuestra.maquina.com',
port => 25,
username => 'usuario',
password => 'contraseña',
debug => 1,
)
}
);
}
catch {
print "Error enviando datos: $_";
};
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Como se ha dicho antes: el atributo content_type de attributes indica el aspecto de todo el documento. Si ponemos alternative, saldrá la versión texto o la HTML, según escoja el usuario. Si ponemos mixed, saldrán las dos. Y hay otra opción más, que no recuerdo.
Como el programa hay cadenas con caracteres con tildes, y estoy escribiendo en un editor/terminal con soporte de utf8, pongo el 'use utf8' para indicar que en todo el programa, en los literales y expresiones regulares, los caracteres están codificados de esa manera. Esto también facilita que los textos sean enviados así por correo. Y así también lo ponemos en el charset.
No me ha funcionado el
encoding => 'quoted-printable', pero creo que es una cosa propia de mi programa de correo.
El
debug => 1 sirve para ver qué está haciendo el programa.
Si, en tu caso, quieres poner adjuntos que sean imágenes, debes indicar, en la parte MIME del HTML, que se compone a su vez de un grupo de partes MIME. La primera será el HTML, y luego una por cada imagen. Cada imagen debe ser leída en formato binario, y puesta en cada parte, con un nombre.
En la página de manual de Email::MIME, en la sinopsis, vienen todos estos casos.
Lo que no está documentado es un ejemplo para ver cómo se refiere desde el código HTML a cada imagen, pero creo que era que con el nombre coincidiese, bastaba.
El propio manual aconseja el uso de
Email::Stuffer, ya que es muchísimo más fácil adjuntar los archivos y crear el HTML.