Назад | Перейти на главную страницу

Скрипт Powershell для отправки электронной почты с потерей текста во вложении электронной почты

У меня есть следующая функция для отправки электронных писем в PowerShell с вложениями:

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);
}
}

Когда я пытаюсь отправить вложение файла .txt, кажется, что из текстового файла вырезается вся информация. Есть предложения относительно того, что происходит не так?

Я в основном использовал ваш тот же код - и большое количество вложений все прошло нормально. Я почти уверен, что ваша проблема не в PowerShell - есть ли у вас настроенный фильтр спама или другой фильтр на SMTP-сервере, с которым вы общаетесь? есть ли еще один чистый SMTP-сервер, с которым вы можете поговорить?

Для справки, вот пример кода, с которым я настраивал параметры для тестирования:

function SendMail() {
  # create mail message
  $mail = New-Object System.Net.Mail.MailMessage
  $mail.From = "Beuy@serverfault.com"
  $mail.To.Add("Beuy@serverfault.com")
  $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)
}

Вы можете значительно сократить код, используя Send-MailMessage (командлет V2 для электронной почты). Это также может решить вашу проблему по нескольким причинам:

  • Детали .NET будут скрыты от вас, поэтому вам не придется беспокоиться о неправильном построении объекта.
  • Более вероятно, что командлеты будут правильно обрабатывать пути. Очень распространенная проблема PowerShell при взаимодействии в .NET заключается в том, что вам нужно обращаться к объектам через абсолютный каталог. Хотя система имеет понятие текущего рабочего каталога, поскольку каталог PowerShell может находиться в файловой системе или может находиться в реестре, текущий каталог .NET редко синхронизируется с текущим каталогом PowerShell.

Пример, который использует Send-MailMessage, приведен ниже. В нем создается хэш-таблица параметров, и при использовании символа @ вместо $ перед именем переменной каждый из параметров становится параметром для Send-MailMessage.

Дополнительные примеры см .: Отправка автоматических писем с помощью Send-MailMessage, ConvertTo-HTML и модуля планировщика задач пакета PowerShell

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

Я считаю, что это гораздо более "PowerShell" способ делать что-то, и я надеюсь, что он избавит вас от вашей проблемы.

Надеюсь это поможет,

Джеймс

if ($ e -ine '') -ine кажется опечаткой?

вы действительно должны включать значения ... При создании вложения maxybe возникает проблема с путем или именем файла? Попробуйте использовать "FullName" (путь + имя файла) файла.