Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Отправка сообщения с помощью PowerShell (http://forum.oszone.net/showthread.php?t=267970)

rar_xxx 12-09-2013 15:10 2216675

Отправка сообщения с помощью PowerShell
 
Всем привет, у меня Microsoft Exchange Server 2010 ver. - 14.02.0318.004

Пытаюсь с помощью PowerShell отправить письмо с вложением.

Так все отлично, письмо приходит:
Код:

Send-MailMessage -From "..." -To "..." -Subject "Test #01" -Body "Just a test message."  -SMTPServer "..."
Добавляем вложение, все проходит без ошибок, но и письма нет:
Код:

Send-MailMessage -From "..." -To "..." -Subject "Test #01" -Body "Just a test message." -Attachments "E:\ABC.txt"  -SMTPServer "..."
Пробуем так, тоже все проходит без ошибок , но и письма нет, убираем блок с присоединением пустое письмо приходит:
Код:

$Server  = "..." # SMTP Сервер
$From      = "..." # Адрес отправителя
$To          = "..." # Получатель
$Subject  = "Необходима отправка меня" # Тема сообщения
$Body    = "Когда ты меня отправишь ?" # Тело сообщения
$ListFile  = Get-ChildItem "E:\att" # Вложения

$SmtpClient = New-Object System.Net.Mail.SmtpClient
$Message    = New-Object System.Net.Mail.MailMessage
$SmtpClient.Host = $Server
$Message.From    = $From
$Message.To.Add($To)
$Message.Subject = $Subject
$Message.Body    = $Body

foreach ($File in $ListFile){ 
    $Attachment = New-Object System.Net.Mail.Attachment $File.Fullname
    $Message.Attachments.Add($Attachment)
}
$SmtpClient.Send($Message)
Write-Host "Complete!"
$Message.Dispose()

Смотрел в инструментах "Проводник журнала отслеживания", пустые письма, которые доходят, в журнале видно. Те письма которые с вложениями и не доходят, в журнале нет.
Что это за прикол? куда копать ?
Я сервак не админю, но мне необходимо сделать авторассылку, стоит такая антиспам штука GFI MailEssentials, может это она может блокировать письма с вложениями, а без пропускать, от одной и той же внутренней почты? Или это в Exchange Server'е есть подобная защита ?

sunnykey 04-10-2013 15:41 2228586

Цитата:

Цитата rar_xxx
Пробуем так, тоже все проходит без ошибок , но и письма нет, убираем блок с присоединением пустое письмо приходит: »

Проверь на публичном почтовом сервере, типа mail.ru, если всё работает, то разбирайтесь со своим почтовиком.

almaz.husnullin 18-11-2013 11:31 2257002

Здравствуйте!
Помогите, пожалуйста, разобраться с проблемой.
Нужно отправить письмо из Powershell. Пользуюсь этим скриптом:

Код:

$EmailFrom = 'user1@mail.ru'
$EmailTo = 'user2@mail.ru'
$Subject = "files"
$Body = "Test"
$SMTPServer = 'smtp.mail.ru'
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
$SMTPClient.Credentials = New-Object Net.NetworkCredential("user1@mail.ru", "password");
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

Получаю такую ошибку:

Код:

Исключение при вызове "Send" с "4" аргументами: "Неправильная последовательность команд. Ответ сервера: Administrative prohibition -- authorization required.  Users in your domain are not allowed to send email without authorizati
on.  See http://help.mail.ru/mail-help/mailer/popsmtp for details."
строка:8 знак:1
+ $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SmtpException

Если использовать ящик с yandex.ru:

Код:

Исключение при вызове "Send" с "4" аргументами: "Неправильная последовательность команд. Ответ сервера: 5.5.4 Error: send AUTH command first."
строка:8 знак:1
+ $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SmtpException


Kazun 18-11-2013 12:24 2257031

Причину явно указали - неправильные учетные данные. Проверьте правильность логина и пароля.

$SMTPClient.Credentials = New-Object Net.NetworkCredential("user1@mail.ru", 'password')

almaz.husnullin 18-11-2013 12:45 2257043

спасибо. проблема действительно была в пароле, точнее в кавычках обрамляющих пароль.
В пароле содержится $ и если обрамлять такой пароль двойными кавычками, то в Powershell ISE он выделяется цветом как переменная.
Одинарные кавычки помогли.

almaz.husnullin 18-11-2013 16:43 2257212

Подскажите, пожалуйста, что нужно сделать чтобы приложенные файлы с русскими именами отображались в правильной кодировке.

Kazun 18-11-2013 16:53 2257219

Попробовать задать свойство NameEncoding:
Код:

$att = New-Object System.Net.Mail.Attachment("C:\Windows\notepad.exe")
$att.NameEncoding = [Text.Encoding]::UTF8


almaz.husnullin 18-11-2013 16:57 2257222

не помогло

Kazun 18-11-2013 17:09 2257231

Если указать имя меньше 30 символов ,проблема сохраняется?

almaz.husnullin 19-11-2013 07:33 2257660

Если имя меньше 30 символов, все норм.
Можно ли "настроить правильную кодировку" для имен длиннее 30 символов?

Kazun 19-11-2013 08:55 2257674

Попробуйте установить обновление - http://support.microsoft.com/kb/2402064

almaz.husnullin 19-11-2013 10:23 2257701

спасибо большое! обновление помогло.

almaz.husnullin 01-04-2014 13:33 2331449

Здравствуйте!
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить.

Iska 01-04-2014 13:57 2331466

Цитата:

Цитата almaz.husnullin
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить. »

Изучайте: SmtpClient.Send Method (String, String, String, String) (System.Net.Mail).

Kazun 01-04-2014 14:08 2331470

Нет, можно лишь только предполагать, что если метод Send ничего не вернул - то успех, в другом случаи возникнет исключение.

Iska 01-04-2014 15:56 2331539

Kazun, не совсем так. Нельзя получить результат доставлено ли сообщение, а вот что отправлено — вполне можно. И как раз по обработке возникающих исключений, буде таковые.

almaz.husnullin 01-04-2014 16:19 2331559

Ловить исключение trap`ом?
Такой код почему-то всегда возвращает 0.
Код:

param (
        [string[]]$To="ящик2@pupkin.ru", # Получатели
        [string[]]$CC = "", # Получатели копии
        [string[]]$BCC = "", # Получатели скрытой копии
        $Body = "", # Тело сообщения
        $Subject = "", # Тема сообщения
        [System.IO.FileInfo[]]$Attachment=@() # Вложения
)
trap [System.Net.Mail.SmtpFailedRecipientsException] {
        $res=-1
        continue
}
$res=0
Write-Verbose "Создаем объекты SmtpClient и MailMessage"
$From = "ящик1@yandex.ru" # Адрес отправителя
$Server = "smtp.yandex.ru" # SMTP Сервер
$SmtpClient = New-Object System.Net.Mail.SmtpClient
$Message = New-Object System.Net.Mail.MailMessage
Write-Verbose "Устанавливаем свойства этих объектов"
$SmtpClient.Credentials = New-Object Net.NetworkCredential($From, 'пароль')
$SmtpClient.Host = $Server
$Message.Body = $Body
$Message.IsBodyHtml = $True
$Message.Subject = $Subject
$Message.From = $From
Write-Verbose "Создаем и добавляем вложения"
$Attachment | ForEach-Object {
        $a = New-Object System.Net.Mail.Attachment($_.fullname)
        $Message.Attachments.Add($a)
}
Write-Verbose "Добавляем получателей"
$To | ForEach-Object {$Message.To.Add($_)}
If ($CC -ne "") {$CC | ForEach-Object {$Message.CC.Add($_)}}
If ($BCC -ne "") {$BCC | ForEach-Object {$Message.BCC.Add($_)}}
Write-Verbose "Отправляем сообщение"
$smtpclient.Send($Message)
$res


Kazun 01-04-2014 16:26 2331566

$res=-1 исправить на $script:res

Но лучше использовать try{$smtpclient.Send($Message)} catch {-1}

almaz.husnullin 12-09-2014 12:15 2401836

Kazun, нужна Ваша помощь!
Требуется перенастроить скрипт на отправку с помощью SSL и через порт 465.
При добавлении
Код:

$SmtpClient.Port = 465
$SmtpClient.EnableSSL = $true

появляется ошибка:
Код:

Исключение при вызове "Send" с "1" аргументами: "Время ожидания операции истекло."
C:\Powershell\Sendemail.ps1:34 знак:1
+ $smtpclient.Send($Message)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SmtpException


Kazun 12-09-2014 12:29 2401839

Для yandex измените порт с 465 на 587.

almaz.husnullin 12-09-2014 12:36 2401842

спасибо!

alexu.ku.3@fb 29-09-2014 13:52 2408326

Сенк за тему, скопипастил чуть поправил, но теперь хочу после отправки вложений переместить их в другую папку.

Write-Verbose "Добавляем получателей"
$To | ForEach-Object {$Message.To.Add($_)}
Write-Verbose "Отправляем сообщение"
$smtpclient.Send($Message)
#$res
Start-Sleep -s 10
Get-ChildItem "d:\scripts\Send1\"|where { ! $_.PSIsContainer } |select -expand fullname | foreach-object {move-item $_ -destination "d:\scripts\Send1\old\"}


Move-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
строка:35 знак:116
+ Get-ChildItem "d:\scripts\Send1\"|where { ! $_.PSIsContainer } |select -expand fullname | foreach-object {move-item <<<< $_ -destination "d:\scripts\Send1\old\"}
+ CategoryInfo : WriteError: (D:\scripts\Send1\report_77843_20140926:FileInfo) [Move-Item], IOException
+ FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

Как только закрываю окно powershell.exe файлы можно перемещать, как ему сказать отпустить файлы ? что бы можно было их перенести в одном скрипте.

Kazun 29-09-2014 14:52 2408354

Воспользоваться методом Dispose() для объекта класса Net.Mail.Attachment, а лучше использовать командлет Send-MailMessage.

alexu.ku.3@fb 29-09-2014 16:29 2408398

А как его засунуть в цикл и в одно письмо вложить 10 файлов - вот так не работает %)

Dispose() так и не понял толком куда вставить, пробовал по разному на разные переменные - не работает.



$body = Get-ChildItem | Select -Exp FullName | Out-String
if($body)
{
send-mailmessage -to "User01 <admin@t.com.ua>" -from "User02 <it@a.ua>" -Attachment $body -subject "Test mail" -SmtpServer mx.a.ua -Body "test"

Kazun 29-09-2014 16:52 2408407

1) Дохтур, у меня ЭТО! (с)

2) Изменить $body на :
Код:

$body = Get-ChildItem | Select -Exp FullName

alexu.ku.3@fb 30-09-2014 13:13 2408786

Сенк, работает.
Но опять же с перемещением отправленных вложений возникает та-же проблема.

Move-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

___

cd d:\scripts\Send1\
$body = Get-ChildItem | ?{ ! $_.PSIsContainer } | % { $_.FullName }
if($body)
{
send-mailmessage -to "User01 <a@p.com.ua>" -from "User02 <i@a.ua>" -Attachment $body -subject "Test mail" -SmtpServer m.a.ua -Body "test"
}
Start-Sleep -s 5

Get-ChildItem "d:\scripts\Send1\"|where { ! $_.PSIsContainer } |select -expand fullname | foreach-object {move-item $_ -destination "d:\scripts\Send1\old\"}


Время: 21:30.

Время: 21:30.
© OSzone.net 2001-