代码之家  ›  专栏  ›  技术社区  ›  TheLukeMcCarthy

如何使用PowerShell将文件附加到电子邮件

  •  12
  • TheLukeMcCarthy  · 技术社区  · 14 年前

    我已经编写了一个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)
    
    4 回复  |  直到 14 年前
        1
  •  14
  •   Keith Hill    14 年前

    如果您使用的是PowerShell 2.0,请使用内置的cmdlet发送邮件:

    C:\PS>Send-MailMessage -from "User01 <user01@example.com>" `
                           -to "User02 <user02@example.com>", `
                               "User03 <user03@example.com>" `
                           -subject "Sending the Attachment" `
                           -body "Forgot to send the attachment. Sending now." `
                           -Attachment "data.csv" -smtpServer smtp.fabrikam.com
    

    如果您复制/粘贴此文件,请注意在反勾号后添加的额外空间。PowerShell不喜欢。

        2
  •  9
  •   TheLukeMcCarthy    14 年前

    我把这条线拔掉了

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

    以及改变

    $message.Attachments.Add($attachment)
    

    $message.Attachments.Add($file)
    

    虽然由@Keith Hill提供的解决方案会更好,但即使有很多护目镜,我也无法让它工作。

        3
  •  3
  •   Stephen Rauch Afsar Ali    6 年前

    这对我来说很管用-

    定义变量:

    $fromaddress = "donotreply@pd.com" 
    $toaddress = "test@pd.com" 
    $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)
    
        4
  •  0
  •   Bill RedRumming    14 年前

    您可以使用send mailmessage或system.net.mail.mailmessage来完成此任务。有趣的是,这两种方法之间存在显著的执行时间差异。可以使用measure命令观察命令的执行时间。

        5
  •  0
  •   JMMDL    5 年前

    我遇到过这样的问题(windows 10/PS 5.1) 我必须在“MyAttacheObject.Dispose()”这行结束

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

    这是我的代码,有两个附件:

    # Email configuration NO AUTH NO SECURE
    $emailHost = "smtp.bot.com"
    $emailUser = ""
    $emailPass = ""
    $emailFrom = "myemail@bot.com"
    $emailsTo=@("toyoumylove@bot.com","toyoumybad@bot.com")
    $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()