Qiitaの記事を参考にPowerShellでGmailを送信するスクリプトを書いてみたときのメモ

以下の記事を参考にしてPowerShellGmailを送信するスクリプトを書いてみた。
この記事のGoogleアカウントの設定に関する説明には、とても助けられた。
今まで「アプリパスワード」なるものが存在するとは知らず、自分のパスワードを使用して認証に失敗し諦めていたが、説明されている手順で設定をしたらメールを送信できるようになった。
ありがとうございます。

qiita.com


さて、アプリのパスワードは後で必要になるので忘れず記録しておこう。
とりあえずはユーザー環境変数app_passwordに設定し、
(get-childitem env:app_password).value
で取得するようにした。ユーザ名(メールアドレス,e.g "johndoe@gmail.com")も同様にユーザー環境変数から取得するようにした。

関数は[CmdletBinding()]属性でadvanced functionの形にしよう。
from, to, subject は必須にして、toはパイプラインから受け取れるようにした。

以下のパラメーター で添付ファイルを指定できる。

  • Attachments

Send-MailMessage

関数定義
function SendMail {
  [CmdletBinding()]
  param(
        [Parameter(Mandatory=$True)]
        [ValidateNotNullOrEmpty()]
        [string]$From,

        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True)]
        [ValidateNotNullOrEmpty()]
        [string[]]$To,

        [Parameter(Mandatory=$True)]
        [ValidateNotNullOrEmpty()]
        [string]$Subject,

        [string]$Body,
        [string[]]$Attach
  )

  begin {
  }
  process {
    $SMTPServer = "smtp.gmail.com" 
    $SMTPPort = 587
    $app = (get-childitem env:app_password).value
    $password = ConvertTo-SecureString $app -AsPlainText -Force
    $username = (get-childitem env:app_username).value
    $credential = New-Object System.Management.Automation.PSCredential($username, $password)

    $cmd = 'Send-MailMessage `
        -From $From `
        -to $To `
        -Subject $Subject `
        -Body $Body `
        -SmtpServer $SMTPServer `
        -port $SMTPPort `
        -UseSsl -Credential $credential `
        -DeliveryNotificationOption None `
        -Encoding UTF8 `
        -ErrorAction Stop'

    if( -not [string]::IsNullOrEmpty($attach) ){
        $cmd += ' -Attachments $attach'
    }

    invoke-expression $cmd

  }
  end {
  }
}
実行例
$f = "johndoe@gmail.com"
$t = @()
$t += "xxx@yahoo.co.jp"
$t += "yyy@yahoo.co.jp"
$a = "Test of Send-MailMessage"
$b = "Hello PowerShell World!"

# parameter
SendMail -from $f -to $t -subject $a -body $b

#pipeline
$t  |  SendMail -from $f -subject $a -body $b

パラメーター指定の場合は送信先が配列のまま渡されるので送信範囲が見えてしまう。
グループのメンバーに業務連絡するようなケースといえよう。
一方、パイプライン渡しの場合は配列の要素ごとに逐次処理されるので、送信範囲をみせないように個別にメールを送信したいケースといえよう。
パラメーター指定の場合とパイプライン渡しの場合の挙動の違いは以前、紹介した。
『PowerShell実践ガイドブック』吉崎生(Kindle版)をPC版Kindleで読む - willwealth’s diary

Microsoftからの警告

せっかく作った関数だがMicrosoftからはSend-MailMessageは使わないようにと警告が出ている。
しかし当面、代替手段がなければ状況によっては使わざるをえないこともあるかもしれない。
Send-MailMessage (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs


『PowerShell実践ガイドブック』吉崎生(Kindle版)をPC版Kindleで読む

関数の書き方を復習する目的で“『PowerShell実践ガイドブック』吉崎生(Kindle版)”を購入してみて、Kindle版の感想というかKindleの操作方法に関してメモしておこう。
ピンポイントで情報を取得したい場合はネットは便利だが、情報が断片的であるため体系的に学習する場合には本の方が時間を節約できる。
そして紙の本の方が読みやすいが、Kindle版にしたのはNote PC (Windows10)での持ち運びを優先したためである。『PowerShell実践ガイドブック』は分厚く重いのである。

kindle edition

著者による紹介

PowerShell実践ガイドブック』に関しては以下のリンクに著者による紹介がある。
tech.guitarrapc.com

PC版Kindleの設定

PC版Kindleはいつも起動が遅いので閉口していたが、自動更新しないようにすれば少し速くなるようなので、
「ツール」→「オプション」→「一般」で「更新がある場合は自動的にインストールする」のチェックボックスを外しておこう。
私のNote PCは13.3インチの解像度1920×1080のFull HDディスプレイだが、全画面表示で拡大しないとちょっと文字が小さく読むのが難しい。
タブレットにできるような機種だとより読みやすくできるのかもしれないが、表示を横から縦に変更しようとするとマウスカーソルの挙動が怪しかったので諦めた。
全画面表示にしたらマウスを画面の下の方へ移動させると、ページ表示の切り替えボタンや拡大、縮小ボタンが表示されるので、好みの表示にしよう。

index image

スペースキーでページ移動できる点は便利だが、なにせ私にはデフォルトの表示では、少々、文字が小さかったので、1ページ表示にして、横幅が画面に収まる最大のサイズにした。

こうした状態で、スペースキーでページ移動してしまうと画面に表示されていない部分を読まずに次のページに移ってしまうので、忍耐強くスクロールで移動することになる。

Advanced Function

さて、関数の書き方を復習しよう。

Advanced Function
Advanced functions allow you create cmdlets that are written as a PowerShell function. Advanced functions make it easier to create cmdlets without having to write and compile a binary cmdlet. Binary cmdlets are .NET classes that are written in a .NET language such as C#.

about Functions Advanced - PowerShell | Microsoft Docs

関数は高度化させるため param()に[CmdletBinding()]属性を付加する。
そして、当面の必要がなくてもパイプラインから値を受け取るようにしよう。

Parameter()の指定

  • Mandatory=$True この引数は必須
  • ValueFromPipeline=$True パイプラインから値を受け取ることができる

ちなみに、パイプラインとパラメーターでは処理の仕方が変わってくることに注意を促している。
本書の441ページで説明されていたので、ちょっと紹介しよう。

Function Test-Function {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True)]
        [ValidateNotNullOrEmpty()]
        [int[]]$item
    )

    begin {
        write-output "begin : $item"
    }

    process {
        write-output "proces : $item"
    }

    end {
        write-output "end : $item"
    }
}

パラメーター指定での実行例。引数は配列のまま渡される。

PS >test-function -item(1..3)
begin : 1 2 3
proces : 1 2 3
end : 1 2 3

パイプラインでの実行例。パイプラインでは配列の各要素が逐次処理される。

PS >(1..3) | test-function
begin :
proces : 1
proces : 2
proces : 3
end : 3

このような挙動の違いがどのような状況で問題になるのか思いつかないが、頭の隅にとどめておこう(きっと忘れてしまうと思うが・・・)。

やはり関数は、パイプラインを使う予定がなくても、この "Advanced Function" スタイルで関数を定義するのが良いのではないかと思う。
初心者が本書をいっきに消化するのは厳しいかもしれないが、ある程度、経験のあるユーザーが体系的に学ぶには良いと思う。ちなみに私は消化不良の状態で、いまだに"Advanced Function"の解説がある第4章「スクリプティングと自動化」を読み終えることができないでいる・・・

『PowerShell実践ガイドブック』吉崎生(著)を読んだときのメモ - willwealth’s diary

2022/08/06 追記
パラメーター指定とパイプラインとの挙動の違いはメールを送信するときなどに利用できるかもしれない。
Qiitaの記事を参考にPowerShellでGmailを送信するスクリプトを書いてみたときのメモ - willwealth’s diary

「msteams.exe - 正しくないイメージ」のことを失念していたことを反省するメモ

去年(2021年)、新品のWindows11のパソコンを購入してログインして「msteams.exe - 正しくないイメージ」エラーに遭遇していたにもかかわらず喉元過ぎれば熱さを忘れるで失念していたので今回はメモしておこう。

新品のパソコンで、最初のログインでこのようなエラーが出たのには信じがたい思いであった。

msteams_1
msteams_2
msteams_3
meteams_4

いろいろなソフトをインストールしているうちに発生したならともかく、ピッカピカのPCで発生するのは許しがたい。
ネットでは「再度インストールすればよい」とか「新品と交換してもらったら」という助言?もあったようだが、別にMSTeamsを利用するつもりはないのでログイン時に自動起動しないようにすることにした。
ログイン時に自動的に起動されるアプリが設定されているので、その設定を変更する。
スタートの設定から

app_setting

アプリのスタートアップを選択する。

start_up

デフォルトではMicrosoft Teamsの自動起動がONになっているので、これをOFFにした。
Remote Desktopへの郷愁があり購入したPCがWindows11 ProだったのでHome editionでは恐らく状況は違うのだろう。
けれど本当に使いたかった人たちはどうしたのだろうか?
インストールし直したのだろうか?
気になる。

『社会保障と財政の危機』鈴木亘 (c)2020/11

本書を読むと、日本は将来世代にツケを回すことを改めることのできない国なんだなぁと思ってしまった。
まず、はじめに、ここでの記述は本書だけに依拠したものであり、本書の読解でもミスや誤解があるかもしれないことを断っておきたい。

本書では、コロナ禍での

と幅広いテーマが扱われているが、ここでは年金問題に関してだけメモしておく。

年金改革はどうだったのか

年金改革の手段には、以下のものがある。

  1. 現役層が負担する保険料の引き上げ
  2. 高齢者の年金カット

投票率の高い高齢者の影響力は強く、今まで(1)が選択されて続けてきた。
しかし、もはや限界だ。「保険料を引き上げ続けることは、もう止めよう!」と、保険料水準固定方式の導入された。

2004年の年金改革の柱は以下の4つである。

保険料水準固定方式の導入
将来にわたって保険料を引き上げ続けることを止める。
マクロ経済スライドの導入
約20年間で、2割程度の年金カット
基礎年金国庫負担割合の1/3から1/2への引き上げ
基礎年金への税金投入の増額
無限均衡方式から有限均衡方式への変更
積立金の早期取り崩し

さて、改革の成果はどうだったのだろうか?
5年ごとに「財政検証」という、年金財政の「健康診断」が行われるが、2004年の100年安心プランの経済前提

  • 積立金の運用利回り3.2%
  • 賃金上昇率2.1%
  • 物価上昇率1.0%

といった希望的観測、バラ色のシナリオに基づいて財政計画を立ててしまうので、5年後の「健康診断」でも相変わらず悪い結果が出てしまうのである。
このご時世、運用利回り3.2%の安全な金融商品があったら教えてほしい。
安定運用を前提として平均でこれだけの利回りをたたき出すのは、優秀なファンドマネージャーでも難しいだろう。

この教訓を踏まえて現実的な経済前提のもとで財政計画を立てるようになったのだろうか?否である。より楽観的な前提になっていた。
p160

2009年 2014年 2019年
積立金運用利回り 4.1% 4.2% 4.0%
賃金上昇率 2.5% 2.5% 2.3%
物価上昇率 1.0% 1.2% 1.2%

100年先まで4.1%で運用できる前提は、「粉飾決算」と言うべき行為である。
でも、まあ、ここでは「【不適切】財政検証」と穏やかに言っておこう。

厚生労働省の見解

「いっしょに検証!公的年金」を見てみよう。
https://www.mhlw.go.jp/nenkinkenshou/

これらの意見の中には誤解もありますが、そもそも公的年金制度は、現役世代が受給世代を扶養する「世代間扶養」の仕組みのもとで運営されている、社会保障制度です。本来、個人や世代の差による損得を論じる性質のものではありません。

公的年金の価値は【安心】にあることに異論はないが、財政的に持続可能とは思えないような運用が行われている状況での【安心】は画餅に過ぎない。
本来、社会保障制度である公的年金生活保護のような生活を保障する「福祉」と受け止めている、誤解している国民も多いのではないだろうか。
実際、厚生年金も受給できる人は現実として生活を保障できる金額を受け取ることができているので、「誤解」は仕方ないことかもしれないが、
公的年金だけでは生活できない人には、生活保護という最終的セーフティネットがあることを理解してもらう必要がある。
あとは、年齢で差別されない労働市場が存在する必要がある。
法で企業に雇用を強制しなくても、能力のある高齢者は何歳までも働ける労働市場のある社会でなければならない。
しかし、現実としては、終身雇用、年功賃金の慣行が長く続いた日本の労働市場流動性に欠け、求人では「何歳まで」という条件が「当然」のごとく付いてくる。
少々、労働市場改革に脱線してしまったが、要するに社会保障制度はバラ色の前提ではなく現実的な前提のもとで運用しましょうということである。

年金カット先送りは世代間不公平

年金会計のバランスシート(貸借対照表)を見てみよう。

保険料(1670)+国庫負担(520)+積立金(210)=過去債務(1320)+将来債務(1080)
※単位は兆円。

過去債務
これまで支払った保険料に対応する年金給付
将来債務
これから支払う保険料に対応した年金給付

「積立金」を右辺へ、「将来債務」を左辺へ移項させると、

保険料(1670)+国庫負担(520)ー将来債務(1080)=過去債務(1320)ー積立金(210)

右辺は「年金純債務」と呼ばれる。
要するに現在の高齢者の「もらい得」である。
現在(2019年)、1110兆円である。

宇宙も膨張しているらしいが、実は、この「年金純債務」も膨張している。
p170

年金純債務額の推移
年金純債務額
2004 690
2009 800
2014 980
2019 1110

宇宙がなぜ膨張しているのかは知らないが、年金純債務が膨張しているのは、年金カットが予定通り進まず先送りされているからだ。
「2024年の記録更新に乞うご期待」などと、つい冷笑的に言いたくなってしまう。
※「マクロ経済スライド」がデフレ下で機能せず、年金カットが予定通り進まなかった状況について本書を参照してほしい。

理不尽なのは、まだ投票権をもっていない子供たちや、まだ生まれていない将来の日本人たちに、もっとも過酷な負担を強いることである。

将来世代にツケを回す行為はもうやめよう。

『「年金問題」は嘘ばかり』高橋洋一 (c)2017 

「ダマされて損をしないための必須知識」という副題を持つ本書のメモ

「年金は危ない」説は危機意識を煽ることで利益を得られる人々があり、利益団体にとっての「打ち出の小槌」のようなものだという。
財務省は消費税増税
厚労省は利権と天下り
・投資や年金保険などの商品を売りやすくなる
・FPのサービスを売りやすくなる
・メディアにはおいしい話題。

まず、年金の3つのポイントを押さえておこう。

  1. 年金は(強制加入の)保険である。
  2. 40年間払う保険料≒20年間受け取る年金
  3. 年金定期便は国からのレシート

年金は保険なので「老後の生活を保障するもの」ではない。でもまあ、一般市民の感覚では「老後の生活を保障するもの」と捉えているような気がするが、年金は「自分が長生きするかどうかわからない」という意味でのリスクに対する保険であり、長生きした人が得するもの。生活保護のような福祉でないので、生活を保障しないし、加入期間の違いによって月々の金額も違ってくる。「公的年金だけでは老後の生活に足りない」と思う人は、プラスアルファのことを考えて老後に備えておく必要がある。

国民年金の実際の未納率は約3%(233万人)である。
人数を見ると「結構いるなぁー」という印象を受けるが、割合でみると「なんだ、その程度か」という印象を受ける。
「未納率4割」のほとんどは制度上、免除されている人たちであるという。免除されているのに「未納」というのは御幣があるように思うが、まあ「実際の未納率」にだけみることにしよう。
・経済界は「年金負担を増やしたくない。」と考えている。まあ、当然だね。
公的年金でもらえる額は、「(生涯を通じての平均)月給の4割」が目安。でも、やっぱり年功賃金の退職時を無意識的に基準にするよね。

年金は「保険数理」で破綻しないように設計されている

p62

身もふたもありませんが、最初に結論をいってしまいましょう。
日本の公的年金制度は破綻しません。

保険は保険数理で計算されて成り立っており、「マクロ経済スライド」は給付される年金額を保険料収入の範囲内に収める仕組みが導入されているので破綻しない。
ここで、「きちんとマクロ経済スライドで調整していけば」という条件が付いてくる。
そして、
p66

もっとも、今後、想定以上の経済成長の落ち込みが長期にわたったりすれば、もらえる年金額が少なくなる可能性もあります。
そうなると、年金以外のところでも不満足なことがおこります。
その意味で、それは年金破綻ではなく、経済成長の低下によるものです。

制度設計が正しくても「経済政策」が悪いと絵に描いた餅になる

2009年の財政検証に対する「4.1%の利回りの想定が高すぎる」という批判に対する反論として、
p96

しかし、名目成長率を4%にできれば、長期金利が4%になるのは普通のことですから、それほどおかしな数字ではありません。

と擁護している。
しかし、コロナ禍を経験している5年後の時点からの批判ではあと知恵ではあることを認めつつも、
「名目成長率を4%にできれば」という条件の箇所はちょっと楽観的だったという気がする。

『第2章「日本の年金制度がつぶれない」これだけの理由』の最後から引用しよう。
p112

ここで見てきたように、巷の「年金破綻説」はだいたい間違っていますが、もし、本当に公的年金が危なくなるとすれば、それは
「ずっと経済成長をしなくなった場合」です。
経済が成長しない場合は、残念ながら年金は破綻します。
年金だけでなく、すべての社会保障が破綻します。

本書の全体の趣旨としては太鼓判を押してくれているが、ここの箇所は少し心配になる。すでに「ずっと経済成長をしなくなっ」ているように感じるのは私だけだろうか?
しかし、まあ、給付がカットされようが、されまいが、保険料は収めていくとしよう。

『社会保障亡国論』鈴木亘 (c)2014

本書の発行は2014年なので、以下、数値などに関しては当時のものである。

暗黙の債務は1500兆円

国民年金と厚生年金とを合わせた年金純債務が800兆円に達していた。(2009年)
現在の高齢者が現役であったときに徴収された保険料を積み上げられたものが、年金の「積立金」であり、150兆円で、一方、債務が950兆円なので純債務は800兆円となる。その他の社会保障の純債務は、2008年時点で医療保険が380兆円、介護保険が230兆円であった。社会保障全体の純債務は約1500兆円存在する。
これらはバランスシートに記載されない「暗黙の債務」で、まだ十分に理解されていない。
今は理解されていなくても、いつかは

  • 保険料引き上げ
  • 増税
  • 給付カット

などの約1500兆円分の改革が必要となる。
しかし、保険料の引き上げはもう無理だろう。

社会保障給付費の将来予測

社会保障給付費が如何に重たいかを、我々の給料の総額である国民所得(Natinal Income)との対比で示されている。
以下、抜粋、小数点以下四捨五入。金額の単位は兆円。

2013年度 2025年度 2035年
社会保障給付費 111 149 190
国民所得 359 373 401
国民所得比率 31% 40% 47%
世代間不公平

現在の高齢者たちは、孫たちに5000万円もの借金を背負わせて、その5000万円を無断使用して老後の生活を送っている。
一種の「幼児虐待」であり、これを「財政的幼児虐待(fiscal child abuse)」という。

将来世代にツケを回す行為はもうやめよう。

【労働市場改革】『働き方改革の経済学』矢代尚宏

日本の人口ピラミッドは正に逆ピラミッドになりつつある。
https://www.ipss.go.jp/syoushika/tohkei/Popular/P_Detail2022.asp?fname=G02-01-2.png
この年齢構成で終身雇用的な年功賃金を維持するのは無理筋であろう。

日本で定年制を廃止できないのは「仕事能力の不足に基づく解雇」が認められない包括的な雇用契約をしていることに大きな原因がある。
労働法には明確な解雇規制がなく、不透明性の大きな判例法に全面的に依存していることが問題だという。
所謂、「解雇権濫用法理」という高いハードルがあるため「解雇自由の原則」が実効性を持ち得ていない。

また、早く辞めると損をする定年制が社員を会社の中に閉じ込め雇用の流動性を制約している現状を変革するには、
職務を限定しない包括的なメンバーシップ型の雇用からジョブ型の雇用に転換する必要がある。
メンバーシップ型では「仕事能力の不足に基づく解雇」を行う上で、「仕事能力」を評価することが難しいからだ。
ジョブ型でも「仕事能力」を評価することは簡単ではないにせよ、職務を限定しないメンバーシップ型よりは容易である。
ジョブ型になれば自己啓発のモチベーションが高まり各自がスキルアップに励むのではないだろうか。
メンバーシップ型でスキルアップしようとしても、職務無限定では3年後には野球選手になるのか、水泳選手になるのか、陸上選手になるのかわからないようなものだ。
そのような状況では一般的な基礎体力をつけておくしかない。

中高年になると仕事能力のバラツキは大きくなり、「同一労働同一賃金」は評価で大きく差がでる可能性が高く、ある意味、過酷な競争となる制度であろう。
人によっては不公平感を持つだろうが、「仕事能力」で評価される労働市場へと転換しなければ雇用の流動化は実現できないであろう。

なお、労働時間の上限規制は過労死、過労自殺を防ぐ意味でも必要だ。
残業至上主義をモットーとする人には不服な規制となるが、過労死を防ぐには法的根拠が存在しなければならない。
もっとも私自身は過労死、過労自殺の背景にはイジメの要素が大きいという印象を持っているが。

人々の賃金所得が全く増加していない状況は、成長戦略の大きな柱である労働市場改革の遅れが主な要因のひとつであると言われる。
今後、日本の経済が活性化されることを期待したい。