发送电子邮件附件-将CSV文件转换为字节删除换行符

8ulbf1ek  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在尝试使用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"

我怎样才能正确地转换这个?

ttygqcqt

ttygqcqt1#

注解中给出了答案,但是为了结束,ConvertTo-Csv输出了一个字符串数组,并且它们没有换行符(Windows中的CRLF,Linux中的LF),在获取Csv的字节之前,您需要将该数组转换为单个多行字符串,为此您可以使用Out-String

$attachment = $output | ConvertTo-Csv -NoTypeInformation | Out-String

或者用一个换行符将它们连接起来以保留结构:

$attachment = ($output | ConvertTo-Csv -NoTypeInformation) -join [Environment]::NewLine

此外,具有字符串类型参数的[System.Text.Encoding]::UTF8.GetBytes(...)将数组强制为字符串,当您在PowerShell中将数组强制为字符串时,它将由$OFS(默认为白色字符)连接,因此在解码base64字符串时,您将得到由空白连接的单行。
另一种方法是给$OFS赋值一个换行符:

$attachment = $output | ConvertTo-Csv -NoTypeInformation
$OFS = [System.Environment]::NewLine
$bytes         = [System.Text.Encoding]::UTF8.GetBytes($attachment)
$base64string  = [Convert]::ToBase64String($bytes)
$OFS = ' '

# Decoding should look as expected
[System.Text.Encoding]::UTF8.GetString(
    [Convert]::FromBase64String($base64string)
)

相关问题