【问题标题】:Send email with Powershell from different mailbox使用 Powershell 从不同邮箱发送电子邮件
【发布时间】:2017-04-30 04:49:56
【问题描述】:

我创建了一个小的 PS 脚本来为我的管道创建一封电子邮件,以便在有部署时发送出去。问题是我不希望从我的个人电子邮件中发送电子邮件,而是从公司的 Outlook 电子邮件中发送。我搜索并看到了不同的 SMTP 服务器名称并使用了 mail.from,但我无法让它工作。有人可以帮帮我吗?

 param(
[Parameter(Mandatory=$true,Position=0)]
[string]$Address1,
[Parameter(Mandatory=$true,Position=1)]
[string]$Address2,
[switch]$Recurse,
[switch]$Force  
)

 $ol = New-Object -comObject Outlook.Application  
 $mail = $ol.CreateItem(0)  
 $Mail.Recipients.Add($Address1) 
$Mail.Recipients.Add($Address2) 
$Mail.Subject = "DSC Deployment in Progress"  
$Mail.Body = "There is a DSC install beginning. . ."  
$Mail.Send() 

【问题讨论】:

  • 您好,您可以在 Outlook 客户端中访问这两个电子邮件帐户吗?
  • 我不这么认为,我只看到我个人电子邮件的设置,因为它的价值我属于我希望从中发送电子邮件的特定组
  • 然后尝试使用Send-MailMessage。您可以使用它指定一个 SMTP 服务器。 msdn.microsoft.com/en-us/powershell/reference/5.1/…
  • 如果您的自动 Outlook 代码实际发送个人电子邮件,“个人电子邮件”和“公司 Outlook 电子邮件”有什么区别?跨度>
  • 谢谢,是的,我遇到了这种方法,但无法弄清楚我的 smtp 服务器是用于 Outlook 的

标签: email powershell outlook


【解决方案1】:

作业喜欢

$mail.SendUsingAccount = $account

从 Windows Server 2000 到 Windows Server 2008 以及从 Outlook 2007 到 Outlook 2016 为我工作。从 Windows Server 2016 开始,我遇到了异常(服务器抛出异常。(来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT))) .

但还有另一种分配此属性的方法。

[Void] $mail.GetType().InvokeMember("SendUsingAccount","SetProperty",$NULL,$mail,$account)

【讨论】:

    【解决方案2】:

    您需要为SendUsingAccount 属性分配一个值。该帐户可以在(outlook).Session.Accounts 集合中找到。

    $sendSmtpAddress = "some.name@somedomain.com"
    $account = $ol.session.acounts | ? { $_.smtpAddress -eq $sendSmtpAddress }
    

    然后,在发送前分配给 SendUsingAccount 属性

    $mail.SendUsingAccount = $account
    $mail.Send()
    

    完整示例

    $sendSmtpAddress = "some.name@somedomain.com"
    $ol = new-object -comobject "outlook.application"
    $account = $ol.session.accounts | ? { $_.smtpAddress -eq $sendSmtpAddress }
    $mail = $ol.CreateItem(0)
    $mail.recipients.add("target.user@somedomain.com") | out-null
    $mail.subject = "test email"
    $mail.body = "test email"
    $mail.SendUsingAccount = $account
    $mail.Send()
    

    对于它的价值,我很久以前就放弃了尝试通过 Outlook 发送电子邮件,使用普通 SMTP 更容易。根据您本地 SMTP 服务器(Exchange?)上的安全策略,您可能能够以您本地域上的任何用户的身份“发送”。向您的 IT 人员询问可用于发送电子邮件的内部 SMTP 服务器的名称/IP,然后就很简单了:

    send-mailmessage -smtpServer (servername or IP) -from sender.name@domain.com -to @(recipient1@domain.com, recipient2@domain.com) -subject "Email Subject" -body "Email Body"
    

    如果使用send-mailmessage,可以使用"Display Name <sender.name@domain.com>" 形式为发件人设置显示名称,例如

    -from "Deployment Alerts <sender.name@domain.com>"
    

    收件人将在其电子邮件客户端中看到显示名称,而不是 SMTP 地址。

    我认为是好的做法的几点:

    1. 根据 SMTP 服务器的配置,“发件人”地址的验证可能很少或没有验证。值得使用您可以访问的真实帐户,这样您就可以看到任何退回/未送达报告。
    2. 考虑在邮件正文(可能是页脚)中包含一些内容,其中提及警报的来源以及生成警报的过程。这可以帮助您的继任者或同事在未来追踪脚本。

    【讨论】:

    • 哇,非常感谢,最后一行代码更简单,也正是我所需要的,非常感谢
    • 尼尔不用担心,很高兴它有帮助。我使用的另一种技术是为发件人设置显示名称。这将显示在收件人的电子邮件客户端中,而不是完整的 SMTP 地址。我将更新帖子以包含此内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多