<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Уведомление о событии через электронную почту]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17885&amp;type=atom" />
	<updated>2023-08-07T16:40:14Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=17885</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158957#p158957" />
			<content type="html"><![CDATA[<p>В любом случае посмотрите, где встречается ExitApp и уберите.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-08-07T16:40:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158957#p158957</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158953#p158953" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong>, кажется, у меня нет такой строки. Или имеется в виду замена этой строки на альтернативную?<br /></p><div class="codebox"><pre><code>	MsgBox, 4096, TOP - Set and press ОК
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2023-08-07T10:22:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158953#p158953</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158924#p158924" />
			<content type="html"><![CDATA[<p>Уберите <em>ExitApp</em> после <em>msgbox done</em>.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-07-30T23:47:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158924#p158924</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158923#p158923" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong>, спасибо! Добавил #Persistent, но сценарий по-прежнему завершает свою работу после закрытия всплывающего окна. Подскажете другие варианты?</p>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2023-07-30T21:10:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158923#p158923</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158917#p158917" />
			<content type="html"><![CDATA[<p>Напишите сверху #Persistent.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-07-29T20:39:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158917#p158917</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158916#p158916" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong>, спасибо! Работает! Только в этом случае, код вставил не в виде функции, а в виде метки, и теперь, после нажатия OK во всплывающем окне, скрипт заканчивает свою работу. Подскажите, что нужно добавить, чтобы этого не происходило?</p><div class="codebox"><pre><code>SetTimer, Alert, 100

Alert:
ImageSearch, x, y, 0, 0, A_ScreenWidth, A_ScreenHeight, pic.png
If !ErrorLevel {
	SoundPlay, audio.mp3
	goto SendMail
	MsgBox, 4096, TOP - Set and press ОК
}
return
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2023-07-29T20:20:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158916#p158916</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158873#p158873" />
			<content type="html"><![CDATA[<p>Вот этот код от <strong>Malcev</strong> для отправки почты из аккаунта google у меня сейчас работает:<br /></p><div class="codebox"><pre><code>server := &quot;smtp.googlemail.com&quot;
port := 465
login := &quot;mylogin&quot;
password := &quot;mypassword&quot;

MailTo := &quot;someone@mail.ru&quot;
Subject := &quot;Test from me&quot;
EmailText := &quot;This is a test message&quot;

Base64 := Base64(login, password)
data = 
(
EHLO Misha \r\n
AUTH PLAIN %Base64% \r\n
MAIL FROM:&lt;%login%&gt; \r\n
RCPT TO:&lt;%MailTo%&gt; \r\n
DATA \r\n
Subject: %Subject% \r\n\r\n %EmailText% \r\n.\r\n
QUIT \r\n
)

dwSSPIFlags := (ISC_REQ_SEQUENCE_DETECT := 8) | (ISC_REQ_REPLAY_DETECT := 4) | (ISC_REQ_CONFIDENTIALITY := 16) | (ISC_RET_EXTENDED_ERROR := 16384) | (ISC_REQ_ALLOCATE_MEMORY := 256) | (ISC_REQ_STREAM := 32768)
SEC_E_OK := 0
SEC_I_CONTINUE_NEEDED := 0x00090312
SEC_E_INCOMPLETE_MESSAGE := 0x80090318
SEC_I_INCOMPLETE_CREDENTIALS := 0x00090320
SEC_I_CONTEXT_EXPIRED := 0x00090317
SEC_I_RENEGOTIATE := 0x00090321
SECBUFFER_DATA := 1
SECBUFFER_TOKEN := 2
SECBUFFER_EXTRA := 5
SECBUFFER_STREAM_TRAILER := 6
SECBUFFER_STREAM_HEADER := 7
IO_BUFFER_SIZE := 65536

DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;ws2_32.dll&quot;, &quot;ptr&quot;)
VarSetCapacity(WSADATA, 394 + (A_PtrSize - 2) + A_PtrSize, 0)
DllCall(&quot;ws2_32\WSAStartup&quot;, &quot;ushort&quot;, 0x0202, &quot;ptr&quot;, &amp;WSADATA)
socket := DllCall(&quot;ws2_32\socket&quot;, &quot;int&quot;, PF_INET := 2, &quot;int&quot;, SOCK_STREAM := 1, &quot;int&quot;, 0)
sin_port := DllCall(&quot;ws2_32\htons&quot;, &quot;ushort&quot;, port, &quot;ushort&quot;)
VarSetCapacity(addrinfo, 16+4*A_PtrSize, 0)
NumPut(AF_INET := 2, addrinfo, 4, &quot;int&quot;)
NumPut(SOCK_STREAM := 1, addrinfo, 8, &quot;int&quot;)
NumPut(IPPROTO_TCP := 6, addrinfo, 12, &quot;int&quot;)
DllCall(&quot;ws2_32\getaddrinfo&quot;, &quot;astr&quot;, server, &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;addrinfo, &quot;ptr*&quot;, addrinfoOut)
addrinfoOut_ai_addr := NumGet(addrinfoOut+0, 16+2*A_PtrSize, &quot;ptr&quot;)
sin_addr := NumGet(addrinfoOut_ai_addr+0, 4, &quot;uint&quot;)
VarSetCapacity(sockaddr_in, 16, 0)
NumPut(AF_INET := 2, sockaddr_in, 0, &quot;short&quot;)   ; sin_family
NumPut(sin_port, sockaddr_in, 2, &quot;ushort&quot;)   ; sin_port
NumPut(sin_addr, sockaddr_in, 4, &quot;uint&quot;)   ; sin_addr
DllCall(&quot;ws2_32\connect&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, &amp;sockaddr_in, &quot;int&quot;, 16)

DllCall(&quot;LoadLibrary&quot;,&quot;str&quot;, &quot;Secur32.dll&quot;, &quot;ptr&quot;)
g_pSSPI := DllCall(&quot;Secur32\InitSecurityInterface&quot;, &quot;ptr&quot;)
VarSetCapacity(hCreds, 2*A_PtrSize, 0)
VarSetCapacity(SchannelCred, A_PtrSize*6+40, 0)
NumPut(SCHANNEL_CRED_VERSION := 4, SchannelCred, 0, &quot;uint&quot;)   ; dwVersion
NumPut(SP_PROT_TLS1_2_CLIENT := 0x800, SchannelCred, A_PtrSize*6+16, &quot;uint&quot;)   ; grbitEnabledProtocols
NumPut(SCH_CRED_NO_DEFAULT_CREDS := 0x00000010, SchannelCred, A_PtrSize*6+32, &quot;uint&quot;)   ; dwFlags
DllCall(NumGet(g_pSSPI+3*A_PtrSize), &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;(UNISP_NAME := &quot;Microsoft Unified Security Protocol Provider&quot;), &quot;uint&quot;, SECPKG_CRED_OUTBOUND := 0x2, &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;SchannelCred, &quot;ptr&quot;, 0, &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;hCreds, &quot;int64*&quot;, tsExpiry)   ; AcquireCredentialsHandle
VarSetCapacity(OutBuffers, 8+A_PtrSize, 0)
NumPut(SECBUFFER_TOKEN, OutBuffers, 4, &quot;uint&quot;)   ; BufferType
VarSetCapacity(OutBuffer, 8+A_PtrSize, 0)
NumPut(1, OutBuffer, 4, &quot;uint&quot;)   ; cBuffers
NumPut(&amp;OutBuffers, OutBuffer, 8, &quot;ptr&quot;)   ; pBuffers
VarSetCapacity(hContext, 2*A_PtrSize, 0)
scRet := DllCall(NumGet(g_pSSPI+6*A_PtrSize), &quot;ptr&quot;, &amp;hCreds, &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;server, &quot;uint&quot;, dwSSPIFlags, &quot;uint&quot;, 0, &quot;uint&quot;, SECURITY_NATIVE_DREP := 16, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, &amp;OutBuffer, &quot;uint*&quot;, dwSSPIOutFlags, &quot;int64*&quot;, tsExpiry, &quot;uint&quot;)   ; InitializeSecurityContext
if (scRet != SEC_I_CONTINUE_NEEDED)
{
   msgbox InitializeSecurityContext first time error
   exitapp
}
OutBuffers0_cbBuffer := NumGet(OutBuffers, 0, &quot;uint&quot;)
OutBuffers0_pvBuffer := NumGet(OutBuffers, 8, &quot;ptr&quot;)
if (OutBuffers0_cbBuffer != 0) and (OutBuffers0_pvBuffer != 0)
{
   cbData := DllCall(&quot;ws2_32\send&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, OutBuffers0_pvBuffer, &quot;int&quot;, OutBuffers0_cbBuffer, &quot;int&quot;, 0)
   if (cbData &lt;= 0)
   {
      msgbox ws2_32\send first time error
      exitapp
   }
   DllCall(NumGet(g_pSSPI+16*A_PtrSize), &quot;ptr&quot;, OutBuffers0_pvBuffer)   ; FreeContextBuffer
}
fDoRead := 1
GoSub HandshakeLoop
VarSetCapacity(Sizes, 20, 0)
scRet := DllCall(NumGet(g_pSSPI+11*A_PtrSize), &quot;ptr&quot;, &amp;hContext, &quot;uint&quot;, SECPKG_ATTR_STREAM_SIZES := 4, &quot;ptr&quot;, &amp;Sizes, &quot;uint&quot;)   ; QueryContextAttributes
if (scRet != SEC_E_OK)
{
   msgbox QueryContextAttributes error
   exitapp
}
Sizes_cbHeader := NumGet(Sizes, 0, &quot;uint&quot;)
Sizes_cbTrailer := NumGet(Sizes, 4, &quot;uint&quot;)
Sizes_cbMaximumMessage := NumGet(Sizes, 8, &quot;uint&quot;)
cbIoBufferLength := Sizes_cbHeader + Sizes_cbMaximumMessage + Sizes_cbTrailer
VarSetCapacity(pbIoBuffer, cbIoBufferLength, 0)
GoSub ReadDecrypt
Loop, parse, data, `n, `r
{
   sendData := A_LoopField
   sendData := StrReplace(sendData, &quot;\r\n&quot;, &quot;`r`n&quot;)
   GoSub EncryptSend
}

;DisconnectFromServer
VarSetCapacity(SCHANNEL_SHUTDOWN, 4, 0)
NumPut(1, SCHANNEL_SHUTDOWN, 0, &quot;int&quot;)
VarSetCapacity(OutBuffers, 8+A_PtrSize, 0)
NumPut(4, OutBuffers, 0, &quot;uint&quot;)   ; cbBuffer
NumPut(SECBUFFER_TOKEN, OutBuffers, 4, &quot;uint&quot;)   ; BufferType
NumPut(&amp;SCHANNEL_SHUTDOWN, OutBuffers, 8, &quot;ptr&quot;)   ; pbBuffer
VarSetCapacity(OutBuffer, 8+A_PtrSize, 0)
NumPut(1, OutBuffer, 4, &quot;uint&quot;)   ; cBuffers
NumPut(&amp;OutBuffers, OutBuffer, 8, &quot;ptr&quot;)   ; pBuffers
scRet := DllCall(NumGet(g_pSSPI+10*A_PtrSize), &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, &amp;OutBuffer, &quot;uint&quot;)   ; ApplyControlToken
if (scRet != SEC_E_OK)
{
   msgbox ApplyControlToken error
   exitapp
}
VarSetCapacity(OutBuffers, 8+A_PtrSize, 0)
NumPut(SECBUFFER_TOKEN, OutBuffers, 4, &quot;uint&quot;)   ; BufferType
VarSetCapacity(OutBuffer, 8+A_PtrSize, 0)
NumPut(1, OutBuffer, 4, &quot;uint&quot;)   ; cBuffers
NumPut(&amp;OutBuffers, OutBuffer, 8, &quot;ptr&quot;)   ; pBuffers
scRet := DllCall(NumGet(g_pSSPI+6*A_PtrSize), &quot;ptr&quot;, &amp;hCreds, &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, 0, &quot;uint&quot;, dwSSPIFlags, &quot;uint&quot;, 0, &quot;uint&quot;, SECURITY_NATIVE_DREP := 16, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, &amp;OutBuffer, &quot;uint*&quot;, dwSSPIOutFlags, &quot;int64*&quot;, tsExpiry, &quot;uint&quot;)   ; InitializeSecurityContext
if (scRet &gt;= 0x80000000)
{
   msgbox InitializeSecurityContext disconnect error
   exitapp
}
OutBuffers0_cbBuffer := NumGet(OutBuffers, 0, &quot;uint&quot;)
OutBuffers0_pvBuffer := NumGet(OutBuffers, 8, &quot;ptr&quot;)
if (OutBuffers0_cbBuffer != 0) and (OutBuffers0_pvBuffer != 0)
{
   cbData := DllCall(&quot;ws2_32\send&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, OutBuffers0_pvBuffer, &quot;int&quot;, OutBuffers0_cbBuffer, &quot;int&quot;, 0)
   if (cbData &lt;= 0)
   {
      msgbox ws2_32\send close notify error
      exitapp
   }
   DllCall(NumGet(g_pSSPI+16*A_PtrSize), &quot;ptr&quot;, OutBuffers0_pvBuffer)   ; FreeContextBuffer
}
scRet := DllCall(NumGet(g_pSSPI+9*A_PtrSize), &quot;ptr&quot;, &amp;hContext, &quot;uint&quot;)   ; DeleteSecurityContext
if (scRet != SEC_E_OK)
{
   msgbox DeleteSecurityContext error
   exitapp
}
cbData := DllCall(&quot;Ws2_32\closesocket&quot;, &quot;int&quot;, socket)
if (cbData != 0)
{
   msgbox closesocket error
   exitapp
}
DllCall(&quot;Ws2_32\WSACleanup&quot;)
msgbox done
ExitApp


HandshakeLoop:
VarSetCapacity(IoBuffer, IO_BUFFER_SIZE, 0)
cbIoBuffer := 0
scRet := SEC_I_CONTINUE_NEEDED
loop
{
   if (scRet = SEC_I_CONTINUE_NEEDED) or (scRet = SEC_E_INCOMPLETE_MESSAGE) or (scRet = SEC_I_INCOMPLETE_CREDENTIALS)
   {
      if (cbIoBuffer = 0) or (scRet = SEC_E_INCOMPLETE_MESSAGE)
      {
         if fDoRead
         {
            cbData := DllCall(&quot;ws2_32\recv&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, &amp;IoBuffer+cbIoBuffer, &quot;int&quot;, IO_BUFFER_SIZE-cbIoBuffer, &quot;int&quot;, 0)
            if (cbData = -1)
            {
                msgbox SOCKET_ERROR
                exitapp
            }
            else if (cbData = 0)
            {
                msgbox SEC_E_INTERNAL_ERROR
                exitapp
            }
            cbIoBuffer += cbData
         }
         else
            fDoRead := 1
      }
      VarSetCapacity(InBuffers, (8+A_PtrSize)*2, 0)
      NumPut(cbIoBuffer, InBuffers, 0, &quot;uint&quot;)   ; cbBuffer
      NumPut(SECBUFFER_TOKEN, InBuffers, 4, &quot;uint&quot;)   ; BufferType
      NumPut(&amp;IoBuffer, InBuffers, 8, &quot;ptr&quot;)   ; pbBuffer
      VarSetCapacity(InBuffer, 8+A_PtrSize, 0)
      NumPut(2, InBuffer, 4, &quot;uint&quot;)   ; cBuffers
      NumPut(&amp;InBuffers, InBuffer, 8, &quot;ptr&quot;)   ; pBuffers
      VarSetCapacity(OutBuffers, 8+A_PtrSize, 0)
      NumPut(SECBUFFER_TOKEN, OutBuffers, 4, &quot;uint&quot;)   ; BufferType
      VarSetCapacity(OutBuffer, 8+A_PtrSize, 0)
      NumPut(1, OutBuffer, 4, &quot;uint&quot;)   ; cBuffers
      NumPut(&amp;OutBuffers, OutBuffer, 8, &quot;ptr&quot;)   ; pBuffers
      scRet := DllCall(NumGet(g_pSSPI+6*A_PtrSize), &quot;ptr&quot;, &amp;hCreds, &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, 0, &quot;uint&quot;, dwSSPIFlags, &quot;uint&quot;, 0, &quot;uint&quot;, SECURITY_NATIVE_DREP := 16, &quot;ptr&quot;, &amp;InBuffer, &quot;uint&quot;, 0, &quot;ptr&quot;, 0, &quot;ptr&quot;, &amp;OutBuffer, &quot;uint*&quot;, dwSSPIOutFlags, &quot;int64*&quot;, tsExpiry, &quot;uint&quot;)   ; InitializeSecurityContext
      if (scRet = SEC_E_OK) or (scRet = SEC_I_CONTINUE_NEEDED) or ((scRet &gt;= 0x80000000) and (dwSSPIOutFlags &amp; ISC_RET_EXTENDED_ERROR))
      {
         OutBuffers0_cbBuffer := NumGet(OutBuffers, 0, &quot;uint&quot;)
         OutBuffers0_pvBuffer := NumGet(OutBuffers, 8, &quot;ptr&quot;)
         if (OutBuffers0_cbBuffer != 0) and (OutBuffers0_pvBuffer != 0)
         {
            cbData := DllCall(&quot;ws2_32\send&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, OutBuffers0_pvBuffer, &quot;int&quot;, OutBuffers0_cbBuffer, &quot;int&quot;, 0)
            if (cbData &lt;= 0)
            {
               msgbox ws2_32\send loop error
               exitapp
            }
            DllCall(NumGet(g_pSSPI+16*A_PtrSize), &quot;ptr&quot;, OutBuffers0_pvBuffer)   ; FreeContextBuffer
         }
      }
      if (scRet = SEC_E_INCOMPLETE_MESSAGE)
         Continue
      if (scRet = SEC_E_OK)
         break
      if (scRet &gt;= 0x80000000) and (scRet != SEC_I_CONTINUE_NEEDED)
      {
         msgbox InitializeSecurityContext loop error
         exitapp
      }
      if (scRet = SEC_I_INCOMPLETE_CREDENTIALS)
      {
         msgbox SEC_I_INCOMPLETE_CREDENTIALS error
         exitapp
      }
      InBuffers1_BufferType := NumGet(InBuffers, 8+A_PtrSize+4, &quot;uint&quot;)
      if (InBuffers1_BufferType = SECBUFFER_EXTRA)
      {
         InBuffers1_cbBuffer := NumGet(InBuffers, 8+A_PtrSize, &quot;uint&quot;)
         DllCall(&quot;RtlMoveMemory&quot;, &quot;ptr&quot;, &amp;IoBuffer, &quot;ptr&quot;, &amp;IoBuffer + cbIoBuffer - InBuffers1_cbBuffer, &quot;ptr&quot;, InBuffers1_cbBuffer)
         cbIoBuffer := InBuffers1_cbBuffer
      }
      else
         cbIoBuffer := 0
   }
}
return

EncryptSend:
pbMessage := &amp;pbIoBuffer+Sizes_cbHeader
cbMessage := StrLen(sendData)
StrPut(sendData, pbMessage, cbMessage, &quot;UTF-8&quot;)
VarSetCapacity(Buffers, (8+A_PtrSize)*4, 0)
NumPut(Sizes_cbHeader, Buffers, (8+A_PtrSize)*0, &quot;uint&quot;)   ; cbBuffer
NumPut(SECBUFFER_STREAM_HEADER, Buffers, (8+A_PtrSize)*0 + 4, &quot;uint&quot;)   ; BufferType
NumPut(&amp;pbIoBuffer, Buffers, (8+A_PtrSize)*0 + 8, &quot;ptr&quot;)   ; pbBuffer
NumPut(cbMessage, Buffers, (8+A_PtrSize)*1, &quot;uint&quot;)   ; cbBuffer
NumPut(SECBUFFER_DATA, Buffers, (8+A_PtrSize)*1 + 4, &quot;uint&quot;)   ; BufferType
NumPut(pbMessage, Buffers, (8+A_PtrSize)*1 + 8, &quot;ptr&quot;)   ; pbBuffer
NumPut(Sizes_cbTrailer, Buffers, (8+A_PtrSize)*2, &quot;uint&quot;)   ; cbBuffer
NumPut(SECBUFFER_STREAM_TRAILER, Buffers, (8+A_PtrSize)*2 + 4, &quot;uint&quot;)   ; BufferType
NumPut(pbMessage + cbMessage, Buffers, (8+A_PtrSize)*2 + 8, &quot;ptr&quot;)   ; pbBuffer
VarSetCapacity(Message, 8+A_PtrSize, 0)
NumPut(4, Message, 4, &quot;uint&quot;)   ; cBuffers
NumPut(&amp;Buffers, Message, 8, &quot;ptr&quot;)   ; pBuffers
scRet := DllCall(NumGet(g_pSSPI+25*A_PtrSize), &quot;ptr&quot;, &amp;hContext, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;Message, &quot;uint&quot;)   ; EncryptMessage
if (scRet != SEC_E_OK)
{
   msgbox EncryptMessage error
   exitapp
}
cbData := DllCall(&quot;ws2_32\send&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, &amp;pbIoBuffer, &quot;int&quot;, Sizes_cbHeader + cbMessage + Sizes_cbTrailer, &quot;int&quot;, 0)
if (cbData &lt;= 0)
{
   msgbox ws2_32\send EncryptMessage error
   exitapp
}

ReadDecrypt:
cbIoBuffer := scRet := 0
loop
{
   if (cbIoBuffer = 0) or (scRet = SEC_E_INCOMPLETE_MESSAGE)
   {
      cbData := DllCall(&quot;ws2_32\recv&quot;, &quot;int&quot;, socket, &quot;ptr&quot;, &amp;pbIoBuffer+cbIoBuffer, &quot;int&quot;, cbIoBufferLength-cbIoBuffer, &quot;int&quot;, 0)
      if (cbData = -1)
      {
          msgbox SOCKET_ERROR
          exitapp
      }
      else if (cbData = 0)
      {
         if cbIoBuffer
         {
            msgbox SEC_E_INTERNAL_ERROR
            exitapp
         }
         else
            break
      }
      else
         cbIoBuffer += cbData
   }
   VarSetCapacity(Buffers, (8+A_PtrSize)*4, 0)
   NumPut(cbIoBuffer, Buffers, 0, &quot;uint&quot;)   ; cbBuffer
   NumPut(SECBUFFER_DATA, Buffers, 4, &quot;uint&quot;)   ; BufferType
   NumPut(&amp;pbIoBuffer, Buffers, 8, &quot;ptr&quot;)   ; pbBuffer
   VarSetCapacity(Message, 8+A_PtrSize, 0)
   NumPut(4, Message, 4, &quot;uint&quot;)   ; cBuffers
   NumPut(&amp;Buffers, Message, 8, &quot;ptr&quot;)   ; pBuffers
   scRet := DllCall(NumGet(g_pSSPI+26*A_PtrSize), &quot;ptr&quot;, &amp;hContext, &quot;ptr&quot;, &amp;Message, &quot;uint&quot;, 0, &quot;uint*&quot;, 0, &quot;uint&quot;)   ; DecryptMessage
   if (scRet = SEC_I_CONTEXT_EXPIRED)
      break
   if (scRet != SEC_E_OK) and (scRet != SEC_I_RENEGOTIATE) and (scRet != SEC_I_CONTEXT_EXPIRED)
   {
      msgbox DecryptMessage error
      exitapp
   }
   pDataBuffer := pExtraBuffer := &quot;&quot;
   loop 4
   {
      Buffers_BufferType := NumGet(Buffers, (A_Index-1)*(8+A_PtrSize) + 4, &quot;uint&quot;)
      if (pDataBuffer = &quot;&quot;) and (Buffers_BufferType = SECBUFFER_DATA)
         pDataBuffer  := &amp;Buffers + (A_Index-1)*(8+A_PtrSize)
      if (pExtraBuffer = &quot;&quot;) and (Buffers_BufferType = SECBUFFER_EXTRA)
         pExtraBuffer  := &amp;Buffers + (A_Index-1)*(8+A_PtrSize)
   }
   if pDataBuffer
   {
      pDataBuffer_cbBuffer := NumGet(pDataBuffer+0, 0, &quot;uint&quot;)
      pDataBuffer_pvBuffer := NumGet(pDataBuffer+0, 8, &quot;ptr&quot;)
      DecryptedData := strget(pDataBuffer_pvBuffer, pDataBuffer_cbBuffer, &quot;utf-8&quot;)
      if (Substr(DecryptedData, -1) = &quot;`r`n&quot;)
      {
         ; msgbox % DecryptedData
         break
      }
   }
   if pExtraBuffer
   {
      pExtraBuffer_cbBuffer := NumGet(pExtraBuffer+0, 0, &quot;uint&quot;)
      pExtraBuffer_pvBuffer := NumGet(pExtraBuffer+0, 8, &quot;ptr&quot;)
      DllCall(&quot;RtlMoveMemory&quot;, &quot;ptr&quot;, &amp;pbIoBuffer, &quot;ptr&quot;, pExtraBuffer_pvBuffer, &quot;ptr&quot;, pExtraBuffer_cbBuffer)
      cbIoBuffer := pExtraBuffer_cbBuffer
   }
   else
      cbIoBuffer := 0
   if(scRet = SEC_I_RENEGOTIATE)
   {
      cbIoBufferPrev := cbIoBuffer
      fDoRead := 0
      GoSub HandshakeLoop
      InBuffers1_BufferType := NumGet(InBuffers, 8+A_PtrSize+4, &quot;uint&quot;)
      if (InBuffers1_BufferType = SECBUFFER_EXTRA)
      {
         InBuffers1_cbBuffer := NumGet(InBuffers, 8+A_PtrSize, &quot;uint&quot;)
         DllCall(&quot;RtlMoveMemory&quot;, &quot;ptr&quot;, &amp;pbIoBuffer, &quot;ptr&quot;, &amp;IoBuffer + cbIoBuffer - InBuffers1_cbBuffer, &quot;ptr&quot;, InBuffers1_cbBuffer)
         cbIoBuffer := InBuffers1_cbBuffer
      }
      else
         cbIoBuffer := cbIoBufferPrev
   }
}
return

base64(login, password)
{
   VarSetCapacity(bin, StrPut(login, &quot;UTF-8&quot;) + StrPut(password, &quot;UTF-8&quot;))
   size := StrPut(login, &amp;bin+1, &quot;UTF-8&quot;)
   size += StrPut(password, &amp;bin+1+size, &quot;UTF-8&quot;)
   DllCall(&quot;crypt32\CryptBinaryToString&quot;, &quot;ptr&quot;, &amp;bin, &quot;uint&quot;, size, &quot;uint&quot;, (CRYPT_STRING_BASE64 := 0x1)|(CRYPT_STRING_NOCRLF := 0x40000000), &quot;ptr&quot;, 0, &quot;uint*&quot;, chars)
   VarSetCapacity(outData, chars &lt;&lt; !!A_IsUnicode, 0)
   DllCall(&quot;crypt32\CryptBinaryToString&quot;, &quot;ptr&quot;, &amp;bin, &quot;uint&quot;, size, &quot;uint&quot;, (CRYPT_STRING_BASE64 := 0x1)|(CRYPT_STRING_NOCRLF := 0x40000000), &quot;str&quot;, outData, &quot;uint*&quot;, chars)
   return outData
}</code></pre></div><p>Пароль должен быть специальным паролем для приложений.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-07-23T20:39:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158873#p158873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Уведомление о событии через электронную почту]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=158870#p158870" />
			<content type="html"><![CDATA[<p>Некоторое время назад нашел на форуме функцию для отправления электронного письма. Использовал отправление письма самому себе как уведомление о событии (появление изображения в окне браузера) на смартфон, но в определенный момент скрипт перестал работать - письмо не приходило. </p><p>Подозреваю, что появилось ограничеие со стороны Google, но и не исключаю, что допустил ошибки при редактировании сценария.<br />При переходе на <a href="https://www.google.com/settings/security/lesssecureapps">lesssecureapps</a>, получаю сообщение о том, что &quot;Этот параметр недоступен для вашей учетной записи&quot;.</p><p>Какой функцией можно заменить текущую? Спасибо! </p><div class="codebox"><pre><code>#SingleInstance Force
#MaxHotkeysPerInterval 9999
#InstallKeybdHook
#InstallMouseHook
#WinActivateForce
#NoEnv
DetectHiddenWindows On
SetTitleMatchMode, 2
CoordMode, Mouse, Screen

SetTimer, Alert, 100

Alert:
ImageSearch, x, y, 0, 0, A_ScreenWidth, A_ScreenHeight, empty.png
If !ErrorLevel {
	SendMail(&quot;username@gmail.com&quot;, &quot;TOP&quot;, &quot;New draft&quot;)
	SoundPlay, empty.mp3
	MsgBox, 4096, TOP - Set and press ОК
}
return

SendMail(To, Subject, Body){
;https://www.google.com/settings/security/lesssecureapps
pmsg 			:= ComObjCreate(&quot;CDO.Message&quot;)
pmsg.From 		:= &quot;&quot;&quot;I Am&quot;&quot; &lt;username@gmail.com&gt;&quot;
pmsg.To 		:= To
pmsg.BCC 		:= &quot;&quot;   ; Blind Carbon Copy, Invisable for all, same syntax as CC
;pmsg.CC 		:= &quot;username@gmail.com, Other-username@gmail.com&quot;
;pmsg.CC 		:= &quot;Somebody@somewhere.com, Other-somebody@somewhere.com&quot;
pmsg.Subject 	:= Subject
;You can use either Text or HTML body like
pmsg.TextBody 	:= Body
;OR
;pmsg.HtmlBody := &quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;Hello&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h2&gt;Hello&lt;/h2&gt;&lt;p&gt;Testing!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;
;sAttach   := &quot;d:\file.txt | &quot; sendpng ; can add multiple attachments, the delimiter is |
fields := Object()
fields.smtpserver   := &quot;smtp.gmail.com&quot; ; specify your SMTP server
fields.smtpserverport     := 465 ; 25
fields.smtpusessl      := True ; False
fields.sendusing     := 2   ; cdoSendUsingPort
fields.smtpauthenticate     := 1   ; cdoBasic
fields.sendusername := &quot;username@gmail.com&quot;
fields.sendpassword := &quot;pass&quot;
fields.smtpconnectiontimeout := 60
schema := &quot;http://schemas.microsoft.com/cdo/configuration/&quot;
pfld :=   pmsg.Configuration.Fields
For field,value in fields
	pfld.Item(schema . field) := value
pfld.Update()
Loop, Parse, sAttach, |, %A_Space%%A_Tab%
  pmsg.AddAttachment(A_LoopField)
pmsg.Send()
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[becauseim]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33149</uri>
			</author>
			<updated>2023-07-23T15:25:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=158870#p158870</id>
		</entry>
</feed>
