2

我想以 CSV 格式通过电子邮件发送 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数据作为附件添加到内存中而不将文件保存到文件系统?

4

4 回答 4

3

我知道这是一个超级老线程,但上面的答案不再正确。您可以将内存中的对象作为附件发送,而无需先写入文件。您需要使用 .net 方法,但效果很好。

关键是 .net 方法 [System.Net.Mail.Attachment]::CreateAttachmentFromString

http://geekswithblogs.net/mkoerner/archive/2012/01/19/powershell-emailing-strings-as-attachments.aspx

于 2017-11-10T18:43:59.550 回答
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
于 2015-12-02T17:43:56.990 回答
2

-Attachmentsfor 参数需要一个路径数组,因此Send-MailMessage您必须将文件写入磁盘的某个位置。

要将 CSV 数据作为电子邮件正文发送,请convertto-csv -notypeinformation使用export-csv.

$myData = get-aduser -filter * -properties Telephonenumber | where Telephonenumber -ne $Null | select givenname, surname, telephonenumber | sort surname|convertto-csv -notypeinformation
Send-MailMessage -From HelpDesk@company.com -to someone@company.com -subject "Outlook address book export" -SmtpServer EdgeTransport -body $mydata
于 2012-11-30T16:54:47.273 回答
1

我知道这是一篇很老的帖子,但我想我会在处于类似职位后给出我的意见。

以下是我编写的用于从对象等创建 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)

无论如何,我希望这对将来处于类似情况的人有所帮助。

于 2020-06-23T13:23:06.780 回答