私はこれが非常に古い投稿であることを知っていますが、私は同じような立場になってから私の意見を述べると思いました。
以下は、オブジェクトなどからCSV添付ファイルを作成するために作成した基本的な関数です。
これを機能させるための主な問題の1つは、最初にconvertto-csv
すべてを引用符で囲むことでした(これは、PS6 +で修正されていますが、PS5を使用する場合は役に立ちません。次に、CSVデータを文字列にキャストしてメモリストリームに変換する場合キャリッジリターン/ラインフィードをエスケープしていました。これを回避するため[System.Environment]::NewLine
に、CSVのすべての行に追加しました。
Function ConvertTo-CSVEmailAttachment {
Param(
[Parameter(Mandatory=$true)]
[String]$FileName,
[Parameter(Mandatory=$true)]
[Object]$PSObject,
$Delimiter
)
If ($Delimiter -eq $null){$Delimiter = ","}
$MS = [System.IO.MemoryStream]::new()
$SW = [System.IO.StreamWriter]::new($MS)
$SW.Write([String]($PSObject | convertto-csv -NoTypeInformation -Delimiter $Delimiter | % {($_).replace('"','') + [System.Environment]::NewLine}))
$SW.Flush()
$MS.Seek(0,"Begin") | Out-Null
$CT = [System.Net.Mime.ContentType]::new()
$CT.MediaType = "text/csv"
Return [System.Net.Mail.Attachment]::new($MS,$FileName,$CT)
}
これを使用するには、パイプライン機能が考慮されていないため、オブジェクトを準備しておく必要があります(基本的な機能について説明しました)。
例:
$ADList = get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber |sort surname
$EmailAttachment = ConvertTo-CSVEmailAttachment -FileName "ADList.CSV" -PSObject $ADList
Send-MailMessage
答えの1つは、機能するためにファイルパスへの文字列を必要とするという意味で正しいです。
ただし、次を使用する[Net.Mail.MailMessage]
代わりに、.netライブラリを使用して電子メールを作成できますSend-MailMessage
。
$SMTPserver = "This.Will.Be.Your.Email.Server.Endpoint"
$from = "SomeEmailAddress@yourdomain.com"
$to = "Recipient@domain.com"
$subject = "This is the subject Line"
$emailbody = "This is the body of the email"
$mailer = new-object Net.Mail.SMTPclient($SMTPserver)
$msg = new-object Net.Mail.MailMessage($from, $to, $subject, $emailbody)
$msg.Attachments.Add($EmailAttachment) #### This uses the attachment made using the function above.
$msg.IsBodyHTML = $false
$mailer.send($msg)
とにかく、これが将来同じような状況にある誰かに役立つことを願っています。