2016-08-12 74 views
1

我试图创建一个默认值模块,看起来是这样的:PowerShell的麻烦模块创建

function Send-Mail ($EmailTo = "[email protected]" , $Body = "Warning! Technical Maintance today", $Subject = "*** Warning! ***") 
{ 
$EmailFrom = "[email protected]" 
$SMTPServer = "mail.example.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("it", "Hjcnthv1"); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
} 

Export-ModuleMember -Function 'Send-Mail' 

然后我试图使用它:

Import-Module '\\dc01\scripts$\_server\Send-Mail.psm1' 
Send-Mail [email protected] "Text" "Subject" 

但我收到错误:

Exception calling "Send" with "4" argument(s): "Failure sending mail." 
At \\dc01\scripts$\_server\Send-Mail.psm1:14 char:1 
+ $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SmtpException 

我在做什么错?

+0

我不知道发送呼叫中的括号是否是问题。我知道你不应该让它们用于PowerShell函数调用,因为它们将所有参数转换为一个对象,如果将它们放在括号中,并因此作为单个参数传入。我只是不确定这是否与.NET对象的方法调用一样。 – n3wjack

+0

所以基本上,我说的是试试这个:'$ SMTPClient.Send $ EmailFrom,$ EmailTo,$ Subject,$ Body' – n3wjack

+0

括号不是问题。方法调用需要一个基于数组的参数列表。 –

回答

0

您的模块创建没问题,错误取决于您的功能无法正常工作。尝试在发送之前先创建消息对象。

$msg = New-object System.Net.Mail.MailMessage -ArgumentList @($EmailFrom,$EmailTo,$Subject,$Body) 
$SMTPClient.Send($msg) 

您还选择启用SSL而无需为您的SMTP客户端提供证书$SMTPClient.ClientCertificates。当您提供凭据时,您可能不需要SSL,因此您可以删除行$SMTPClient.EnableSsl = $true

在旁注中,您可以添加以下内容以在使用后处置对象。

$msg.Dispose() 
$SMTPClient.Dispose() 
+0

@ user3301252如果这个问题有帮助或回答你的问题,请接受或upvote它。 – Richard