Отправить файл на адрес электронной почты, используя файл bat, не раскрывая информацию электронной почты?

Я хочу отправить файл в свою учетную запись Gmail через файл bat и зашифровать информацию о моей электронной почте в этом файле bat, чтобы, если кто-то откроет файл bat, он не мог получить информацию о нем из электронной почты.

Логика такая как:

  1. проверьте, правильно ли работает интернет

    • если все в порядке, отправьте файл, а затем удалите файл bat
  2. проверьте, правильно ли работает интернет

    • если нет Запланируйте это сделать позже или добавьте его к запуску

    • когда закончите, удалите его из расписания или запуска!

1 ответ

Решение

Если вам нужно отправить электронное письмо - даже с вложением - с помощью скрипта PowerShell с логикой, которая создает и отправляет электронное письмо, вы можете выполнить его с помощью пакетного скрипта, передавая конфиденциальные значения в качестве аргументов, а не жестко кодирующие конфиденциальные значения в логика сценария

Логика скрипта PowerShell может принимать такие аргументы, как имя пользователя локального почтового ящика Gmail, пароль для аутентификации при отправке электронной почты и все, что вы не хотите жестко запрограммировать в сценарии.

  • PowerShell Args

    Внутри скрипта или функции вы можете ссылаться на безымянные аргументы, используя массив $ args, например, передавая все аргументы в командлет. Вы также можете ссылаться на конкретные аргументы по их позиции:

    "Первый аргумент" + $Args[0] "

    "Второй аргумент" + $Args[1] "

Вы также можете поместить логику в пакетный скрипт, чтобы он также имел аргументы, которые вы можете передавать чувствительным значениям во время выполнения, и использовать заполнители аргументов, а не жестко кодировать чувствительные значения.

  • Пакетные Арги

    Вы можете получить значение любого аргумента, используя % за ним следует числовая позиция в командной строке. Первый пройденный пункт всегда %1 второй пункт всегда %2 и так далее

    %* в пакетном скрипте ссылается на все аргументы (например, %1 %2 %3 %4 %5...%255) только аргументы %1 в %9 можно ссылаться по номеру.

Таким образом, если сценарии открыты, конфиденциальные значения, которые необходимо защитить, не будут выставлены или жестко закодированы в логике сценария для тех, кто может видеть, кто может иметь доступ для чтения к сценарию.


Важное примечание. Внизу каждого примера сценария PowerShell есть раздел с именем " Пакетный сценарий выполнения", который имеет логику для выполнения из пакетного сценария или чего-либо другого, поэтому вы будете использовать полный путь к имени пользователя, паролю и / или вложения в качестве соответствующие аргументы для пакетного сценария, т.е. 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)

Пакетный сценарий выполнения

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%'"

Скрипт 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)

Пакетный сценарий выполнения

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%'"

Пакетный скрипт (динамический)

Вот динамический пакетный сценарий "все в одном", в котором вы просто передаете имя пользователя учетной записи 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

Вы выполняете пакетный скрипт следующим образом. , ,

 sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"


Пакетный скрипт (статический и самоуничтожающийся)

Этот сценарий будет иметь жестко заданные значения, установленные в переменных 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

Дополнительные ресурсы

Другие вопросы по тегам