我想将AD用户列表通过电子邮件发送给我,但我不想在发送电子邮件之前将CSV保存到磁盘。
以下是获取数据的代码:
get-aduser -filter * -properties Telephonenumber |
where Telephonenumber -ne $Null |
select givenname, surname, telephonenumber |
sort surname
现在我想添加类似的内容:
| Export-Csv |
Send-MailMessage -From HelpDesk@company.com -to someone@company.com -subject "Outlook address book export" -SmtpServer EdgeTransport
是否有将CSV数据作为附件添加到内存而不将文件保存到文件系统?
答案 0 :(得分:3)
上面提出/接受的答案不正确,不起作用。 Send-MailMessage的-Body参数需要一个字符串对象(System.String)。示例中创建的$ mydata对象是System.array对象。如果您按上面所示使用它,命令将失败。
您可以做的是创建一个文件,用CSV数据填充它,将其作为附件发送,然后将其删除。
使用上面的代码,例如:
$attachment = New-Item filename.csv -ItemType file
get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber | sort surname | Export-Csv $attachment -NoTypeInformation
Send-MailMessage -Attachments $attachment -Body $SmtpBodyTrue -BodyAsHtml -From $SmtpSender -To $MailTo -Subject $SmtpSubject -SmtpServer $SmtpServer
Remove-Item $attachment
$attachment = $null
答案 1 :(得分:2)
-Attachments
的{{1}}参数需要一个路径数组,因此您必须在某处将文件写入磁盘。
要将CSV数据作为电子邮件正文发送,请使用Send-MailMessage
代替convertto-csv -notypeinformation
。
export-csv
答案 2 :(得分:2)
我知道这是一个超级老线程,但上面的答案不再正确。您可以将内存中的对象作为附件发送,而无需先写入文件。您需要使用.net方法,但它运行良好。
关键是.net方法[System.Net.Mail.Attachment] :: CreateAttachmentFromString
答案 3 :(得分:0)
我知道这是一篇很老的文章,但我想我会在担任类似职务后再发表意见。
下面是我编写的用于从对象等创建CSV附件的基本功能。
使此功能正常工作的主要问题之一是首先[enclosures]
用引号将所有内容输出(我知道这已修复为PS6 +,但在使用PS5时没有用。其次,将CSV数据转换为字符串时)并将其转换为转义转义的换行的内存流,为了解决这个问题,我在CSV的每一行中附加了[@attributes]
。
table = dynamodb_client.describe_table(TableName="table_name")
attrs = []
keys = []
for k in table['Table']['KeySchema']:
keys.append(k['AttributeName'])
for attr in table['Table']['AttributeDefinitions']:
if attr['AttributeName'] in keys:
attrs.append(attr)
dynamodb_client.create_table(
KeySchema=table['Table']['KeySchema'],
AttributeDefinitions=attrs,
other-options-here)
要使用此功能,您需要准备好对象,因为它们没有考虑管道功能(如我所说的基本功能)。
示例:
convertto-csv
从[System.Environment]::NewLine
要求字符串到文件路径起作用的意义上来说,答案之一是正确的。
但是,您可以使用.net库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
无论如何,我希望这对将来处于类似情况的人有所帮助。