2

ADユーザーのリストをCSVとして電子メールで送信したいのですが、電子メールで送信する前に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

上記の提案/承認された回答は正しくなく、機能しません。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 に答える
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 に答える
2

-Attachmentsパラメータに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添付ファイルを作成するために作成した基本的な関数です。

これを機能させるための主な問題の1つは、最初に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答えの1つは、機能するためにファイルパスへの文字列を必要とするという意味で正しいです。

ただし、次を使用する[Net.Mail.MailMessage]代わりに、.netライブラリを使用して電子メールを作成できます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 に答える