2010-12-15 7 views
16

Comment utiliser PowerShell pour renvoyer le texte et les en-têtes des 5 derniers messages reçus sur mon compte e-mail Exchange? Y a-t-il un moyen/une bibliothèque simple de faire cela?Comment vérifier une boîte aux lettres d'échange via powershell?

Ceci est en relation avec my question about not using outlook on superuser. Sauf que n'ayant trouvé aucune bonne alternative, je pense que je pourrais aussi bien écrire mon propre client PowerShell simple.

+0

hein? Pourquoi un vote pour la clôture? –

+0

Où avez-vous besoin de vérifier cela sur un ordinateur local qui a le client Oulook installé ou sur le serveur Exchange (qui n'a probablement pas le client)? Est-ce que ça doit être une solution gratuite? –

+0

Je veux une alternative à avoir à ouvrir des perspectives juste pour obtenir un lien sur un e-mail. Alors supposons que Outlook n'est pas installé et oui, je voudrais qu'il soit gratuit puisque je voudrais le mettre sur PoshCode. J'ai fait des recherches et Pop3 fonctionnerait probablement très bien. –

Répondre

14

Vous devez avoir installé le EWS API et vous devez vérifier le chemin d'accès à la DLL dans la partie de chargement de l'assembly de réflexion. Cela devrait vous permettre de travailler avec l'instruction $ inbox.FindItems (5) et de filtrer les résultats que vous voulez en retirer.

[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\1.0\Microsoft.Exchange.WebServices.dll") 
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1) 
$s.Credentials = New-Object Net.NetworkCredential('user', 'pass', 'domain') 
$s.AutodiscoverUrl("[email protected]") 

$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox) 
$inbox.FindItems(5) 
+0

Merci Chris, réponse Grande, toute idée pourquoi la propriété du corps est toujours vide? –

+0

De plus, voici un [autre scénario] (http://poshcode.org/2520) – jpaugh

21

Tout d'abord, des excuses que cette réponse est près de deux ans après la question, mais je voulais aussi vérifier le courrier électronique en utilisant Powershell et trouvé cette question. J'espère que mon code servira de référence/point de départ pour quelqu'un d'autre qui cherche à exploiter les perspectives de Powershell. Je prévois de l'améliorer moi-même pour le rendre plus utilisable.

Je suis assez nouveau à Powershell, donc mes scripts sont principalement Frankenstein-ed de divers articles, articles de blog et StackOverflow Q & A bien sûr, le script ci-dessous ne fait pas exception! Suite à la réponse de Chris, j'ai creusé un peu plus loin sur Internet et bricolé quelques bribes de Powershell pour me permettre d'afficher quelques informations clés des courriels.

Il manque malheureusement dans tout style «correct» et je suis sûr que tous les gourous Powershell vont grincer des dents à ce sujet. Mais ce que ce code ne fait est

  • montrent comment utiliser SAP & Powershell pour lire des emails
  • dernière adresse re question de George: le corps étant vide - la méthode FindItems ne retourne pas l'article de courrier complet, vous Vous devez faire un autre aller-retour pour obtenir les informations supplémentaires dont vous avez besoin.
  • supprimer l'obligation pour vous d'utiliser le nom d'utilisateur/mot de passe/domaine en utilisant vos informations d'identification en cours
  • supprimer l'obligation de « installer » EWS, extrait simplement le MSI et faites référence à la dll

Pour utiliser ..

Télécharger le EWS from here puis extraire quelque part, par ex.

msiexec /a C:\Path\To\Downloads\EwsManagedApi.msi /qb TARGETDIR=C:\Progs\EwsManagedApi

puis appelez ce script en utilisant source de points, par exemple

. C:\Path\To\Script\Outlook_ReadInbox.ps1

qui vous permet de référencer les objets/variables à partir du script après avoir exécuté.

Le code a des commentaires limités tout au long, ainsi que quelques liens à la fin, que j'ai référencé lors de la compilation du script ensemble.

Voici mon brouillon de code alpha à lire dans les 5 premiers courriels, afficher si lu/non lu et afficher les 100 premiers caractères du corps de l'e-mail sur une ligne avec espace blanc supprimé.

# work with exchange server to retrieve messages 
# see this SO answer: http://stackoverflow.com/a/4866894 

# call this script using dot-source (see http://technet.microsoft.com/en-us/library/ee176949.aspx) 
# to allow continued use of the objects, specifically, reading our inbox 
# e.g... 
# . C:\Path\To\Script\Outlook_ReadInbox.ps1 

# replace with your email address 
$email = "[email protected]" 

# only need to populate these if you're impersonating... 
$username = "YOUR_USER_NAME" 
$password = "YOUR_LAN_PASSWORD" 
$domain = "YOUR_DOMAIN" 

# to allow us to write multi-coloured lines 
# see http://stackoverflow.com/a/2688572 
# usage: Write-Color -Text Red,White,Blue -Color Red,White,Blue 
# usage: Write-Color Red,White,Blue Red,White,Blue 
function Write-Color([String[]]$Text, [ConsoleColor[]]$Color) { 
    for ($i = 0; $i -lt $Text.Length; $i++) { 
     Write-Host $Text[$i] -Foreground $Color[$i] -NoNewLine 
    } 
    Write-Host 
} 

# load the assembly 
[void] [Reflection.Assembly]::LoadFile("C:\Progs\EwsManagedApi\Microsoft.Exchange.WebServices.dll") 

# set ref to exchange, first references 2007, 2nd is 2010 (default) 
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1) 
#$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService 

# use first option if you want to impersonate, otherwise, grab your own credentials 
#$s.Credentials = New-Object Net.NetworkCredential($username, $password, $domain) 
#$s.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials 
$s.UseDefaultCredentials = $true 

# discover the url from your email address 
$s.AutodiscoverUrl($email) 

# get a handle to the inbox 
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox) 

#create a property set (to let us access the body & other details not available from the FindItems call) 
$psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) 
$psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text; 

$items = $inbox.FindItems(5) 

#set colours for Write-Color output 
$colorsread = "Yellow","White" 
$colorsunread = "Red","White" 

# output unread count 
Write-Color -Text "Unread count: ",$inbox.UnreadCount -Color $colorsread 

foreach ($item in $items.Items) 
{ 
    # load the property set to allow us to get to the body 
    $item.load($psPropertySet) 

    # colour our output 
    If ($item.IsRead) { $colors = $colorsread } Else { $colors = $colorsunread } 

    #format our body 
    #replace any whitespace with a single space then get the 1st 100 chars 
    $bod = $item.Body.Text -replace '\s+', ' ' 
    $bodCutOff = (100,$bod.Length | Measure-Object -Minimum).Minimum 
    $bod = $bod.Substring(0,$bodCutOff) 
    $bod = "$bod..." 

    # output the results - first of all the From, Subject, References and Message ID 
    write-host "====================================================================" -foregroundcolor White 
    Write-Color "From: ",$($item.From.Name) $colors 
    Write-Color "Subject: ",$($item.Subject) $colors 
    Write-Color "Body: ",$($bod)   $colors 
    write-host "====================================================================" -foregroundcolor White 
    "" 
} 


# display the newest 5 items 
#$inbox.FindItems(5) 
# display the unread items from the newest 5 
#$inbox.FindItems(5) | ?{$_.IsRead -eq $False} | Select Subject, Sender, DateTimeSent | Format-Table -auto 

# returns the number of unread items 
# $inbox.UnreadCount 


#see these URLs for more info 
# EWS 
# folder members: https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.folder_members%28v=exchg.80%29.aspx 
# exporting headers: http://www.stevieg.org/tag/how-to/ 
# read emails with EWS: https://social.technet.microsoft.com/Forums/en-US/3fbf8348-2945-43aa-a0bc-f3b1d34da27c/read-emails-with-ews?forum=exchangesvrdevelopment 
# Powershell 
# multi-color lines: http://stackoverflow.com/a/2688572 



# download the Exchange Web Services Managed API 1.2.1 from 
# http://www.microsoft.com/en-us/download/details.aspx?id=30141 
# extract somewhere, e.g. ... 
# msiexec /a C:\Users\YourUsername\Downloads\EwsManagedApi.msi /qb TARGETDIR=C:\Progs\EwsManagedApi 
+0

Tu es mon héros. – ledgeJumper

+0

Champion !!!!!!! –

+0

Il est aussi laid que vous a appris qu'il serait, mais exactement ce que je devais. Bon produit! :-) –

Questions connexes