web-dev-qa-db-ja.com

PowerShellでメールにファイルを添付する方法

メールを作成するPowerShellスクリプトを作成しましたが、ファイルを添付できないようです。ファイルが存在し、PowerShellでそれを開くことができます。私が間違っていることを誰かに教えてもらえますか?

$ol = New-Object -comObject Outlook.Application 
$message = $ol.CreateItem(0)
$message.Recipients.Add("Deployment")  
$message.Subject = "Website deployment"  
$message.Body = "See attached file for the updates made to the website`r`n`r`nWarm Regards`r`nLuke"

# Attach a file this doesn't work
$file = "K:\Deploy-log.csv"
$attachment = new-object System.Net.Mail.Attachment $file
$message.Attachments.Add($attachment)
13
TheLukeMcCarthy

行を削除して上記を機能させました

$attachment = new-object System.Net.Mail.Attachment $file

そして変化

$message.Attachments.Add($attachment)

$message.Attachments.Add($file)

@Keith Hillが提供するソリューションの方が優れていますが、ゴグルを多くしても、うまく機能しませんでした。

10
TheLukeMcCarthy

PowerShell 2.0を使用している場合は、組み込みのコマンドレットSend-MailMessageを使用します。

C:\PS>Send-MailMessage -from "User01 <[email protected]>" `
                       -to "User02 <[email protected]>", `
                           "User03 <[email protected]>" `
                       -subject "Sending the Attachment" `
                       -body "Forgot to send the attachment. Sending now." `
                       -Attachment "data.csv" -smtpServer smtp.fabrikam.com

コピー/貼り付けする場合は、バックティックの後に追加された余分なスペースに注意してください。 PowerShellはそれが好きではありません。

14
Keith Hill

これはpowershell-を使用して私のために働きました

変数を定義します。

$fromaddress = "[email protected]" 
$toaddress = "[email protected]" 
$Subject = "Test message" 
$body = "Please find attached - test"
$attachment = "C:\temp\test.csv" 
$smtpserver = "mail.pd.com" 

スクリプトで変数を使用します。

$message = new-object System.Net.Mail.MailMessage 
$message.From = $fromaddress 
$message.To.Add($toaddress)
$message.IsBodyHtml = $True 
$message.Subject = $Subject 
$attach = new-object Net.Mail.Attachment($attachment) 
$message.Attachments.Add($attach) 
$message.body = $body 
$smtp = new-object Net.Mail.SmtpClient($smtpserver) 
$smtp.Send($message)
3
P.D

私はそのような問題を経験しました(Windows 10/PS 5.1)私のSMTPは認証または安全ではありません...この行 "MyAttacheObject.Dispose()"で終了する必要があります...

$smtp = new-object Net.Mail.SmtpClient($smtpserver) 
$attach.Dispose()

これは2つの添付ファイルを持つ私のコードです:

# Email configuration NO AUTH NO SECURE
$emailHost = "smtp.bot.com"
$emailUser = ""
$emailPass = ""
$emailFrom = "[email protected]"
$emailsTo=@("[email protected]","[email protected]")
$emailSubject = $title
$emailbody=$body
$attachment1 = @($PATh+$outFile) 
$attachment2 = @($PATh+$inFile) 
#End of parameters

$msg = New-Object System.Net.Mail.MailMessage
$msg.from = ($emailFrom)
    foreach ($d in $emailsTo) {    
    $msg.to.add($d)
    }
$msg.Subject = $emailSubject
$msg.Body = $emailbody
$msg.isBodyhtml = $true   

$att = new-object System.Net.Mail.Attachment($attachment1)
$msg.Attachments.add($att)
$att = new-object System.Net.Mail.Attachment($attachment2)
$msg.Attachments.add($att)
$smtp = New-Object System.Net.Mail.SmtpClient $emailHost
$smtp.Credentials = New-Object System.Net.NetworkCredential($emailUser, $emailPass);
  $smtp.send($msg)
  $att.Dispose()
0
JMMDL

Send-mailmessageまたはsystem.net.mail.MailMessageを使用してそれを実現できます。興味深いことに、2つのアプローチには実行時間に大きな違いがあります。 measure-commandを使用して、コマンドの実行時間を監視できます。

0
Bill