Что нового

Выловить в командной строке [ErrorCode: 0x00000000] и отправить эл.почту

srg777

Новичок
Сообщения
21
Репутация
1
Версия AutoIt: 3.

Описание:
Запуская файл podpis.bat, открывается командная строка и происходит подписание файла zapros.xml с помощью файла csptest.
При этом после попытки подписи файла будет сообщение о наличии/отсутствии ошибок в виде [ErrorCode: 0x00000000]
Я приложил архив с указанными файлами. Если Вы будете пробовать запускать эти файлы, то у Вас код ошибки, естественно, будет с единицей на конце, что говорит об ошибке подписи.

Возможно ли в скрипте AutoIt этот код выловить и если он отличен от нулей, то открыть сайт mail.ru, зайти в почту и отправить на другую почту сообщение о том, что файл был подписан с ошибками (например, закончился срок действия сертификата). А если код только с нулями, значит все нормально и никаких сообщений отправлять не нужно.

Не знаю, насколько это возможно. Но вдруг.

В любом случае спасибо всем за любой ответ и попытку.
 

Вложения

  • Archive.7z
    179.1 КБ · Просмотры: 13

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
srg777,
Можно читать консоль или просто получить код выхода. В примере сделано и то и другое.
Код:
#include <APIConstants.au3>
#include <Constants.au3>
#include <WinAPIEx.au3>

Global $sExe = @ScriptDir & '\csptest.exe', $sXml = @ScriptDir & '\zapros.xml', $sSign = @ScriptDir & '\zapros.xml.sign', _
		$sEmail = '[email protected]', $iPID, $hProcess, $sRead

If FileExists($sSign) Then FileDelete($sSign)

$iPID = Run('"' & $sExe & '"' & ' -sfsign -sign -detached -add -in ' & '"' & $sXml & '"' & ' -out ' & '"' & $sSign & '"' & _
		' -my ' & $sEmail, '', @SW_HIDE, $STDOUT_CHILD)
If _WinAPI_GetVersion() >= 6.0 Then
	$hProcess = _WinAPI_OpenProcess($PROCESS_QUERY_LIMITED_INFORMATION, 0, $iPID)
Else
	$hProcess = _WinAPI_OpenProcess($PROCESS_QUERY_INFORMATION, 0, $iPID)
EndIf
If Not $hProcess Then Exit ConsoleWrite('Error open process!' & @LF)
While 1
	$sRead &= StdoutRead($iPID)
	If @error Then ExitLoop
	Sleep(50)
WEnd

ConsoleWrite($sRead & @LF)
ConsoleWrite('Exit code: ' & _WinAPI_GetExitCodeProcess($hProcess) & @CR)

_WinAPI_CloseHandle($hProcess)
Или так, только код выхода.
Код:
Global $sExe = @ScriptDir & '\csptest.exe', $sXml = @ScriptDir & '\zapros.xml', $sSign = @ScriptDir & '\zapros.xml.sign', _
		$sEmail = '[email protected]', $iExitCode, $hProcess, $sRead

If FileExists($sSign) Then FileDelete($sSign)

$iExitCode = RunWait('"' & $sExe & '"' & ' -sfsign -sign -detached -add -in ' & '"' & $sXml & '"' & ' -out ' & '"' & $sSign & '"' & _
		' -my ' & $sEmail, '', @SW_HIDE)

ConsoleWrite('Exit code: ' & $iExitCode & @LF)
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
А на почту как сообщение отправить, например, если нужно отправить с почты [email protected] (пароль у нее 1abc2) на почту [email protected] сообщение об ошибке?
Или это есть в коде?

Я читаю Ваш код, и для меня как дебри.
Конечно, классная вещь Autoit, но по ходу, тут придется изучить ее язык, чтобы делать такие же классные скрипты.
Я так понимаю, без программирования нормальных скриптов составить невозможно.

Я на Вашем форуме порылся, нашел вот такой скрипт для отправки почты.
Если он подойдет, то куда его нужно вставить, чтобы отправлялось сообщение в случае ошибки [ErrorCode: 0x00000001]
Код:
$SmtpServer = "smtp.mail.ru"    ; адрес SMTP сервера
$Port = "2525"                  ; Порт SMTP сервера
$FromAddress = "[email protected]"   ; адрес отправителя
$ToAddress = "[email protected]"     ; адрес назначения
$Subject = """тема письма"""    ; тема письма
$Body = """Tekst v imeila"""    ; тело письма (сам текст письма)
$AttachFiles = "C:\boot.ini"    ; прикреплённые файлы к письму
$Username = "[email protected]"      ; имя пользователя аккаунта, с которого отправляется
$Password = "pss"               ; Пароль

$BlatArgs = "-t "&$ToAddress&" -f "&$FromAddress&" -s "&$Subject&" -body "&$Body&" -server "&$SmtpServer&" -u "&$Username&" -pw "&$Password&" -attach "&$AttachFiles&" -portSMTP "&$Port

_SendMail($BlatArgs)

Func _SendMail($CMDstring)
    $BlatDLL = DllOpen ("blat.dll")
    $result=DllCall($BlatDLL,"int","Send","str",$CMDstring)
    DllClose ($BlatDLL)
EndFunc


В любом случае спасибо.
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
madmasles сказал(а):
srg777 [?]
А на почту как сообщение отправить
А что делает строка " -my [email protected]"?

Я, конечно, смотрел на Ваш код как баран на новые ворота. Но обратил внимание на эту строку. Но так как не увидел нигде пароля для почты, то подумал, что без пароля вряд ли это отправка сообщения. Получается, что сообщение отправляется на почту [email protected]?
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
madmasles сказал(а):
srg777 [?]
А на почту как сообщение отправить
А что делает строка " -my [email protected]"?

Как я понимаю, то в этой строке просто указан почта, на которую зарегистрирован сертификат электронной подписи.


Добавлено:
Сообщение автоматически объединено:

Поэтому пока вот пытаюсь понять, куда можно вставить скрипт об отправке сообщения по электронке в случае, если код ошибки [ErrorCode: 0x00000001] с единицей
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Скачать sendmail.au3.
Вот пример как можно отправить почту:
Код:
#include "sendmail.au3"
Local $SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl
$SmtpServer = "smtp.mail.ru"  ; address for the smtp-server to use - REQUIRED
$FromName = "srg777" ; name from who the email was sent
$FromAddress = "[email protected]"  ; address from where the mail should come
$ToAddress = "[email protected]" ; destination address of the email - REQUIRED
$Subject = "Ошибка подписи" ; subject from the email - can be anything you want it to be
$Body = "Произошла ошибка при подписи файла..."  ; the messagebody from the mail - can be left blank but then you get a blank mail
#cs
не обязательно / можно не указывать
$AttachFiles = "C:\path\files\test.txt"  ; the file you want to attach- leave blank if not needed
$CcAddress = "" ; address for cc - leave blank if not needed
$BccAddress = ""  ; address for bcc - leave blank if not needed
$Importance = "Normal" ; Send message priority: "High", "Normal", "Low"
#ce
$Username = "[email protected]" ; username for the account used from where the mail gets sent - REQUIRED
$Password = "1abc2" ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 465  ; port used for sending the mail
$ssl = 1  ; enables/disables secure socket layer sending - put to 1 if using httpS

$rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
If @error Then
; если произошла ошибка при отправки письма
; MsgBox(0, "Error sending message", "Error code:" & @error & " Description:" & $rc)
EndIf

P.S. Код рабочий (у меня работает).
 

Вложения

  • sendmail.au3
    5 КБ · Просмотры: 10

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
alex33,
Удивили. :smile:
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
А куда этот код вставить? Как объединить эти коды?
То есть как при наличиии ошибки при подписании файла получить электронное письмо?


Добавлено:
Сообщение автоматически объединено:

То есть должно быть так:
Если код [ErrorCode: 0x00000001], то отправить эл.почту,
а если код [ErrorCode: 0x00000000], то выполнить код дальше
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот так можно:
Код:
#include "sendmail.au3"
; area_1
Global $rc = ""
Local $SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl
$SmtpServer = "smtp.mail.ru"  ; address for the smtp-server to use - REQUIRED
$FromName = "srg777" ; name from who the email was sent
$FromAddress = "[email protected]"  ; address from where the mail should come
$ToAddress = "[email protected]" ; destination address of the email - REQUIRED
$Subject = "Ошибка подписи" ; subject from the email - can be anything you want it to be
$Body = "Произошла ошибка при подписи файла..."  ; the messagebody from the mail - can be left blank but then you get a blank mail
#cs
не обязательно / можно не указывать
$AttachFiles = "C:\path\files\test.txt"  ; the file you want to attach- leave blank if not needed
$CcAddress = "" ; address for cc - leave blank if not needed
$BccAddress = ""  ; address for bcc - leave blank if not needed
$Importance = "Normal" ; Send message priority: "High", "Normal", "Low"
#ce
$Username = "[email protected]" ; username for the account used from where the mail gets sent - REQUIRED
$Password = "1abc2" ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 465  ; port used for sending the mail
$ssl = 1  ; enables/disables secure socket layer sending - put to 1 if using httpS
; and area_1

; area_2
Global $sExe = @ScriptDir & '\csptest.exe', $sXml = @ScriptDir & '\zapros.xml', $sSign = @ScriptDir & '\zapros.xml.sign', _
        $sEmail = '[email protected]', $iExitCode, $hProcess, $sRead

If FileExists($sSign) Then FileDelete($sSign)

$iExitCode = RunWait('"' & $sExe & '"' & ' -sfsign -sign -detached -add -in ' & '"' & $sXml & '"' & ' -out ' & '"' & $sSign & '"' & _
        ' -my ' & $sEmail, '', @SW_HIDE)

ConsoleWrite('Exit code: ' & $iExitCode & @LF)

;~ If StringRegExp($iExitCode, "([1-9])") Then
If $iExitCode <> 0 Then
; если произошла ошибка при подписи
$rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
If @error Then
; если произошла ошибка при отправки письма
ConsoleWrite("Error sending message" & @TAB & "Error code: " & @error & " Description: " & $rc)
EndIf
EndIf
; and area_2
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
Всем огромное спасибо! Очень сильно помогли.
Жаль, что я не могу улучшить Вам репутацию. Нет у меня почему-то кнопки для этого. Я бы всем поставил +10!

Как лучший ответ отметил ответ от Alex33, но, естественно, хочу отметить и ответ от madmasles, связанный с чтением кода ошибки.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
srg777 [?]
Нет у меня почему-то кнопки для этого.
Попробуй через другой браузер посмотри...
Может ты её просто не замечаешь? Она очень маленькая...
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
OffTopic:
srg777 [?]
Нет у меня почему-то кнопки для этого. Я бы всем поставил +10!
Мда... Я тоже не вижу здесь кнопки для совершения акта благодарности. ;) Вроде она так выглядела? :scratch:
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1


Добавлено:
Сообщение автоматически объединено:

alex33 сказал(а):
srg777 [?]
Нет у меня почему-то кнопки для этого.
Попробуй через другой браузер посмотри...
Может ты её просто не замечаешь? Она очень маленькая...

Вот как у меня выглядит во всех браузерах
 

Вложения

  • 2014-06-27_213500.jpg
    2014-06-27_213500.jpg
    71.1 КБ · Просмотры: 16

alex33

Скриптер
Сообщения
1,457
Репутация
186
Да, действительно, я посмотрел - нету... А попробуй поставить другую тему оформления форума, может поможет... :smile: :D
 
Верх