我正在尝试使用MS Graph cmdlet Send-MgUserMail
发送电子邮件并包含CSV附件。
如果我这样做,它工作正常,附件也没问题。
- CSV附件示例**
"App","AppId","Date","User"
"App1","43a9087d-8551-47d5-9869-3287736ce7c3","2023/01/26","me@email.com"
"App2","f33750cd-c79b-43be-8e55-ee14d163e2b3","2024/01/26","me@email.com"
- 工作代码**
$attachment = "C:\Users\Me\Downloads\SampleFile.csv"
$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($attachment))
$params = @{
UserId = "me@email.com"
BodyParameter = @{
Message = @{
Subject = "Test Email"
Body = @{
ContentType = "Html"
Content = "This is sample text."
}
ToRecipients = @(
@{
EmailAddress = @{
Address = "toAddress@email.com"
}
}
)
Attachments = @(
@{
"@odata.type" = "#microsoft.graph.fileAttachment"
Name = "SampleFile.csv"
ContentType = "text/csv"
ContentBytes = $base64string
}
)
}
SaveToSentItems = "false"
}
}
Send-MgUserMail @params
- 目标**
我想要的是附加CSV,没有有一个实际保存的文件。内容将来自内存,像这样。
$output = @(
[PSCustomObject] @{
App = "App1"
AppId = "43a9087d-8551-47d5-9869-3287736ce7c3"
Date = "2023/01/26"
User = "me@email.com"
},
[PSCustomObject] @{
App = "App2"
AppId = "f33750cd-c79b-43be-8e55-ee14d163e2b3"
Date = "2024/01/26"
User = "me@email.com"
}
)
$attachment = $output | ConvertTo-Csv -NoTypeInformation
$bytes = [System.Text.Encoding]::UTF8.GetBytes($attachment)
$base64string = [Convert]::ToBase64String($bytes)
当我这样做的时候,我的问题是CSV内容完全在一行上,没有更多的换行符。
- 发布CSV输出示例**
"App","AppId","Date","User" "App1","43a9087d-8551-47d5-9869-3287736ce7c3","2023/01/26","me@email.com" "App2","f33750cd-c79b-43be-8e55-ee14d163e2b3","2024/01/26","me@email.com"
我怎样才能正确地转换这个?
1条答案
按热度按时间ttygqcqt1#
注解中给出了答案,但是为了结束,
ConvertTo-Csv
输出了一个字符串数组,并且它们没有换行符(Windows中的CRLF,Linux中的LF),在获取Csv的字节之前,您需要将该数组转换为单个多行字符串,为此您可以使用Out-String
:或者用一个换行符将它们连接起来以保留结构:
此外,具有字符串类型参数的
[System.Text.Encoding]::UTF8.GetBytes(...)
将数组强制为字符串,当您在PowerShell中将数组强制为字符串时,它将由$OFS(默认为白色字符)连接,因此在解码base64字符串时,您将得到由空白连接的单行。另一种方法是给
$OFS
赋值一个换行符: