PowerShell でメール受信

by kusakari 18. 12月 2009 21:24

PowerShell からメールを受信してみたいと思います。ただ、.Net Framework 標準では受信クラスはないため、メールを受信するには、サーバーに接続してPOPを喋って、ヘッダーやボディーなど色々解析するなどの方法が必要になります。が、今回は.Netで作られた、下記のライブラリを利用させて頂くことにします。

TKMP.DLL : http://uwa.potetihouse.com/library/tkmpdll.html


なお、POPを喋るようであれば、下記のCodeZineのサイトなどが参考になるかと思います。
http://codezine.jp/article/detail/477


■DLLの読み込み
まずは、TKMP.DLLを読み込みます。

[void][System.Reflection.Assembly]::LoadFile("C:\Temp\TKMP.dll")




■POP認証の作成
POPサーバーに送信する認証を作成します。

$credential = New-Object TKMP.Net.BasicPopLogon("username", "password")




■POPクライアントの作成
サーバーに対して接続したり、メールを取り出したりするためのクライアントを作成します。

$pop = New-Object TKMP.Net.PopClient($credential, "popserver", < POP3ポート番号 >)




■メール解析
メールボックスからメールを取得して、ヘッダーやボディーを読み込んで解析をします。

$mails = $pop.MailDatas
foreach($mail in $mails)
{
    [void]$mail.ReadHeader()                  # ヘッダー部分の読み取り
    [void]$mail.ReadBody()                    # ボディー部分の読み取り

    # ヘッダー部分解析
    $header = New-Object TKMP.Reader.MailReader($mail.HeaderStream, $false)

    # ボディー部分解析
    $body = New-Object TKMP.Reader.MailReader($mail.DataStream, $false)
}




■表示
ヘッダーやボディーを解析したあとは、コレクションから目的の項目を取得することができます。

write "件名:`t"$header.HeaderCollection["Subject"]   # ヘッダーのSubject項目表示
write "差出人:`t"$header.HeaderCollection["From"]    # ヘッダーのFrom項目表示
write "本文`r`n"$body.MainText                       # メール本文表示




■メール受信サンプル

[void][System.Reflection.Assembly]::LoadFile("C:\Temp\TKMP.dll")
$pop = New-Object TKMP.Net.PopClient((New-Object TKMP.Net.BasicPopLogon("username", "password")), "popserver", 110)

try
{
    [void]$pop.Connect()        # POP接続
    $pop.MailDatas | % `
    {
        [void]$_.ReadHeader()   # ヘッダー部分の読み取り
        [void]$_.ReadBody()     # ボディー部分の読み取り

        # メール読み取り
        New-Object TKMP.Reader.MailReader($_.HeaderStream, $false) | % { $_.HeaderCollection["Subject"], $_.HeaderCollection["To"], $_.HeaderCollection["From"], [Datetime]$_.HeaderCollection["Date"] }
        New-Object TKMP.Reader.MailReader($_.DataStream, $false) | select MainText

        [void]$_.Delete()       # メール削除
    }
    $pop.Close()                # POP切断
}
catch [Exception]
{
    write $_.Exception
    if($pop.Connected) { $pop.Close() }
}

PowerShell で正規表現のグループ化

by kusakari 15. 12月 2009 19:22

PowerShell で 正規表現のグループ化を試してみます。

比較したい文字列の後に、「-match」を付けて、その後ろにメタ文字を入力します。
一致した場合は True を、不一致であれば False を返します。
また、グループに名前を付けた場合は、 $Matches["グループ名"] や $Matches[0] などで取得できます。


例えば、下記は郵便番号の正規表現を行う場合の1例です。

$msg = "123-4567"
$regex = "(?<zipcode>\d{3}-\d{4})"

$msg -match $regex
Write-Host $Matches["zipcode"]

WSUS 3.0 のクリーンアップを自動化

by kusakari 14. 12月 2009 18:02

WSUS 3.0 のWSUS管理コンソールのオプションには、サーバー クリーンアップ ウィザード がありますが、これを定期的に手動で実行するのが億劫なので、自動化させたいと考えたところ、既にScriptCenterで公開されていました。
http://gallery.technet.microsoft.com/ScriptCenter/en-us/fd39c7d4-05bb-4c2d-8a99-f92ca8d08218

ここに記載されているPowerShellのコードだけで十分なのですが、クリーンアップ終わった後に、WsusDebugTool.exe の PurgeUnneededFiles もついでに実行させたいと考えているので、バックグラウンドで実行するように、今回はWsusDebugToolの部分を追加しています。


■環境
WSUS 3.0 SP2


■サンプル

try
{
   [Reflection.Assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null

    # クリーンアップのスコープ作成
    $scope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
    $scope.CleanupObsoleteComputers         = $true
    $scope.CleanupObsoleteUpdates           = $true
    $scope.CleanupUnneededContentFiles      = $true
    $scope.CompressUpdates                  = $true
    $scope.DeclineExpiredUpdates            = $true
    $scope.DeclineSupersededUpdates         = $true

    $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer()
    $manager = $wsus.GetCleanupManager()

    # クリーンアップ実行
    [void]$manager.PerformCleanup($scope)

    # バックグラウンドで WsusDebugTool を実行
    $t = Start-Job {< WsusDebugTool.exe保存パス >\WsusDebugTool.exe /Tool:PurgeUnneededFiles}

    # ジョブ完了まで待つ
    while($t.State -ne "Completed"){ Start-Sleep -s 1; }
    # Receive-Job $t
}
catch [Exception]
{
    Write-Host $_.Exception
}

 

WsusDebugTool は次のサイトの Server Diagnostic Tool のリンクからダウンロードできます。
http://technet.microsoft.com/en-us/wsus/bb466192.aspx

 


また、その他、関連しそうな情報は下記のMSDNをご覧ください。

PowerShell でメール送信(添付ファイル付き)

by kusakari 9. 12月 2009 20:40

PowerShell から添付ファイル付きで、メールを送信します。
前回投稿の文字化け対応した「PowerShellでメール送信」の内容から、添付ファイルを付けるのと、複数の宛先に送信できるようにしました。

function send-Mail
{
    param
    (
        $smtp,              # SMTPサーバ
        [string[]]$to,      # 宛先アドレス
        $from,              # 送信元アドレス
        $subject,           # タイトル
        $body,              # 本文
        $attach             # 添付ファイルのパス
    )

    $enc = [Text.Encoding]::GetEncoding("csISO2022JP");
    $s64 = [Convert]::ToBase64String($enc.GetBytes($subject), [Base64FormattingOptions]::None)

    $mail = New-Object Net.Mail.MailMessage
    $mail.From = $from

    # (複数)宛先追加
    $to | % { $mail.To.Add($_) }

    $mail.Subject = [String]::Format("=?{0}?B?{1}?=", $enc.HeaderName, $s64)  
    $view = [Net.Mail.AlternateView]::CreateAlternateViewFromString($body, $enc, [Net.Mime.MediaTypeNames]::Text.Plain)
    $view.TransferEncoding = [Net.Mime.TransferEncoding]::SevenBit
    $mail.AlternateViews.Add($view)  

    # 添付ファイル追加
    if($attach -ne $null) `
    {
        $temp = New-Object Net.Mail.Attachment($attach)
        $mail.Attachments.Add($temp);
    }
    $sc = New-Object Net.Mail.SmtpClient($smtp)
    $sc.Send($mail)
    $mail.Dispose()
}




下記の場合は、test.txtファイルを添付して、メールを送信しているサンプルです。添付ファイル不要の場合は「$null」指定してください。

send-Mail "smtp.example.com" "black-yagi@example.com" "white-yagi@example.com" "おてがみ" "よんでね。" "c:\temp\test.txt"

PowerShell から SQLServer のデータベースやテーブルを削除

by kusakari 7. 12月 2009 20:24

前回前々回とPowerShellから、SQLServerにデータベースとテーブルを作成したり、定義を変更してみたりしましたので、今回は、データベースやテーブルを削除してみたいと思います。
※SQLServer2008では、PowerShellがサポートされ専用のコマンドレットを使うことが出来ます。


方法としては、イロイロあると思いますが、今回は下記の2通りの方法を紹介いたします。

  1. System.Data.SqlClient
  2. Invoke-Sqlcmd

なお、今回の実験は、前回の環境からの続きになります。


■1.System.Data.SqlClient
System.Data.SqlClient でデータベースやテーブルの定義変更をしてみます。

 

【データベース削除】
下記は、ローカルの SQLServer に作成されている PowerShell という名前のデータベースを削除しています。

$query = @"
DROP DATABASE PowerShell
"@

$strConn = 'Data Source = localhost; Integrated Security = True'
$conn = New-Object System.Data.SqlClient.SqlConnection($strConn)
$cmd = New-Object System.Data.SqlClient.SqlCommand($query, $conn)
$conn | % `
{
    $_.Open();
    [void]$cmd.ExecuteNonQuery();
    $_.Close();
    $_.Dispose();
}

 

【テーブル削除】
下記は、ローカルの SQLServer の PowerShell データベースにある tbl_ps テーブルを削除しています。

$query = @"
DROP TABLE tbl_ps
"@

$strConn = 'Data Source = localhost; Initial Catalog = PowerShell; Integrated Security = True'
$conn = New-Object System.Data.SqlClient.SqlConnection($strConn)
$cmd = New-Object System.Data.SqlClient.SqlCommand($query, $conn)
$conn | % `
{
    $_.Open();
    [void]$cmd.ExecuteNonQuery();
    $_.Close();
    $_.Dispose();
}




■2.Invoke-Sqlcmd
Invoke-Sqlcmd を使ってデータベースやテーブルの削除をしてみたいと思います。
なお、Invoke-Sqlcmd を使う場合は下記のコマンドなどで追加してください。

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

 

【データベース削除】
下記は、ローカルの SQLServer に作成されている PowerShell という名前のデータベースを削除しています。

$query = @"
DROP DATABASE PowerShell
"@

Invoke-Sqlcmd -Query $query

 

【テーブル削除】
下記は、ローカルの SQLServer の PowerShell データベースにある tbl_ps テーブルを削除しています。

$query = @"
DROP TABLE tbl_ps
"@

Invoke-Sqlcmd -Database PowerShell -Query $query




今回、データベースやテーブルの削除で使用したクエリは、簡単なテスト目的でのクエリです。記載しているサンプルは、例外処理に関しては記載してありませんので、ご注意ください。また、クエリに関して他の設定を行う場合は、下記のMSDNをご覧ください。

DROP DATABASE 
http://msdn.microsoft.com/ja-jp/library/ms178613.aspx
DROP TABLE http://msdn.microsoft.com/ja-jp/library/ms173790.aspx


 

Calendar

<<  7月 2010  >>
月曜火曜水曜木曜金曜土曜日曜
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar

RecentComments

Comment RSS