通过SMTP邮件服务器

时间:2018-05-07 12:44:46

标签: powershell email smtp windows-server-2012 smtpclient

我在Windows Server 2012 r2中安装了SMTP虚拟服务器。后来我使用以下PowerShell脚本发送电子邮件。哪个成功

$email = "xxxxxxxxxx@xxxxxx.com" 
 
$pass = "xxxxxxx" 
 
$smtpServer = "smtp.office365.com" 
$smtpPort = "25" 
 
$msg = new-object Net.Mail.MailMessage 
$smtp = new-object Net.Mail.SmtpClient($smtpServer) 
$smtp.EnableSsl = $true
$msg.From = "$email"  
$attachment = New-Object Net.Mail.Attachment("C:abcd/123.txt");
$msg.Attachments.Add($attachment);
$msg.To.Add("xxxx@xxxxx.com") 
$msg.BodyEncoding = [system.Text.Encoding]::Unicode 
$msg.SubjectEncoding = [system.Text.Encoding]::Unicode 
$msg.IsBodyHTML = $true   
$msg.Subject ="List of users" 
$msg.Body=$msg.Body = "<h2> hi everyone </h2> 
$SMTP.Credentials = New-Object System.Net.NetworkCredential("$email", "$pass"); 
$smtp.Send($msg)

这里我的问题是我可以在不使用上述脚本中的地址的情况下发送电子邮件(是否有机会在SMTP虚拟服务器设置中的某处保存电子邮件地址和凭据,以便脚本可以直接获取凭据)。我不想使用上面脚本中的电子邮件地址和凭据

1 个答案:

答案 0 :(得分:2)

我建议使用Send-MailMessage而不是手动.NET操作:

$Creds = Import-CliXml -Path 'C:\mycreds.xml'

$MailArgs = @{ 'SmtpServer'  = 'smtp.office365.com'
               'Port'        = 25

               'To'          = 'xxxx@xxxxx.com'
               'From'        = $Creds.UserName
               'Subject'     = 'List of users'

               'Attachments' = 'C:\abcd\123.txt'
               'Body'        = '<h2> hi everyone </h2>'
               'Encoding'    = [Text.Encoding]::Unicode
               'BodyAsHtml'  = $true

               'UseSsl'      = $true
               'Credential'  = $Creds
             }
Send-MailMessage @MailArgs

您可以按如下方式创建$Creds对象:

Get-Credential -Credential 'xxxxxxxxxx@xxxxxx.com' | Export-CliXml -Path 'C:\mycreds.xml'

您可能会感兴趣的一些额外选项(例如交付通知),您可以在上面链接的文档中阅读。

此外,使用特定于该设备和帐户utilizing DPAPIExport-CliXml导出密码时会对其进行加密。