PowerShellでマルチパートメールを送信するサンプル

コンピュータ

Evernoteにメールで画像付きのHTMLファイルを投稿するスクリプトを書いてみました。
 
このスクリプトを元に、以前から作りたかったWebサイトからHTMLファイルと画像ファイルをダウンロードしメールでEvernoteにノートとして送信するスクリプトを作ることが出来ました。EvernoteのWeb Clipperをローカルなスクリプトで実行するイメージですが、Webページのリンクをたどって関連ページを一気にEvernoteのノート化することが出来ます。自分の使い方はそんな感じですが、マルチパートメールはEvernoteに限らず色々な場面で使えそうです。

<#
.SYNOPSIS
Yahooのメールアカウントからマルチパートメールを送信する。
<CommonParameters> はサポートしていません

.DESCRIPTION
説明

.EXAMPLE
使い方

.PARAMETER $UserName
Yahooアカウントのユーザー名

.PARAMETER $Password
Yahooアカウントのパスワード

.PARAMETER $ToEMailAddress
メール送信先のメールアドレス

.PARAMETER $Subject
メールの件名

.PARAMETER $Body
メールの本文、HTMLで記述。
画像リンクは<img src='cid:dbs1'>と記述し1は$ImageFileの0番目の要素を参照する。

.PARAMETER $ImageFile
画像ファイルのパスを配列で渡す。

#>


function Send-YahooMultipartMail
{
    param(
        [string]
        $UserName,
        [string]
        $Password,
        [string]
        $ToEMailAddress,
        [string]
        $Subject,
        [string]
        $Body,
        [string[]]
        $ImageFile
    )
    begin {
        $Smtp = New-Object Net.Mail.SmtpClient("smtp.mail.yahoo.co.jp", 587)
        $Smtp.EnableSsl = $false
        $Smtp.Credentials  = New-Object Net.NetworkCredential(
            $UserName,
            $Password
        )
    }

    process {
        
        # 件名JIS->Base64
        $enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp")
        $str2 = $Subject | % {
            $s = $_
            (1..2) | % {
                $s = [Convert]::ToBase64String($enc.GetBytes($s))
                $s = ("=?{0}?B?{1}?=" -f "iso-2022-jp", $s)
            }
            $s
        }

        $Mail = New-Object Net.Mail.MailMessage(
            "${UserName}@yahoo.co.jp",
            $ToEMailAddress,
            $str2,
            ""
        )

        $v = [System.Net.Mail.AlternateView]::CreateAlternateViewFromString(
            $Body,
            $null,
            [System.Net.Mime.MediaTypeNames+Text]::Html)
        $AlternateView = $v

        $Resource = @()
        for($i=0;$i -lt $ImageFile.Count; $i++) {

            $Extension = [System.IO.Path]::GetExtension($ImageFile[$i])

            $RegPath = "Registry::HKCR\${Extension}"

            $Mime = ""
            if (Test-Path -Path $RegPath) {
                $Mime = (Get-Item -Path $RegPath).GetValue("Content Type")
            }


            $Resource += New-Object System.Net.Mail.LinkedResource(
                $ImageFile[$i],
                $Mime
            )
            $Resource[$i].ContentId = "dbs"+ ($i+1)
            $AlternateView.LinkedResources.Add($Resource[$i])
            
        }

        $Mail.AlternateViews.Add($AlternateView)

        $Smtp.Send($mail)

        $Resource | % { $_.Dispose() }
        $AlternateView.Dispose()
        $Mail.Dispose()
    }
    end {
        $Smtp.Dispose()
    }
}

if (-not($MyInvocation.PSCommandPath)) {

$body = @'
<html>
<head>
  <title>タイトル</title>
</head>
<body>
  <h2>テーブル</h2>
  <table>
    <thead>
      <th>項目1</th>
      <th>項目2</th>
    </thead>
    <tbody>
      <th>値1</th>
      <th>値2</th>
    </tbody>
  </table>
  <hr>
  <h2>画像の埋め込み</h2>
  <h3>トリミング前</h3>
  <img src='cid:dbs1'>
  <h3>トリミング後</h3>
  <img src='cid:dbs2'>
</body>
</html>
'@
    $img = @(
    'C:\P_20190914_063523_1.jpg'
    'C:\P_20190914_063523_1_trim.jpg'
    )
    $usr = "UserName" # Yahooユーザ名
    $pass = "Password" # Yahooパスワード
    $to = "user@email.com" # 送信先メアド
    $sub = "マルチパートメールのサンプル" # 件名
    
    Send-YahooMultipartMail $usr $pass $to $sub $Body $img
} # if

コメント