Войти

Показать полную графическую версию : Отправка сообщения с помощью PowerShell


Страниц : [1] 2

rar_xxx
12-09-2013, 15:10
Всем привет, у меня 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
Пробуем так, тоже все проходит без ошибок , но и письма нет, убираем блок с присоединением пустое письмо приходит: »
Проверь на публичном почтовом сервере, типа mail.ru, если всё работает, то разбирайтесь со своим почтовиком.

almaz.husnullin
18-11-2013, 11:31
Здравствуйте!
Помогите, пожалуйста, разобраться с проблемой.
Нужно отправить письмо из 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
Причину явно указали - неправильные учетные данные. Проверьте правильность логина и пароля.

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

almaz.husnullin
18-11-2013, 12:45
спасибо. проблема действительно была в пароле, точнее в кавычках обрамляющих пароль.
В пароле содержится $ и если обрамлять такой пароль двойными кавычками, то в Powershell ISE он выделяется цветом как переменная.
Одинарные кавычки помогли.

almaz.husnullin
18-11-2013, 16:43
Подскажите, пожалуйста, что нужно сделать чтобы приложенные файлы с русскими именами отображались в правильной кодировке.

Kazun
18-11-2013, 16:53
Попробовать задать свойство NameEncoding:
$att = New-Object System.Net.Mail.Attachment("C:\Windows\notepad.exe")
$att.NameEncoding = [Text.Encoding]::UTF8

almaz.husnullin
18-11-2013, 16:57
не помогло

Kazun
18-11-2013, 17:09
Если указать имя меньше 30 символов ,проблема сохраняется?

almaz.husnullin
19-11-2013, 07:33
Если имя меньше 30 символов, все норм.
Можно ли "настроить правильную кодировку" для имен длиннее 30 символов?

Kazun
19-11-2013, 08:55
Попробуйте установить обновление - http://support.microsoft.com/kb/2402064

almaz.husnullin
19-11-2013, 10:23
спасибо большое! обновление помогло.

almaz.husnullin
01-04-2014, 13:33
Здравствуйте!
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить.

Iska
01-04-2014, 13:57
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить. »
Изучайте: SmtpClient.Send Method (String, String, String, String) (System.Net.Mail) (http://msdn.microsoft.com/en-us/library/h1s04he7(v=vs.110).aspx).

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

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

almaz.husnullin
01-04-2014, 16:19
Ловить исключение 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
$res=-1 исправить на $script:res

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

almaz.husnullin
12-09-2014, 12:15
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
Для yandex измените порт с 465 на 587.




© OSzone.net 2001-2012