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
相关产品推荐
相关产品推荐

