使用Google 2FA发送Powershell电子邮件?

时间:2017-10-01 20:29:41

标签: .net powershell email automation

我是Powershell开发人员,对社区建议电子邮件提供商发送每日通知感到好奇。

这是供个人使用,但我知道Google的2FA会阻止自动化这类事情。

基本上只是希望能够通过电子邮件la Send-MailMessage向我发送每日提醒,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您创建了应用密码,可以使用gmail启用双因素身份验证。请参阅my answer hereGoogles documentation here

答案 1 :(得分:0)

Gmail用户可以在官方网站上访问其帐户,也可以使用第一方或第三方应用和服务。第一方应用程序是Google的Android官方Gmail应用程序,而Thunderbird和Windows 8的邮件客户端应用程序是第三方应用程序。

Google announced早在2014年4月,它将改善其服务的登录安全性,并影响向公司发送用户名和密码的任何应用程序。

该公司建议当时切换到OAuth 2.0,但直到现在才强制执行。

如果您在Google上的安全设置下打开新的less secure应用页面,您会发现Google默认禁用了访问权限。

注意:只有在您未使用Google Apps或已为该帐户启用双因素身份验证时才能看到该页面。

您可以在此处翻转开关以再次启用安全性较低的应用程序,以便重新获得访问权限。

enter image description here

这是一个使用混合代码批处理和Powershell脚本发送带有SSL身份验证的电子邮件的示例。

只需将其另存为 Gmail_PS_Batch_Sender.bat

<# : Batch portion
@rem # The previous line does nothing in Batch, but begins a multiline comment block
@rem # in PowerShell.  This allows a single script to be executed by both interpreters.
@echo off & Mode 100,5 & color 0A
Title Sending E-mail with SSL Authentification with an Hybrid code Batch and Powershell Script by Hackoo
echo(
rem # This a Powershell command executes the hybrid portion at the bottom of this script
for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0}|out-string)"') do set "%%I"
exit /b
rem # End multi-line PowerShell comment block.  Begin PowerShell scripting.
: end Batch / begin PowerShell hybrid code #>
#################################### First 1 Step ###########################################
# First Step we encrypt the Plain Text Password to an encrypted one using the key AES.key
# Première étape, nous cryptons le mot de passe en clair vers un mot de passe chiffré
# à l'aide de la clé AES.key
$AppData = [Environment]::GetFolderPath('ApplicationData')
$KeyFile = $AppData+"\AES.key"
$Key = New-Object Byte[] 32   # You can use 16, 24, or 32 for AES 
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Key)
$Key | out-file $KeyFile
$AppData = [Environment]::GetFolderPath('ApplicationData')
$PasswordFile = $AppData+"\Password.txt"
$Key = Get-Content $KeyFile
$GmailUserName = Read-Host "Please enter your Gmail Account without ""@gmail.com"" "
$Password = Read-Host "Please enter your Gmail Password to be encrypted " -AsSecureString `
| ConvertFrom-SecureString -key $Key | Out-File $PasswordFile
#################################### First 1 Step ###########################################

#################################### Second 2 Step ##########################################
# We send the email with our encrypted Credentials
# Nous envoyons le courrier électronique avec les informations d'identification cryptés
#############################################################################################
Function Show-BalloonTip {
  [CmdletBinding(SupportsShouldProcess = $true)]
  param (
    [Parameter(Mandatory=$true)]$Text,
    [Parameter(Mandatory=$true)]$Title,   
    [ValidateSet('None', 'Info', 'Warning', 'Error')]$Icon = 'Info',
    $Timeout = 10000
  )
  Add-Type -AssemblyName System.Windows.Forms

  if ($script:balloon -eq $null) { $script:balloon = New-Object System.Windows.Forms.NotifyIcon }

  $path                    = Get-Process -id $pid | Select-Object -ExpandProperty Path
  $balloon.Icon            = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
  $balloon.BalloonTipIcon  = $Icon
  $balloon.BalloonTipText  = $Text
  $balloon.BalloonTipTitle = $Title
  $balloon.Visible         = $true
  $balloon.ShowBalloonTip($Timeout)
  Start-Sleep -s 10
  $balloon.Dispose()
}
################################################################################################
function Show-Message {

param (
    [string]$Message = "Veuillez entrer votre message",
    [string]$Titre = "Titre de la fenêtre",
    [switch]$OKCancel,
    [switch]$AbortRetryIgnore,
    [switch]$YesNoCancel,
    [switch]$YesNo,
    [switch]$RetryCancel,
    [switch]$IconErreur,
    [switch]$IconQuestion,
    [switch]$IconAvertissement,
    [switch]$IconInformation
    )

# Affecter la valeur selon le type de boutons choisis
if ($OKCancel) { $Btn = 1 }
elseif ($AbortRetryIgnore) { $Btn = 2 }
elseif ($YesNoCancel) { $Btn = 3 }
elseif ($YesNo) { $Btn = 4 }
elseif ($RetryCancel) { $Btn = 5 }
else { $Btn = 0 }

# Affecter la valeur pour l'icone 
if ($IconErreur) {$Icon = 16 }
elseif ($IconQuestion) {$Icon = 32 }
elseif ($IconAvertissement) {$Icon = 48 }
elseif ($IconInformation) {$Icon = 64 }
else {$Icon = 0 }

# Charger la biblithèque d'objets graphiques Windows.Forms
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

# Afficher la boite de dialogue et renvoyer la valeur de retour (bouton appuyé)
$Reponse = [System.Windows.Forms.MessageBox]::Show($Message, $Titre , $Btn, $Icon)
Return $Reponse
}
################################################################################################
$SuccessMsg = "The email was sent successfully ; Please, check your email !"
$FailureMsg = "ERROR occurred while sending the email"
$AppData = [Environment]::GetFolderPath('ApplicationData')
$PasswordFile = $AppData+"\Password.txt"
$keyFile = $AppData+"\AES.Key"
$key = Get-Content $KeyFile
$GmailEncryptedPassword = Get-Content $PasswordFile | ConvertTo-SecureString -Key $key
$Credentials = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList($GmailUserName,$GmailEncryptedPassword)
$EmailFrom = $GmailUserName+"@gmail.com"
$EmailTo = $EmailFrom
$Subject = "Sending E-mail with SSL Authentification with an Hybrid code Batch and Powershell Script"
$Body = (Get-Date -format F)  + "  Hello ! the sending email is working now with PowerShell and Batch Script!"
$SMTPServer = "smtp.gmail.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer,587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = $Credentials
try
{
  $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
  Show-Message -Message $SuccessMsg -Titre $SuccessMsg -IconInformation
  Show-BalloonTip -Text $SuccessMsg -Title $SuccessMsg -Icon 'Info'
}
catch
{
  Show-Message -Message $_.Exception.Message -Titre $FailureMsg -IconErreur
  Show-BalloonTip -Text $_.Exception.Message -Title 'ERROR occurred while sending the email' -Icon 'Error' 
}
exit(1)