2018年1月31日水曜日

【PowerShell】グローバルIPアドレスをメール送信

◆目次
  1. セキュリティソフトでメール送信を除外。
  2. Google設定で安全でないアプリを許可するよう設定。※
  3. PowerShellでメール送信。
  ※Gmailの場合の手順。セキュリティレベルは下がるので注意。また、2段階認証の設定も必要とのこと。自分の場合は何故か不要だった。

◆ダウンロード
GrobalIPMailv0.2.zip
GrobalIPMailv0.1.zip

◆手順
  1. セキュリティソフトでメール送信を除外。(以下AVGの場合)
    1.  タスクバーのAVG(ver17.9.3040)をクリック。
    2. [メニュー]-[設定]-[コンポーネント]-[(メールシールドの)カスタマイズ]の順に選択。
    3. 送信メールをスキャン(SMTP)のチェックを外し、[OK]ボタン-[OK]ボタン。
       
  2. Google設定で安全でないアプリを許可するよう設定。
    1. Chromeを起動。
    2. アドレス欄にgoogle.comと入力。
    3. Chrome右上の:::ボタン(Googleアプリボタン)押下。
    4. [アカウント]を選択。
    5. [端末のアクティビティとセキュリティ イベント]を選択。
    6. [アカウントにアクセスできるアプリ]を選択。
    7. [安全性の低いアプリの許可]を無効から有効に変更。
       
  3. PowerShellでメール送信。
    (上述のzipを使う場合は、同梱のreadme.txtを参照のこと。下記のコードとは別で、タスクスケジューラによる定期処理を行う。)
    1. 後述の簡易コードをファイルに保存。ファイル名はgipmail.ps1。
      その際、[ユーザ名]と[ぱすわーど]は読み替えること。
    2. gipmail.ps1を右クリックし、[PowerShellで実行]を選択。
       
◆簡易コード(gipmail.ps1)
$from = "ユーザ名@gmail.com"
$to = "ユーザ名@gmail.com"
$server = "smtp.gmail.com"
$port = 587
$user = "ユーザ名@gmail.com"
$pass = "ぱすわーど"

curl ipinfo.io | ConvertFrom-Json | sv ret
$ret.ip

$client = New-Object Net.Mail.SmtpClient($server, $port)
$client.EnableSsl = $true
$client.Credentials = New-Object Net.NetworkCredential($user, $pass)

New-Object Net.Mail.MailMessage($from, $to,"Global IP", $ret.ip) | sv msg
$client.Send($msg)

◆zip内のコード(GrobalIPメール送信.ps1:要setting.json)
# 設定ファイルのパス・前回取得したグローバルIPアドレス記録ファイルのパス
$MyInvocation.MyCommand.Path | Split-Path -Parent | sv path
Join-Path $path setting.json | sv setting_path
Join-Path $path latest_gip.txt | sv gip_path

# 設定ファイル読み込み。
cat $setting_path | ConvertFrom-Json | sv conf

# 認証情報生成
ConvertTo-SecureString $conf.pass | sv pass
New-Object System.Management.Automation.PSCredential $conf.user, $pass | sv cred

# 前回のIPをファイルから取得
if (Test-Path $gip_path) {
    cat $gip_path | sv latestip
}

# グローバルIP取得サイトにアクセス。
curl ipinfo.io | ConvertFrom-Json | sv ret

# 前回のIPと今回取得したIPが不一致の場合のみ、ファイル書き込み&メール送信。
if ($latestip -ne $ret.ip) {
    Send-MailMessage `
        -To         $conf.to     `
        -From       $conf.from   `
        -SmtpServer $conf.server `
        -Port       $conf.port   `
        -Subject    "Global IP"  `
        -Credential $cred        `
        -UseSsl                  `
        -Body       $ret.ip

    # メール送信に成功した場合のみ、グローバルIPアドレスを更新
    if ($? -eq $true) {
        $ret.ip | tee -f $gip_path
    }
}

0 件のコメント:

コメントを投稿