Показать полную графическую версию : Отправка сообщения с помощью 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
Пробуем так, тоже все проходит без ошибок , но и письма нет, убираем блок с присоединением пустое письмо приходит: »
Проверь на публичном почтовом сервере, типа 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
Причину явно указали - неправильные учетные данные. Проверьте правильность логина и пароля.
$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
Подскажите, пожалуйста, что нужно сделать чтобы приложенные файлы с русскими именами отображались в правильной кодировке.
Попробовать задать свойство NameEncoding:
$att = New-Object System.Net.Mail.Attachment("C:\Windows\notepad.exe")
$att.NameEncoding = [Text.Encoding]::UTF8
almaz.husnullin
18-11-2013, 16:57
не помогло
Если указать имя меньше 30 символов ,проблема сохраняется?
almaz.husnullin
19-11-2013, 07:33
Если имя меньше 30 символов, все норм.
Можно ли "настроить правильную кодировку" для имен длиннее 30 символов?
Попробуйте установить обновление - http://support.microsoft.com/kb/2402064
almaz.husnullin
19-11-2013, 10:23
спасибо большое! обновление помогло.
almaz.husnullin
01-04-2014, 13:33
Здравствуйте!
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить.
Есть ли возможность получить результат отправки письма?
Например письмо успешно отправлено или его не удалось отправить. »
Изучайте: SmtpClient.Send Method (String, String, String, String) (System.Net.Mail) (http://msdn.microsoft.com/en-us/library/h1s04he7(v=vs.110).aspx).
Нет, можно лишь только предполагать, что если метод Send ничего не вернул - то успех, в другом случаи возникнет исключение.
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
$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
Для yandex измените порт с 465 на 587.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.