You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Send-MgUserMail发送内存CSV附件时换行丢失问题求助

解决Send-MgUserMail内存生成CSV附件换行丢失问题

问题核心是ConvertTo-Csv -NoTypeInformation返回的是字符串数组(每行对应CSV的一行),直接将这个数组传给GetBytes时,PowerShell会默认用空格拼接所有元素,导致换行丢失,所有内容挤成一行。

正确转换方法

只需把CSV字符串数组拼接成包含正确换行符的完整字符串,再转字节和Base64即可。推荐两种方式:

方式1:用-Join指定换行符

$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"
    }
)

# 将CSV数组拼接为带Windows标准换行符的完整字符串
$csvContent = $output | ConvertTo-Csv -NoTypeInformation -Join "`r`n"
# 也可以用系统默认换行符:-Join [Environment]::NewLine

$bytes = [System.Text.Encoding]::UTF8.GetBytes($csvContent)
$base64string = [Convert]::ToBase64String($bytes)

方式2:用Out-String转换

$csvContent = $output | ConvertTo-Csv -NoTypeInformation | Out-String -Stream
# 若要去掉末尾多余空行,可改用:
# $csvContent = ($output | ConvertTo-Csv -NoTypeInformation | Out-String).TrimEnd()

$bytes = [System.Text.Encoding]::UTF8.GetBytes($csvContent)
$base64string = [Convert]::ToBase64String($bytes)

完整工作代码

把转换后的$base64string代入邮件发送逻辑即可:

$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"
    }
)

$csvContent = $output | ConvertTo-Csv -NoTypeInformation -Join "`r`n"
$bytes = [System.Text.Encoding]::UTF8.GetBytes($csvContent)
$base64string = [Convert]::ToBase64String($bytes)

$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

内容的提问来源于stack exchange,提问作者swtto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:20:34