Script Powershell para enviar e-mails, perdendo texto em anexo de e-mail

2

Eu tenho a seguinte função para enviar e-mails no powershell com anexos:

param
(    
[parameter(Mandatory = $false)]
[string]$l
)

function SendMail(){
if($e -ine '')
{
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = $f;
$mail.To.Add($t);
$mail.Subject = $s;
$att = New-Object System.Net.Mail.Attachment –ArgumentList $l
$mail.Attachments.Add($att)
$mail.Body = $b;
$smtp = New-Object System.Net.Mail.SmtpClient($serv);
$smtp.Send($mail);
}
}

Quando tento enviar um anexo de arquivo .txt, ele parece remover todas as informações do arquivo de texto. Alguma sugestão sobre o que está errado?

    
por Beuy 11.05.2010 / 01:47

3 respostas

2

Eu basicamente usei o mesmo código - e uma grande variedade de anexos ficou bem. Estou bastante confiante de que seu problema está fora do PowerShell - você tem um SPAM ou outra configuração de filtro no servidor SMTP com o qual está se comunicando? existe outro servidor SMTP com o qual você pode conversar limpo?

Para referência, aqui está o código de exemplo que eu estava ajustando os parâmetros para testar:

function SendMail() {
  # create mail message
  $mail = New-Object System.Net.Mail.MailMessage
  $mail.From = "[email protected]"
  $mail.To.Add("[email protected]")
  $mail.Subject = "Here is your attached file"
  $mail.Body = "See attached file"
  # create attachment
  $att = New-Object System.Net.Mail.Attachment "C:\Test.txt"
  $mail.Attachments.Add($att)
  # send email
  $smtp = New-Object System.Net.Mail.SmtpClient("mail.serverfault.com")
  $smtp.Send($mail)
}
    
por 11.05.2010 / 17:26
2

Você pode reduzir significativamente o código usando Send-MailMessage (o cmdlet V2 para envio por email). Isso também pode resolver seu problema, por causa de algumas coisas:

  • Os detalhes do .NET ficarão ocultos, para que você não precise se preocupar com a construção incorreta de um objeto.
  • É muito mais provável que os cmdlets processem os caminhos corretamente. Um problema muito comum do PowerShell ao interagir no .NET é que você deve se referir a coisas por um diretório absoluto. Embora o sistema tenha um conceito de um diretório de trabalho atual, como um diretório do PowerShell pode estar no sistema de arquivos ou pode estar no registro, o diretório atual do .NET raramente está sincronizado com o diretório atual do PowerShell.

Um exemplo que usa Send-MailMessage está abaixo. Nele, uma hashtable de parâmetros é criada e, usando o @ em vez de $ na frente do nome da variável, cada um dos parâmetros se torna um parâmetro para Send-MailMessage.

Para mais exemplos, consulte: Enviando e-mails automatizados com Send-MailMessage, ConvertTo-HTML e o módulo Agendador de Tarefas do PowerShell Pack

function SendMail($Attachment) { 
    # create mail message 
    $MessageParameters = @{
        From = "[email protected]"
        To = "[email protected]"
        Subject = "Here is your attached file"
        Body = "See attached file"
        Attachments = $Attachment        
        SmtpServer = "mail.serverfault.com"        
    }
    Send-MailMessage @MessageParameters 
}

Acredito que essa é uma forma muito mais "PowerShell" de fazer as coisas, e espero que ela se livre do problema.

Espero que isso ajude,

James

    
por 10.06.2010 / 02:15
0

if ($ e -ine '') -ine parece ser um erro de digitação?

você realmente deve incluir os valores ... Quando você cria o anexo, maxybe há um problema com o caminho ou o nome do arquivo? Tente usar o "FullName" (caminho + nome do arquivo) do arquivo.

    
por 11.05.2010 / 11:20

Tags