sendmail com html e conteúdo de arquivo

2

Eu preciso enviar o conteúdo de um arquivo em um e-mail e adicionar algumas notas html no início e no final do arquivo. Eu usei o "sendmail" para o propósito, no entanto quando eu recebo o email eu não vejo a linha quebrada no outlook causando o problema. Eu tentei usar o comando "mail", mas não sei como adicionar notas HTML a ele. Aqui está o trecho que eu tenho:

open(my $sendmail,"|/usr/sbin/sendmail -t");
print $sendmail "From: linux\@test.com\n";
print $sendmail "To: kris\@test.com\n";
print $sendmail "Content-Type: text/html\n";
print $sendmail "Subject: My Test\n";
print $sendmail "\n";
my $Header = << 'END';
    <html>
            <head>
                    <h3><font color="red">For test</font></h3>
            </head>
            <body>
                    <h3><font color="red">For test</font></h3>
                    <br/>
            </body>
    </html>
END


print $sendmail $Header;    
print $sendmail "<br>Ran for time:  \n";
my $alert3 = '/bin/cat /home/kris/test.txt';
print $sendmail $alert3;


close($sendmail);

enquanto isso funciona muito bem para enviar o e-mail, o conteúdo do arquivo em "alert3" vem em uma única linha vs vários quando você faz o gato. Eu também alterei as opções de quebra de linha no Outlook sem sorte. Existe alguma maneira melhor de lidar com essas situações?

    
por Kris Rav 08.11.2017 / 16:29

2 respostas

1

|/usr/sbin/sendmail -t truncará mensagens se . for escrito como uma linha, entre outros problemas. Além disso, há uma clara falta de verificação de erros e outros problemas ( open pode falhar, o bifurcação cat é uma maneira mais cara e complicada, propensa a erros, de ler o conteúdo de um arquivo).

Com o perl moderno, pode-se usar o Email :: Stuffer , o que simplifica bastante a tarefa de construir adequadamente o MIME válido partes via Email :: MIME . Vamos instalar isso ...

$ cpanm Email::Stuffer
...
12 distributions installed
$ 

Eu tenho App :: cpanminus e local :: lib ; existem outras maneiras de organizar os módulos, se necessário, como pacotes de fornecedores, caixa ou assim por diante.

Agora, o código de envio será parecido com

#!/usr/bin/env perl
use strict;
use warnings;

use Email::Stuffer;

my $the_html = <<'END';
<html><body><h3><font color="red">test</font></h3><br/></body></html>
END

Email::Stuffer
  ->from('[email protected]')
  ->to('[email protected]')
  ->subject('test test')
  ->html_body($the_html)
  ->attach_file('/home/kris/test.txt')
  ->send;

Se o conteúdo /home/kris/test.txt precisar ser misturado no meio do HTML e não anexado como um arquivo distinto, o código relacionado a HTML poderá ser semelhante a (sim, mais módulos ...)

use Email::Stuffer;
use File::Slurper 'read_text';

my $the_html = <<'HEAD';
<html><body><h3><font color="red">test</font></h3><br/>
HEAD

$the_html .= read_text('/home/kris/test.txt');

$the_html .= <<'TAIL';
</body></html>
TAIL

Email::Stuffer
  ->from('[email protected]')
  ->to('[email protected]')
  ->subject('test test')
  ->html_body($the_html)
  ->send;

embora existam módulos de modelo HTML que podem incluir arquivos entre outros recursos, se você quiser algo mais do que colar as strings juntas e esperar que o HTML funcione.

    
por 08.11.2017 / 18:35
0

Esta será a renderização do outlook ignorando as quebras, e não o seu script não as enviando, mas duvido que o comportamento do outlook possa realmente ser criticado aqui: o html ignora as quebras de linha e o seu conteúdo está marcado como html. Use a marcação adequada Multipurpose Internet Mail Extensions para uma mensagem de multiparte . Aqui está o exemplo da página vinculada:

As a very simple example, the following multipart message has two parts, both of them plain text, one of them explicitly typed and one of them implicitly typed:

 From: Nathaniel Borenstein <[email protected]> 
 To:  Ned Freed <[email protected]> 
 Subject: Sample message 
 MIME-Version: 1.0 
 Content-type: multipart/mixed; boundary="simple 
 boundary" 

 This is the preamble.  It is to be ignored, though it 
 is a handy place for mail composers to include an 
 explanatory note to non-MIME compliant readers. 
 --simple boundary 

 This is implicitly typed plain ASCII text. 
 It does NOT end with a linebreak. 
 --simple boundary 
 Content-type: text/plain; charset=us-ascii 

 This is explicitly typed plain ASCII text. 
 It DOES end with a linebreak. 

 --simple boundary-- 
 This is the epilogue.  It is also to be ignored.

The use of a Content-Type of multipart in a body part within another multipart entity is explicitly allowed. In such cases, for obvious reasons, care must be taken to ensure that each nested multipart entity must use a different boundary delimiter. See Appendix C for an example of nested multipart entities.

então coloque as partes html em text / html parts, o texto simples em text / plain parts.

    
por 08.11.2017 / 17:04