【问题标题】:Sending email message with attachment by powershell with a batch file通过带有批处理文件的PowerShell发送带有附件的电子邮件
【发布时间】:2020-06-15 00:50:00
【问题描述】:

嗨,我正在尝试从批处理 file.bat 发送电子邮件,但我收到了一个红色错误列表,并且滚动速度非常快,并且窗口关闭也很快我试图通过命令使其保持打开状态

cmd /k

它仍然打开,但不会显示任何错误列表。

不是这样:我使用 Gmail 帐户作为 smtp,我打开了 smtp 设置并启用了不太安全的登录选项。

最后运行 bat 的是那个命令。 cmd执行命令:

file.bat "mygmail@gmail.com" "mypassword" "D:\test\myFile.txt"

file.bat 包含:

@ECHO OFF
    SET GmailAccount=%~1
    SET GmailPassword=%~2
    SET Attachment=%~3

    CALL :PowerShell
    CD /D "%PowerShellDir%"
    Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%GmailAccount%' '%GmailPassword%' '%Attachment%'"
    EXIT

    :PowerShell
    SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
    SET PSScript=%temp%\~tmpSendeMail.ps1
    IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"

    ECHO $Username      = $args[0]>> "%PSScript%"
    ECHO $EmailPassword = $args[1]>> "%PSScript%"
    ECHO $Attachment    = $args[2]>> "%PSScript%"
    ECHO                          >> "%PSScript%"
    ECHO $Username    = $Username                 >> "%PSScript%"
    ECHO $EmailTo     = "target@mail.com" >> "%PSScript%"
    ECHO $EmailFrom   = "mygmail@gmail.com" >> "%PSScript%"
    ECHO $Subject     = "test"           >> "%PSScript%"
    ECHO $Body        = "test"              >> "%PSScript%"
    ECHO $SMTPServer  = "smtp.gmail.com"          >> "%PSScript%"
    ECHO $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body) >> "%PSScript%"
    ECHO $Attachment  = New-Object System.Net.Mail.Attachment($Attachment)                            >> "%PSScript%"
    ECHO $SMTPMessage.Attachments.Add($Attachment)                                                    >> "%PSScript%"
    ECHO $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)                               >> "%PSScript%"
    ECHO $SMTPClient.EnableSsl = $true                                                                >> "%PSScript%"
    ECHO $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword) >> "%PSScript%"
    ECHO $SMTPClient.Send($SMTPMessage)     

请帮助我这里有什么问题。谢谢。

【问题讨论】:

  • 写一个空行:用echo/替换echo <a lot of spaces>(加上很多空格,如果你坚持的话)。您忘记将最后一行重定向到 PS-Script。将exit 替换为exit /b 以避免关闭窗口。
  • 除了 Stephan 提出的非常好的建议之外,我建议删除 IF EXIST "%PSScript%" DEL /Q /F "%PSScript%" 并在下一行 ECHO $Username = $args[0]>> "%PSScript%" 删除一个 > 以创建 PowerShell 脚本文件并覆盖现有文件。在我看来,编写一个创建 PowerShell 脚本并使用该脚本文件执行 PowerShell 的批处理文件是没有意义的。为什么不编写 PowerShell 脚本并使用该脚本文件和脚本的三个参数启动 PowerShell?

标签: powershell email batch-file


【解决方案1】:

首先:This is a reminder for how to use less secure applications with google accounts

PS-Gmail-Sender.bat

@ECHO OFF
REM https://stackoverflow.com/questions/28605803/can-not-send-mail-using-smtp-gmail-com-port-587-from-vbs-script/28606754#28606754
Title Sending E-Mail with Gmail Less Secure Applications using Powershell and Batch
SET GmailAccount="%~1"
SET GmailPassword="%~2"
SET Attachment="%~3"
REM We write our Powershell script 
CALL :WritePS
REM We execute our Powershell script .PS1 by passing arguments from the command line or a batch file
Powershell -ExecutionPolicy bypass -noprofile -file "%PSScript%" "%GmailAccount%" "%GmailPassword%" "%Attachment%"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
pause
EXIT
REM -----------------------------------------------------------------------------------------------------
:WritePS
SET PSScript=%temp%\temp_SendeMail.ps1
> "%PSScript%" (
    ECHO $Username  = $args[0]
    ECHO $EmailPassword = $args[1]
    ECHO $Attachment= $args[2]
    ECHO $EmailTo = $Username
    ECHO $EmailFrom  = $Username
    ECHO $Subject = "This email was sent from Powershell script into a batch file with Less Secure Application Enabled"   
    ECHO $Body= "Test Email Sending with a script"  
    ECHO $SMTPServer  = "smtp.gmail.com"  
    ECHO $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body^) 
    ECHO $Attachment  = New-Object System.Net.Mail.Attachment($Attachment^)
    ECHO $SMTPMessage.Attachments.Add($Attachment^)
    ECHO $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587^)
    ECHO $SMTPClient.EnableSsl = $true
    ECHO $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword^) 
    ECHO $SMTPClient.Send($SMTPMessage^)
)
Exit /B
REM -----------------------------------------------------------------------------------------------------

因此,我们可以使用命令行或批处理文件来调用它:

PS-Gmail-Sender.bat "Mygmail_Account@gmail.com" "MyGmail_Password" "D:\test\myFile.txt"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2023-03-25
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多