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

PowerShell脚本发送邮件时多行文本变为单行的问题求助

解决PowerShell发送邮件保留多行正文格式的问题

问题背景

我使用Helpdesk工单系统,通过发送邮件至指定地址创建工单。编写PowerShell脚本实现自动发送邮件,可输入邮件主题与正文,但复制的多行正文在收件箱中变为单行,无法保留原格式。尝试用Read-Host粘贴多行文本会导致脚本崩溃,PowerShell IDE中可运行但普通PowerShell环境不行;使用Get-Clipboard是目前最接近的方案,但仍存在问题;尝试Here-String也无法正常输出变量内容。

当前脚本

Clear-Host
$HD_Email_Credential = Get-Credential

#Gather information to send in email Body
$Subject = Read-Host 'Please Enter the email subject here '
Write-Host = 'Please copy (Ctrl+C) in the Email Body and press Enter'
Pause
$EmailBody = Get-Clipboard -TextFormatType Text

#Define Email Parameters
$FromAddress = 'myemail@email.com'
$ToAddress = 'helpdesk@fakecorp.com'

$EmailParams = @{
    From       = $FromAddress
    To         = $ToAddress
    Subject    = "$Subject"
    Body       = "$EmailBody"
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $HD_Email_Credential
}

#Send Email
Send-MailMessage @EmailParams
Write-Host "Email successfully sent to $ToAddress from $FromAddress" -ForegroundColor Green

尝试过的代码

Read-Host版本

#Gather information to send in email Body

$Subject = Read-Host "Please Enter the email subject here "
$EmailBody = Read-Host "Please enter in the Email Body "

Here-String版本

@"

$EmailBody

"@

解决方案

方案1:修复Get-Clipboard的换行格式问题

剪贴板中的多行文本换行符是\r\n,部分邮件客户端会忽略纯文本换行,或Send-MailMessage传递时未正确保留。可选择两种处理方式:

方式A:纯文本格式保留换行

明确指定纯文本格式,确保换行符被正确传递:

Clear-Host
$HD_Email_Credential = Get-Credential

$Subject = Read-Host '请输入邮件主题'
Write-Host '请复制邮件正文(Ctrl+C),然后按Enter'
Pause
# 获取剪贴板文本,自动保留原始换行
$EmailBody = Get-Clipboard

$FromAddress = 'myemail@email.com'
$ToAddress = 'helpdesk@fakecorp.com'

$EmailParams = @{
    From       = $FromAddress
    To         = $ToAddress
    Subject    = $Subject
    Body       = $EmailBody
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $HD_Email_Credential
    BodyAsHtml = $false # 明确指定纯文本格式
}

Send-MailMessage @EmailParams
Write-Host "邮件已成功发送至 $ToAddress" -ForegroundColor Green

方式B:转换为HTML格式保留换行

若邮件客户端对纯文本换行支持差,将换行符替换为HTML的<br>标签并启用HTML格式:

Clear-Host
$HD_Email_Credential = Get-Credential

$Subject = Read-Host '请输入邮件主题'
Write-Host '请复制邮件正文(Ctrl+C),然后按Enter'
Pause
$EmailBody = (Get-Clipboard) -replace "`r`n", "<br>" -replace "`n", "<br>"

$FromAddress = 'myemail@email.com'
$ToAddress = 'helpdesk@fakecorp.com'

$EmailParams = @{
    From       = $FromAddress
    To         = $ToAddress
    Subject    = $Subject
    Body       = $EmailBody
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $HD_Email_Credential
    BodyAsHtml = $true # 启用HTML格式
}

Send-MailMessage @EmailParams
Write-Host "邮件已成功发送至 $ToAddress" -ForegroundColor Green

方案2:支持多行输入的Read-Host替代方案

普通PowerShell环境中Read-Host不支持直接粘贴多行,可通过循环读取输入直到用户输入空行终止:

Clear-Host
$HD_Email_Credential = Get-Credential

$Subject = Read-Host '请输入邮件主题'
Write-Host '请输入邮件正文,输入空行结束'
$EmailBody = @()
while ($true) {
    $line = Read-Host
    if ([string]::IsNullOrEmpty($line)) {
        break
    }
    $EmailBody += $line
}
# 将数组转为带换行的字符串
$EmailBody = $EmailBody -join "`r`n"

$FromAddress = 'myemail@email.com'
$ToAddress = 'helpdesk@fakecorp.com'

$EmailParams = @{
    From       = $FromAddress
    To         = $ToAddress
    Subject    = $Subject
    Body       = $EmailBody
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $HD_Email_Credential
}

Send-MailMessage @EmailParams
Write-Host "邮件已成功发送至 $ToAddress" -ForegroundColor Green

方案3:正确使用Here-String输入多行正文

Here-String需正确标记结束符,且结束符必须单独占一行:

Clear-Host
$HD_Email_Credential = Get-Credential

$Subject = Read-Host '请输入邮件主题'
Write-Host '请输入邮件正文,结束时单独输入`@并按Enter'
$EmailBody = @'
'@

$FromAddress = 'myemail@email.com'
$ToAddress = 'helpdesk@fakecorp.com'

$EmailParams = @{
    From       = $FromAddress
    To         = $ToAddress
    Subject    = $Subject
    Body       = $EmailBody
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $HD_Email_Credential
}

Send-MailMessage @EmailParams
Write-Host "邮件已成功发送至 $ToAddress" -ForegroundColor Green

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:57:34