2017-10-18 5 views
0

Ainsi, le code ci-dessous fonctionne si j'ajouter manuellement l'adresse e-mail pour $Mail.To = ("[email protected]") mais une fois que je désactiver cela et puis tirer d'une colonne Excel (de mgremail) il me donne cette erreuremail Envoi en utilisant PowerShell

There must be at least one name or contact group in the To, Cc, or Bcc box.At C:\Users\pshivam\Desktop\Scripts\test.ps1:60 char:5 
+ $Mail.Send() 
+ ~~~~~~~~~~~~ 
+ CategoryInfo   : OperationStopped: (:) [], COMException 
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException 

Mon code:

Import-Module ac* 
$csv = Import-Csv C:\Users\pshivam\Desktop\Scripts\User.csv 
$password = ConvertTo-SecureString -String “Newuser1” -AsPlainText -Force 

foreach($item in $csv){ 
$mgrmail = $item.mgremail 
$sam =$item.Username 
$displayname = (Get-ADUser $sam -Properties displayname).displayname 
    ##name 
    $nameTitle = "Name: " 
    $Name = (Get-ADUser $sam -Properties cn).name 
    #upn 
    $upnTitle = "User Logon: " 
    $UPN = (Get-ADUser $sam -Properties userprincipalname).userprincipalname 
    $ol = New-Object -comObject Outlook.Application 
    $mail = $ol.createItem(0) 
    $Mail.To=($mgrmail) 
    #$Mail.To=("[email protected]") 
    $Mail.Subject="TEST" 
    $Mail.Body = "Hi, 

    "+ $nameTitle, $displayname, " 
    " + $upnTitle, $upn + " 
TEST 
    " 
    $Mail.Send() 
} 
+1

Il est beaucoup plus facile à utiliser juste'Envoi-MailMessage'. –

+0

Vous devez tester les valeurs vides. 'If ​​(-not $ mgrmail) {}' – TheIncorrigible1

Répondre

0

exemple de code très alambiquée. Voici quelque chose de beaucoup plus simple:

Import-Module ActiveDirectory 
$csv = Import-Csv C:\Users\user\Desktop\Scripts\User.csv 

ForEach ($item in $csv) 
{ 
    $User = Get-ADUser $item.Username -Properties @('userprincipalname','displayname') 

    [email protected]{ 
     ErrorAction='Stop' 

     To = $item.mgremail 
     From = '[email protected]' 
     SmtpServer = '[email protected]' 
     Subject = 'Test' 
     Body = @" 
Hi, 
    Name: $($User.displayname) 
    User Logon: $($User.userprincipalname) 

Regards, 
    TEST 
"@ 
    } 

    Try { 
     Send-MailMessage @Params 
    } Catch { 
     Write-Host ('Failed to send email. ' + $PSItem.Exception.Message) -ForegroundColor Red -BackgroundColor White 
    } 
} 
+0

@ShivPatel Assurez-vous que le rôle est activé sur le serveur que vous souhaitez pointer. Voici [un sujet d'aide] (https://social.technet.microsoft.com/Forums/exchange/en-US/9c99624f-4379-4f19-85a3-5e2c58/how-to-find-smtp-address-on-exchange -server? forum = exchangesvradminlegacy) sur le sujet – TheIncorrigible1

+0

Que faire si je n'ai pas accès pour activer ce rôle sur le serveur. –

2

j'ai écrit un script un certain temps qui a été utilisé par un niveau 1 équipe qui générerait des e-mails dans Outlook pour eux quand ils aident un utilisateur final. Il n'a pas envoyé l'email (pour des raisons de workflow) mais il serait assez simple pour le faire envoyer. Cela devrait au moins vous donner quelque chose à faire pour ajouter des destinataires à un e-mail de manière automatisée.

$Outlook = New-Object -ComObject Outlook.Application 
$MailItem = $Outlook.CreateItem(0) 
$MailItem.GetInspector.Activate()|Out-Null 
$Signature = $MailItem.HTMLBody 
$CCAddr = $MailItem.Recipients.add($User.email) 
$CCAddr.Type = 2 
$CCAddr.Resolve()|Out-Null 
$MailItem.Recipients|?{$_.Type -eq 1}|%{$_.Delete()} 
$ToAddr = $MailItem.Recipients.add($Item.MgrEmail) 
$ToAddr.Resolve()|Out-Null 
$MailItem.Subject="Task description" 
$MailItem.SentOnBehalfOfName='Team DL' 
$MailItem.HTMLBody = $HTMLBody + $Signature 
$MailItem.GetInspector.Activate()|Out-Null 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook) | Out-Null 
Remove-Variable Outlook,MailItem 

j'avais défini une chaîne ici contenant le code HTML pour le corps de l'email précédemment dans le script comme $HTMLBody. Cela ouvrirait un nouvel e-mail, l'initialiserait, ajouterait la liste de distribution de l'équipe à la ligne CC, ajouterait l'utilisateur à la ligne À (mise à jour pour refléter votre $Item.MgrEmail), définirait l'expéditeur de l'e-mail et conserverait la signature de l'utilisateur. Cela a très bien fonctionné, sauf que l'option Envoyer en tant qu'option GUI ne reflétait pas exactement la valeur à partir de laquelle envoyer l'e-mail (il était envoyé correctement, à partir de leur DL, il montrait simplement leur alias personnel dans l'interface graphique).

Vous pourriez évidemment omettre certaines choses, mais je me suis dit que je proposerais cela puisque je l'ai utilisé et que ça fonctionne.

0

Essayez ce pour un simple envoi SMTP:

$smtpserver="smtp server" 
$from = "email address" 
$to = "email address" 
$subject = "subject" 
$body = "What ever you want...." 
$secpasswd = ConvertTo-SecureString “password” -AsPlainText -Force 
$creds = New-Object System.Management.Automation.PSCredential ($from, $secpasswd) 
Send-MailMessage -smtpServer $smtpserver -Credential $creds -Usessl true -from $from -to $to -subject $subject -attachment $body