使用 bat 文件将文件发送到电子邮件地址而不暴露电子邮件信息?

min*_*geh 2 windows gmail email batch batch-file

我想通过 bat 文件向我的 Gmail 帐户发送一个文件,并在该 bat 文件中加密我的电子邮件信息,这样如果有人打开 bat 文件,他们就无法从中获取电子邮件信息。

逻辑如:

  1. 检查互联网是否正常工作

    • 如果确定发送文件,然后删除 bat 文件
  2. 检查互联网是否正常工作

    • 如果没有安排它稍后执行或将其添加到启动中

    • 完成后将其从计划或启动中删除!

Vom*_*yle 9

如果您需要通过PowerShell 脚本与构建和发送电子邮件的逻辑来发送电子邮件(即使带有附件),您可以通过批处理脚本执行它,将敏感值作为参数传入,而不是将敏感值硬编码到脚本逻辑。

PowerShell脚本逻辑可以接受的参数,如Gmail的本地邮箱的用户名,密码进行身份验证以发送电子邮件,和其他任何你不想硬编码在脚本中。

  • PowerShell 参数

    在脚本或函数中,您可以使用 $args 数组引用未命名的参数,例如将所有参数传递给 cmdlet。您还可以通过它们的位置来引用特定参数:

    "第一个参数是" + $Args[0]"

    "第二个参数是" + $Args[1]"

您还可以将逻辑放在批处理脚本中,以便它也有参数,您可以在执行时将敏感值传递给它,并使用参数占位符而不是硬编码敏感值。

  • 批量参数

    您可以使用 a%后跟它在命令行上的数字位置来获取任何参数的值。传递的第一项始终%1为第二项%2,以此类推

    %*批处理脚本是指所有的参数(如%1 %2 %3 %4 %5 ...%255)只有参数%1%9可以通过编号来引用。

这样,如果脚本被打开,您需要保护的敏感值将不会暴露或硬编码到脚本逻辑中,以便任何人查看谁可能对脚本具有读取权限。


重要说明: 在每个 PowerShell 脚本示例名称Batch Execute Script的底部都有一个部分,该部分具有要从批处理脚本中使用的逻辑来执行或其他任何内容,因此您将使用传递用户名、密码和/或附件完整路径作为批处理脚本的适当参数,sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"

PowerShell 脚本(无附件)

$Username      = $args[0]
$EmailPassword = $args[1]

$Username = $Username
$EmailTo = "EmailAddress@domain.com" 
$EmailFrom = "noreply@Whatever.notify"
$Subject = "Email Subject"
$Body = "Email Body"
$SMTPServer = "smtp.gmail.com" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword); 
$SMTPClient.Send($SMTPMessage)
Run Code Online (Sandbox Code Playgroud)

批量执行脚本

SET GmailAccount=%~1
SET GmailPassword=%~2
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& 'C:\Scripts\SendEmail.ps1' '%GmailAccount%' '%GmailPassword%'"
Run Code Online (Sandbox Code Playgroud)

PowerShell 脚本(带附件)

$Username      = $args[0]
$EmailPassword = $args[1]
$Attachment    = $args[2]

$Username = $Username
$EmailTo = "EmailAddress@domain.com" 
$EmailFrom = "noreply@Whatever.notify"
$Subject = "Email Subject"
$Body = "Email Body"
$SMTPServer = "smtp.gmail.com" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body)
$Attachment = New-Object System.Net.Mail.Attachment($Attachment)
$SMTPMessage.Attachments.Add($Attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword); 
$SMTPClient.Send($SMTPMessage)
Run Code Online (Sandbox Code Playgroud)

批量执行脚本

SET GmailAccount=%~1
SET GmailPassword=%~2
SET Attachment=%~3
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%" 
Powershell -ExecutionPolicy Bypass -Command "& 'C:\Scripts\SendEmail.ps1' '%GmailAccount%' '%GmailPassword%' '%Attachment%'"
Run Code Online (Sandbox Code Playgroud)

批处理脚本(动态)

这是一个多合一的动态批处理脚本,您只需传递 Gmail 帐户用户名、Gmail 帐户密码和附件的完整路径即可。

@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     = "EmailAddress@domain.com" >> "%PSScript%"
ECHO $EmailFrom   = "noreply@Whatever.notify" >> "%PSScript%"
ECHO $Subject     = "Email Subject"           >> "%PSScript%"
ECHO $Body        = "Email Body"              >> "%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)                                                               >> "%PSScript%"
GOTO :EOF
Run Code Online (Sandbox Code Playgroud)

您可以像这样执行批处理脚本。. .

 sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


批处理脚本(静态和自删除)

该脚本将在的变量设定的硬编码值GmailAccount=GmailPassword=以及Attachment=但是一旦执行,将完全删除[本身]脚本通过"%~FN0"其中0的脚本本身。这意味着您需要确保复制此脚本,然后仅从您将在不希望暴露此信息的地方执行的机器上运行该副本。

@ECHO OFF

SET GmailAccount=<GmailAccountName>
SET GmailPassword=<GmailPassword>
SET Attachment=<FullAttachmentPath>

CALL :PowerShell
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%GmailAccount%' '%GmailPassword%' '%Attachment%'"
IF EXIST "%~FN0" DEL /Q /F "%~FN0"
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     = "EmailAddress@domain.com" >> "%PSScript%"
ECHO $EmailFrom   = "noreply@Whatever.notify" >> "%PSScript%"
ECHO $Subject     = "Email Subject"           >> "%PSScript%"
ECHO $Body        = "Email Body"              >> "%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)                                                               >> "%PSScript%"
GOTO :EOF
Run Code Online (Sandbox Code Playgroud)

更多资源