• Publicidad

Envio adjunto gzip con SMTP Gmail

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Envio adjunto gzip con SMTP Gmail

Notapor alberpilot » 2012-01-12 06:57 @331

Hola a todos

Escribo para ver si me pueden ayudar con un problema que tengo. Quiero mediante un script en Perl enviar un correo mediante cuenta de Gmail con archivo adjunto de tipo zip. He probado con archivo de texto plano y no hay problema pero no me deja con un tar.gz.

Este es el script.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. #use Net::SMTP::SSL;
  4. use Net::SMTP::TLS;
  5. use MIME::Base64;
  6. use MIME::Decoder::Gzip64;
  7. use File::Spec;
  8. use LWP::MediaTypes;
  9.  
  10. sub send_mail_with_attachments {
  11.  my $to = shift(@_);
  12.  my $subject = shift(@_);
  13.  my $body = shift(@_);
  14.  my @attachments = @_;
  15.  
  16.  my $from = 'remitentearrobagmail.com';
  17.  my $password = 'mipassword';
  18.  
  19.  my $smtp;
  20.  if (not $smtp = new  Net::SMTP::TLS('smtp.gmail.com',Hello=>'smtp.gmail.com',Port=>587,User=>'remitentearrobagmail.com',Password=>'mipass')) {
  21.      die "Could not connect to server\n";
  22.  }
  23.  
  24.  
  25.  # Create arbitrary boundary text used to seperate
  26.  # different parts of the message
  27.  my ($bi, $bn, @bchrs);
  28.  my $boundry = "";
  29.  foreach $bn (48..57,65..90,97..122) {
  30.      $bchrs[$bi++] = chr($bn);
  31.  }
  32.  foreach $bn (0..20) {
  33.      $boundry .= $bchrs[rand($bi)];
  34.  }
  35.  
  36.  # Send the header
  37.  $smtp->mail($from . "\n");
  38.  my @recepients = split(/,/, $to);
  39.  foreach my $recp (@recepients) {
  40.      $smtp->to($recp . "\n");
  41.  }
  42.  $smtp->data();
  43.  $smtp->datasend("From: " . $from . "\n");
  44.  $smtp->datasend("To: " . $to . "\n");
  45.  $smtp->datasend("Subject: " . $subject . "\n");
  46.  $smtp->datasend("MIME-Version: 1.0\n");
  47.  $smtp->datasend("Content-Type: multipart/mixed; BOUNDARY=\"$boundry\"\n");
  48.  
  49.  # Send the body
  50.  $smtp->datasend("\n--$boundry\n");
  51.  $smtp->datasend("Content-Type: application/zip\n");
  52.  $smtp->datasend($body . "\n\n");
  53.  
  54.  # Send attachments
  55.  foreach my $file (@attachments) {
  56.      unless (-f $file) {
  57.          die "Unable to find attachment file $file\n";
  58.          next;
  59.      }
  60.      my($bytesread, $buffer, $data, $total);
  61.      open(FH, "$file") || die "Failed to open $file\n";
  62.      binmode(FH);
  63.      while (($bytesread = sysread(FH, $buffer, 1024)) == 1024) {
  64.          $total += $bytesread;
  65.          $data .= $buffer;
  66.      }
  67.      if ($bytesread) {
  68.          $data .= $buffer;
  69.          $total += $bytesread;
  70.      }
  71.      close FH;
  72.  
  73.      # Get the file name without its directory
  74.      my ($volume, $dir, $fileName) = File::Spec->splitpath($file);
  75.  
  76.      # Try and guess the MIME type from the file extension so
  77.      # that the email client doesn't have to
  78.      my $contentType = guess_media_type($file);
  79.  
  80.      if ($data) {
  81.          $smtp->datasend("--$boundry\n");
  82.          $smtp->datasend("Content-Type: $contentType; name=\"$fileName\"\n");
  83.          $smtp->datasend("Content-Transfer-Encoding: base64\n");
  84.          $smtp->datasend("Content-Disposition: attachment; =filename=\"$fileName\"\n\n");
  85.          $smtp->datasend(encode_base64($data));
  86.          $smtp->datasend("--$boundry\n");
  87.      }
  88.  }
  89.  
  90.  # Quit
  91.  $smtp->datasend("\n--$boundry--\n"); # send boundary end message
  92.  $smtp->datasend("\n");
  93.  $smtp->dataend();
  94.  $smtp->quit;
  95. }
  96.  
  97. # Send away!
  98.  
  99. &send_mail_with_attachments('destinatarioarrobagmail.com', 'Envio de backup BD diaria', ' ', 'archivo1.tgz', 'archivo2.tgz');
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4




Y me lanza el siguiente error:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Couldn't send mail: 552 5.7.0 Our system detected an illegal attachment on your message. 


Sé que tendrá algo que ver con el tipo de archivo pero le he cambiado el "application/"

Gracias por la ayuda, un saludo.
alberpilot
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-12 06:44 @322

Publicidad

Re: Envio adjunto gzip con SMTP Gmail

Notapor explorer » 2012-01-12 07:30 @354

Bienvenido a los foros de Perl en español, alberpilot.

Haz la prueba siguiente: coge un fichero de texto, sencillo. Y lo comprimes de la misma manera que el adjunto que quieres mandar. Y luego ejecuta el programa para que envíe ese texto comprimido.

Si sale el mensaje de error, es que a Gmail no le gustan los adjuntos comprimidos de esa manera.

El mensaje de error dice que el adjunto es ilegal. Habría que ver qué significa ilegal para Gmail. ¿La extensión, el tipo de adjunto, lo que contiene el adjunto comprimido?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Envio adjunto gzip con SMTP Gmail

Notapor alberpilot » 2012-01-12 08:39 @402

Efectivamente. He probado a comprimir un texto plano sencillo y me lo ha enviado bien. Pero necesito enviar un comprimido que contiene varios .sql ¿Cómo podría hacerlo?

¡Muchas gracias por la respuesta!
alberpilot
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-12 06:44 @322

Re: Envio adjunto gzip con SMTP Gmail

Notapor explorer » 2012-01-12 14:00 @625

Pues no sé... ¿cambiando la extensión de .sql a .txt?

¿O comprimiendo en un .rar y luego en .zip?

¿No usar Gmail?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Envio adjunto gzip con SMTP Gmail

Notapor alberpilot » 2012-01-13 04:05 @212

Vale. Quería asegurarme de que mi código hacía lo que pretendía. Muchísimas gracias por la ayuda, ¡un saludo!
alberpilot
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-12 06:44 @322


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados