当我将以下脚本逐一写入powershell命令行时,它会成功发送电子邮件,但是当我运行脚本时,它会返回一堆错误。我猜测某些语法需要改变才能将其作为脚本运行?有什么想法吗?
Start-Process Outlook
$o = New-Object -com Outlook.Application
$mail = $o.CreateItem(0)
#2 = high importance email header
$mail.importance = 2
$mail.subject = “Auto Build Test“
$mail.body = “This is a test“
#for multiple email, use semi-colon ; to separate
$mail.To = “myemail@company.com"
$mail.Send()
# $o.Quit()
答案 0 :(得分:1)
Param(
[parameter(Mandatory=$true)]
[alias("e")]
[string]$RecipientEmailAddress
)
if($RecipientEmailAddress -notmatch "\b[A-Za-z0-9._%+-]+@BLAHH.com")
{
Write-Output "the email address for the receipient of log reports is not a valid email address, hence will not send the report via email. They can still be accessed at " |Out-String ;
}else
{
$returnVal= New-Object PSObject ;
$returnVal |Add-Member -Name is_Success -MemberType NoteProperty -Value $null;
$returnVal |Add-Member -Name Explanation -MemberType NoteProperty -Value $null;
try{
$Attachments =Get-ChildItem -Path "C:\FOLDERWHEREYOURAATACHMENTS ARESTORED";
if($Attachments.count -eq 0)
{
$returnVal.Explanation="Error sending log report email to the user: $RecipientEmailAddress. Please check if the C:\FOLDERWHEREYOURAATACHMENTS is accessible and there are indeed log files present";
#Write-Output "Error sending log report email to the user: $RecipientEmailAddress" |Out-String ;
#Write-Output "Please check if the C:\FOLDERWHEREYOURAATACHMENTS is accessible and there are indeed log files present "|Out-String;
$returnVal.is_Success= $false;
return $returnVal;
}
$TestedAttachmentsList = new-Object System.Collections.ArrayList;
for($i=0;$i -lt $Attachments.count;$i++)
{
$TestedAttachmentsList.add($Attachments[$i].FullName);
}
Send-MailMessage -From "<FROM@BLAHH.COM>" -To "<$RecipientEmailAddress>" -SmtpServer "mail.BLAHH.com" -Attachments $TestedAttachmentsList -Subject "BLAHH SUBJECT" -Body "BLAHH BLAHH";
$returnVal.is_Success=$true;
$returnVal.Explanation="An email has been sent to the $RecipientEmailAddress containing the log of the setup and configuration."
return $returnVal ;
}Catch [System.Exception]
{
#Write-Output "Error sending log report email to the user: $RecipientEmailAddress" |Out-String ;
#Write-Output "Please check communication between your host machine and mail.BLAHH.com on port 25 is possible"|Out-String;
$returnVal.is_Success= $false;
$returnVal.Explanation="Error sending log report email to the user: $RecipientEmailAddress Please check communication between your host machine and mail.BLAHH.com on port 25 is possible";
return $returnVal ;
}
}
答案 1 :(得分:0)
语法在命令行和脚本文件之间不会更改。命令执行的速度有多大变化。如果你输入它们,那么每个命令之间有很多延迟。但如果它们从脚本运行,则会更快地呈现给Outlook。
解决此问题的一种简单方法是在失败的命令之前添加Sleep 1
(或类似)。如果没有看到你的错误输出,我猜你想在CreateItem之后,也许在Send之前睡觉。但是,如果仔细查看错误消息,您将看到它们确定脚本的哪一行失败。在失败的第一行之前放置Sleep。重试脚本。如果新线路出现故障,那么也要在它之前加上延迟。如果第一行仍然失败,您可以尝试Sleep 2
。您还可以缩短睡眠时间。 1/2秒:Sleep -milliseconds 500
。
如果添加Sleeps可以解决问题 - 换句话说问题就是同步问题,你可以使用的Outlook对象模型中可能会有一些不像使用Sleeps那样的hackish。
我无法在Outlook 2010安装上重新启用此功能。但是我确实查找了另一种从PS发送电子邮件的方法(如下)。也许这种方法可行。
$i=$o.Session.folders.item(2).folders.item("Outbox").items.add(0)
$i.to="me@whereiwork.com"
$i.Subject="a wittle testy"
$i.Body="some body"
$i.send()