【问题标题】:Other Options to Send E-mail Using PowerShell使用 PowerShell 发送电子邮件的其他选项
【发布时间】:2016-05-04 22:55:48
【问题描述】:

我正在尝试使用 PowerShell 脚本发送电子邮件,我公司的病毒扫描 (McAfee) 阻止了端口 25。我知道我可以进入 McAfee 的设置并取消选中“防止群发电子邮件..选项”,我也知道我可以在我的脚本中调用 Outlook 以在用户登录时发送电子邮件(这太侵入性了)。我的问题是,有没有其他方法可以在不使用我上面提到的任何选项的情况下使用 PowerShell 发送电子邮件。

谢谢。

 $From = "name@name.com"
 $To = "name@name.com"
 $Body = Test" 
 $Subject2 = "Hi"
 $SMTPServer ="smtp.com"

Send-MailMessage -From $From -To $To -SmtpServer $SMTPServer -Subject $Subject1 -Body $Body'

$Outlook = New-Object -ComObject Outlook.Application
$Mail = $Outlook.CreateItem(0)
$Mail.To = "name@name.com"
$Mail.Subject = "Hi"
$Mail.Body = "Hello"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Mail.Send() '

【问题讨论】:

  • 为什么这个标签是 php?
  • 你好 Dragon,我标记 PHP 是因为我的另一个选择是通过 intramet 输出我的发现,因为通过电子邮件发送它被阻止。谢谢。

标签: php email powershell outlook


【解决方案1】:

使用 .NET 类

您可以手动创建一个 [MailMessage] 对象并将其与 [SmtpClient] 类一起发送,但这可能会像 Send-MailMessage 一样与 McAfee 软件发生冲突。

$From = "name@name.com"
$To = "name@name.com"
$Body = "Test" 
$Subject2 = "Hi"
$SMTPServer ="smtp.com"

$message = New-Object System.Net.Mail.MailMessage $From, $To
$message.Subject = $Subject2
$message.Body = $Body

$smtpclient = New-Object Net.Mail.SmtpClient($SMTPServer)
$smtpclient.Send($message)

使用 Exchange 网络服务

要使用 EWS,您需要 Microsoft.Exchange.WebServices.dll 文件,您可以在以下位置找到该文件:

  • C:\Program Files\Microsoft\Exchange\Web Services\1.0
  • C:\Program Files\Microsoft\Exchange\Web Services\2.2
  • Download from Microsoft

Mike Pfeiffer 的博客中的一个示例函数实现在这里(并在下面链接):

Function Send-EWSMailMessage {
  [CmdletBinding()]
  param(
    [Parameter(Position=0, ValueFromPipelineByPropertyName=$true, Mandatory=$true)]
    [Object]
    $PrimarySmtpAddress,

    [Parameter(Position=1, Mandatory=$true)]
    [System.String]
    $Subject,

    [Parameter(Position=2, Mandatory=$true)]
    [System.String]
    $Body
    )

  BEGIN {
    Add-Type -Path "C:\bin\Microsoft.Exchange.WebServices.dll"
    $sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
    $user = [ADSI]"LDAP://<SID=$sid>"
  }

  PROCESS {
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
    $service.AutodiscoverUrl($user.Properties.mail)

    if($PrimarySmtpAddress -is [Microsoft.Exchange.Data.SmtpAddress]) {
      $Recipient = $PrimarySmtpAddress.ToString()
    } else {
      $Recipient = $PrimarySmtpAddress
    }

    $mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)
    $mail.Subject = $Subject
    $mail.Body = $Body

    [Void]$mail.ToRecipients.Add($Recipient)
    $mail.SendAndSaveCopy()
  }

  END {
  }
}

以下链接可能有用,但并非专门针对 PowerShell 实现:

【讨论】:

  • 感谢您的详细回答... McAfee 也阻止了它。对于 EWS,没有一台 PC 具有 EWS,脚本将在本地 PC 上运行。谢谢。
  • 您可以将 DLL 文件托管在网络共享上,从而不必将其分发到所有计算机。很高兴听到这种方法至少在原则上是否有效。
【解决方案2】:

您使用的 SMTP 服务器是否支持加密连接?如果是这样试试:

Send-MailMessage -To $to -From $from -SmtpServer $smtp -UseSsl -Port "587"

我会测试它,但我没有 McAfee。

【讨论】:

  • 我试过了,但没用,McAfee 阻止了它。谢谢。
  • 明确地说,-UseSsl 开关强制与 SMTP 服务器建立安全连接;它不加密消息本身。邮件中继收到邮件后,将像处理其他邮件一样进行处理。
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 2015-12-24
  • 2020-06-23
  • 2020-08-22
  • 1970-01-01
  • 2015-05-15
  • 2018-03-12
  • 2016-07-21
相关资源
最近更新 更多