我知道这是一篇很老的帖子,但我想我会在处于类似职位后给出我的意见。
以下是我编写的用于从对象等创建 CSV 附件的基本函数。
让它工作的主要问题之一是首先convertto-csv
输出引号中的所有内容(我知道这已经修复了 PS6 +,但在使用 PS5 时没有用。其次,当将 CSV 数据转换为字符串并将其转换为内存流时正在转义回车/换行,为了解决这个问题,我将其附加[System.Environment]::NewLine
到 CSV 中的每一行。
Function ConvertTo-CSVEmailAttachment {
Param(
[Parameter(Mandatory=$true)]
[String]$FileName,
[Parameter(Mandatory=$true)]
[Object]$PSObject,
$Delimiter
)
If ($Delimiter -eq $null){$Delimiter = ","}
$MS = [System.IO.MemoryStream]::new()
$SW = [System.IO.StreamWriter]::new($MS)
$SW.Write([String]($PSObject | convertto-csv -NoTypeInformation -Delimiter $Delimiter | % {($_).replace('"','') + [System.Environment]::NewLine}))
$SW.Flush()
$MS.Seek(0,"Begin") | Out-Null
$CT = [System.Net.Mime.ContentType]::new()
$CT.MediaType = "text/csv"
Return [System.Net.Mail.Attachment]::new($MS,$FileName,$CT)
}
要使用它,您需要准备好您的对象,因为它们没有考虑到管道功能(正如我所说的基本功能)。
例子:
$ADList = get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber |sort surname
$EmailAttachment = ConvertTo-CSVEmailAttachment -FileName "ADList.CSV" -PSObject $ADList
Send-MailMessage
在需要文件路径的字符串才能起作用的意义上,其中一个答案是正确的。
但是,您可以使用 .net 库[Net.Mail.MailMessage]
来创建电子邮件,而不是使用Send-MailMessage
:
$SMTPserver = "This.Will.Be.Your.Email.Server.Endpoint"
$from = "SomeEmailAddress@yourdomain.com"
$to = "Recipient@domain.com"
$subject = "This is the subject Line"
$emailbody = "This is the body of the email"
$mailer = new-object Net.Mail.SMTPclient($SMTPserver)
$msg = new-object Net.Mail.MailMessage($from, $to, $subject, $emailbody)
$msg.Attachments.Add($EmailAttachment) #### This uses the attachment made using the function above.
$msg.IsBodyHTML = $false
$mailer.send($msg)
无论如何,我希望这对将来处于类似情况的人有所帮助。