Como usar o Perl para conexão SMTP com o usuário e a autenticação SSL e enviar e -mails com anexo

StackOverflow https://stackoverflow.com/questions/2583987

  •  24-09-2019
  •  | 
  •  

Pergunta

Estou usando um servidor de email SMTP que exija autenticação de usuário + SSL para conexão. Estou procurando os módulos Perl para conectar -se ao servidor de email e enviar e -mails, mas não encontrou nada útil.

Qualquer sugestão para o módulo Perl ou qualquer código PERL seria realmente apreciado.

EDITAR

Eu tentei usar o Mail :: Sendmail e Net :: SMTP :: SSL para conectar -se ao servidor Sendmail e enviar e -mail. Abaixo está o código de amostra, mas o erro de erro desconhecido.

Erro:

mail: Net::SMTP::SSL=GLOB(0x9599850) not found 
RCPT TO: error (550 5.1.1 <user@mail.com>... User unknown).

Código:

#!/usr/bin/perl

use strict;
use warnings;
use Mail::Sendmail;
use Net::SMTP::SSL;

my %mail = (
From=> 'user1@server.com',
To=> 'user2@server.com',
# Cc will appear in the header. (Bcc will not)
Subject => 'Test message',
'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
);

$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465, Debug=>1);
$mail{auth} = {user=>'username', password=>"password", required=>1 };
$mail{'X-custom'} = 'My custom additionnal header';
$mail{Message} = "The message key looks terrible, but works.";
# cheat on the date:
$mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 );
if (sendmail %mail) { print "Mail sent OK.\n" }
else { print "Error sending mail: $Mail::Sendmail::error \n" }

print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;
Foi útil?

Solução

Suponho que você verificou os dados nesta linha:

$mail{auth} = {user=>'username', password=>"password", required=>1 };

O usuário é 'nome de usuário' (em seu código reallife 'user@mail.com'?) Com a senha 'senha' conhecida em email.server.com?

Se não, eu esperaria um User unknown erro.


Edit1Acabei de ver que você não tem 'para' nesse correio, 'apenas' um CC, seu servidor de e-mail não é assim (o meu não se importava, então :-), ou isso 'aconteceu' em aparar o código?


Edit2 Consegui reproduzir seu erro substituindo a linha

$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465);

com

$mail{Smtp} = Net::SMTP::SSL->new("smtp.mail.com", Port=> 465);

Você precisa dar ao correio um endereço válido para enviar a mensagem! Quando eu forneci um existente para resolver (o Cc=>'user2@server.com' linha .. funcionou!

Outras dicas

Você deve procurar essas coisas em search.cpan.org com termos como "SMTP" e "SSL". O primeiro sucesso é Net::SMTP::SSL, que se descreve como uma substituição de queda para o padrão Net::SMTP. Isso parece muito relevante; Isso faz o que você quer?

Talvez você possa tentar net :: smtp :: ssl para conectar a autentificação SSL e net :: smtp :: multipart para obter suporte para anexos e fazer algo para fazê -los trabalhar juntos.

A Comcast mudou para o SSMTP, então tive que modificar minha mensagem automatizada.

Aqui está algum código Perl de trabalho para um servidor de correio da Comcast. Espero que você ache útil.

#!/usr/bin/perl

use Net::SMTP::SSL;
use MIME::Base64;


$uptime = `uptime`;

$smtp = Net::SMTP::SSL->new
        (
        "smtp.comcast.net",
        Hello => myhost.comcast.net,
        Port => 465,
        Timeout => 30,
        Debug => 0,
        );
$smtp->datasend ("AUTH LOGIN\n");
$smtp->response();

# Mailbox info
$smtp->datasend (encode_base64('myuserid')); #username
$smtp->response();
$smtp->datasend (encode_base64('mypassword')); # password
$smtp->response();

# Email from
$smtp->mail ('myuserid@comcast.net');

# Email to
$smtp->to ('anyuser@gmail.com');

$smtp->data();

$smtp->datasend("To: anyuser@gmail.com\n");
$smtp->datasend("From: myuserid\@comcast.net\n");
$smtp->datasend("Subject: My Subject Line");

# Line break to separate headers from body
$smtp->datasend("\n");


$smtp->datasend("Uptime Report - At $uptime\n");
$smtp->dataend();

$smtp->quit();

exit;

O erro que você recebe é um RCPT para errar, não um erro de autenticação. Isso pode ser porque você realmente tentou enviar e -mail para um usuário inexistente ou porque tentou transmitir através do servidor sem autenticar.

Se parece que Mail :: Sendmail não tem suporte para o método de autenticação SMTP (http://metacpan.org/pod/mail::sendmail#limitações ) Portanto, a autenticação provavelmente nem foi tentada.

Você deve usar o método de autenticação de net :: smtp: ssl logo após criar sua instância:

$mail{Smtp}->auth('username','password');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top