Что нового

Отправка сообщения на mail используя данные из Excel

beliy

Продвинутый
Сообщения
372
Репутация
72
Версия AutoIt: Последняя

Описание: Есть файл допустим 1.xlsx нужно корректно вытащить оттуда переменные для отправки сообщения на mail. Основная проблема заключается в том чтобы правильно вытащить переменные из Excel.

Примечания:
вот несколько рабочих примеров на базе которых это можно реализовать:

Парсинг с Excel:

Примечание. В документе 2 листа и нужно парсить и обрабатывать оба. этот парсит в массив норм, но я с массивами не оч. - не получается правильно таскать в переменные.
Код:
#include <Excel.au3>
#include <Array.au3>

$s_FilePath = @ScriptDir & '\1.xlsx';файл Excel
$f_Visible = 0 ; 0 - в скрытом режиме, 1 - в открытом
$i_Sheet = 1 ; номер листа
$i_StartRow = 2 ;номер начальной строки
$i_StartColumn = 3 ;номер начальной колонки (3 - С)
$i_RowCnt = 0 ; 0 - строки считаем до последней заполненной ячейки, если не 0, то см. ниже
$i_ColCnt = 10 ;кол-во колонок, если 0, то см. выше
$o_Excel = _ExcelBookOpen($s_FilePath, $f_Visible)
If @error Then
    MsgBox(16, 'Error', @error)
    Exit
EndIf
_ExcelSheetActivate($o_Excel, $i_Sheet)
If @error Then
    _ExcelBookClose($o_Excel)
    MsgBox(16, 'Error', @error)
    Exit
EndIf
$a_ReturnArray = _ExcelReadSheetToArray($o_Excel, $i_StartRow, $i_StartColumn, $i_RowCnt, $i_ColCnt)
If @error Then
    _ExcelBookClose($o_Excel)
    MsgBox(16, 'Error', @error)
    Exit
EndIf
_ExcelBookClose($o_Excel)
_ArrayDisplay($a_ReturnArray)

For $i = 1 To $a_ReturnArray[0][0]
    For $j = 1 To $a_ReturnArray[0][1]
        MsgBox(64, $i & 'x' & $j, $a_ReturnArray[$i][$j])
        ;здесь делайте с этими данными то, что Вам надо
    Next
Next


А вот пример отправки на мыло, тут все работает, нареканий нет. $var1, $var2, $var3 должны браться из Excel

Код:
;##################################
; Include
;##################################
#Include<file.au3>
;##################################
; Variables
;##################################
$SmtpServer = "mail.domen.com"              ; address for the smtp-server to use - REQUIRED
$FromName = "Name"                      ; 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 = "Test"                              ; the messagebody from the mail - can be left blank but then you get a blank mail
$AttachFiles = ""                       ; the file(s) you want to attach seperated with a ; (Semicolon) - 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"
$Username = "[email protected]"                    ; username for the account used from where the mail gets sent - REQUIRED
$Password = "pass-pass"                  ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 25                            ; port used for sending the mail
$ssl = 0                                ; enables/disables secure socket layer sending - put to 1 if using httpS
;~ $IPPort=465                          ; GMAIL port used for sending the mail
;~ $ssl=1                               ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
$var1 = "Волк"
$var2 = 'Заяц'
$var3 = '100кг'
$Body = 'Уважаемый, ' & $var1 & '! ' & $var2 & ' совсем распоясался и творит беспредел в лесу, особенно после того как скурил  ' & $var3 & ' ворованной анаши. Просьба принять меры...'
;##################################
; Script
;##################################
Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
$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
;
; The UDF
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
EndFunc   ;==>_INetSmtpMailCom
;
;
; Com Error Handler
Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy,
1. Какие данные надо вытащить из Excel?
2. В каком виде они должны быть отправлены?
3. Может проще сам файл Excel прикрепить к письму? (или заархивировать и прикрепить)
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
1-2. во вложении сделал пример документа, из него надо построчно брать переменные. Например,
для моего примера:

должно отправиться 3 сообщения на 3 разных почтовых адресса, на моем примере это должно выглядить так:


[box title=на [email protected]]Уважаемый, Иванов иван иванович! Иванов иван иванович1 совсем распоясался и творит беспредел в лесу, особенно после того как скурил 1111 ворованной анаши. Просьба принять меры...[/box]

[box title=на [email protected]]Уважаемый, Петров Петр Петрович! Петров Петр Петрович1 совсем распоясался и творит беспредел в лесу, особенно после того как скурил 2222 ворованной анаши. Просьба принять меры...[/box]

[box title=на [email protected]]Уважаемый, Пупкин василий Васильевич! Пупкин василий Васильевич1 совсем распоясался и творит беспредел в лесу, особенно после того как скурил 3333 ворованной анаши. Просьба принять меры...[/box]

3. К сожаления нельзя - данных много и каждому адресату сложнее будет найти адресованную ему информацию.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy,
Попробуйте так. Я поменял названия в таблице. Проверял на Excel 2003.
Код:
#include <Excel.au3>
#include <Array.au3>

$s_FilePath = @ScriptDir & '\1.xlsx'
If Not FileExists($s_FilePath) Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
Dim $aResult[5][2] = [[4],['ФИО1'],['Число'],['ФИО2'],['адрес получателя']]
$s_Sheet = 'Base'

$iNum = 2 ;номер адресата в таблице (1 - первый после заголовка)
For $i = 1 To 1
	$o_Excel = _ExcelBookOpen($s_FilePath, 0)
	If @error Then ExitLoop
	_ExcelSheetActivate($o_Excel, $s_Sheet)
	If @error Then ExitLoop
	$a_Array = _ExcelReadSheetToArray($o_Excel)
	If @error Then ExitLoop
	_ExcelBookClose($o_Excel)
Next
If @error Then
	_ExcelBookClose($o_Excel)
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf

For $i = 1 To $a_Array[0][0]
	For $j = 1 To $a_Array[0][1]
		For $q = 1 To $aResult[0][0]
			If StringInStr($a_Array[$i][$j], $aResult[$q][0]) Then
				If $i + $iNum <= $a_Array[0][0] Then
					$aResult[$q][1] = $a_Array[$i + $iNum][$j]
				EndIf
			EndIf
		Next
	Next
Next
_ArrayDisplay($aResult)
;или
$sName_1 = $aResult[1][1]
$sNum = $aResult[2][1]
$sName_2 = $aResult[3][1]
$sEmail = $aResult[4][1]
MsgBox(64, 'Info', '$sName_1: ' & $sName_1 & @LF & '$sNum: ' & $sNum & @LF & _
		'$sName_2: ' & $sName_2 & @LF & '$sEmail: ' & $sEmail)
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Спасибо, но по поводу переменных что то не получается - Array выводит норм, но вот проверочное сообщение всегда выводит только Петрова, хотя по идее должно по очереди для всех. Как мне по очереди выводить переменные по каждой строке? Если можно на примере отправки сообщений... Также как писал в 1 посте в документе 2 листа и их надо поочередно обработать...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy [?]
проверочное сообщение всегда выводит только Петрова
Код:
;...
$iNum = 2 ;номер адресата в таблице (1 - первый после заголовка)
;..
У Вас неудачная таблица. Если будут заданы ее точный адрес, то будет проще.
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
В смысле, точный адрес? т.э по номеру ячейки как в 1 примере? можно и так попробовать - мне главное что б можно было поочередно отправить сообщения по каждой строке. но так как во 2 примере удобнее т.к не все нужные таблици рядом... 2 способом вроде норм считывается в массив, но как поочередно обработать я так и не понял((
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy
Попробуйте так с той же таблицей:
Код:
#include <Excel.au3>
#include <Array.au3>

$s_FilePath = @ScriptDir & '\1.xls'
If Not FileExists($s_FilePath) Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
Dim $aResult[1001][5] = [[1000, 4],['', 'ФИО1', 'Число', 'ФИО2', 'адрес получателя']]
$iCount = 1
$s_Sheet = 'Base'

For $i = 1 To 1
	$o_Excel = _ExcelBookOpen($s_FilePath, 0)
	If @error Then ExitLoop
	_ExcelSheetActivate($o_Excel, $s_Sheet)
	If @error Then ExitLoop
	$a_Array = _ExcelReadSheetToArray($o_Excel)
	If @error Then ExitLoop
	_ExcelBookClose($o_Excel)
Next
If @error Then
	_ExcelBookClose($o_Excel)
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf

For $i = 1 To $a_Array[0][0]
	For $j = 1 To $a_Array[0][1]
		For $q = 1 To $aResult[0][1]
			If StringInStr($a_Array[$i][$j], $aResult[1][$q]) Then
				$iCount = 1
				For $w = $i + 1 To $a_Array[0][0]
					$iCount += 1
					$aResult[$iCount][$q] = $a_Array[$w][$j]
				Next
			EndIf
		Next
	Next
Next
ReDim $aResult[$iCount + 1][5]
$aResult[0][0] = $iCount
_ArrayDisplay($aResult)

For $i = 2 To $aResult[0][0]
	$sMessage = ''
	For $j = 1 To $aResult[0][1]
		$sMessage &= $aResult[1][$j] & ':  ' & $aResult[$i][1] & @LF
	Next
	MsgBox(0, '', StringTrimRight($sMessage, 1))
	;	_INetSmtpMailCom();отправляйте почту вместо MsgBox
Next
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
спс, но сложность в том что не получается правильно сформировать переменную $Body, т.э что писать вместо $var, $var2, $var3 в $Body = 'Уважаемый, ' & $var1 & '! ' & $var2 & ' совсем распоясался и творит беспредел в лесу, особенно после того как скурил ' & $var3 & ' ворованной анаши. Просьба принять меры...'
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy,
В начале добавьте
Код:
;...
$sFirst = 'Уважаемый(ая), '
$sSecond = '! '
$sThird = ' совсем распоясался и творит беспредел в лесу, особенно после того как скурил '
$sFourth = ' ворованной анаши. Просьба принять меры...'

$sBody = ''
$sAdress = ''
;...

И поменяйте в конце на
Код:
;...
For $i = 2 To $aResult[0][0]
	$sBody = ''
	$sAdress = ''
	$sBody &= $sFirst & $aResult[$i][1] & $sSecond & $aResult[$i][3] & $sThird & $aResult[$i][2] & $sFourth
	$sAdress = $aResult[$i][4]
	MsgBox(0, $sAdress, $sBody)
	;	_INetSmtpMailCom();отправляйте почту вместо MsgBox
Next
;...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Код:
$sBody &=

Здесь нет опечатки?
И 2 вопрос, как обработать в цикле каждую вкладку так что бы количество вкладок задавалось переменной либо переменная $s_Sheet имела несколько значений - несколько раз повторять код для каждой вкладки немножко не рационально...
Заранее большое спасибо за ответ...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy [?]
Здесь нет опечатки?
Нет.
так что бы количество вкладок задавалось переменной
Код:
#include <Excel.au3>
#include <Array.au3>

$s_FilePath = @ScriptDir & '\1.xls'
$iMaxList = 2;сколько листов обрабатывать,
For $w = 1 To 1
	$o_Excel = _ExcelBookOpen($s_FilePath, 1)
	If @error Then ExitLoop
	$a_Sheet = _ExcelSheetList($o_Excel)
	If @error Then ExitLoop
	_ArrayDisplay($a_Sheet)
	If $iMaxList > $a_Sheet[0] Then $iMaxList = $a_Sheet[0]
	For $i = 1 To $iMaxList
		_ExcelSheetActivate($o_Excel, $i) ;активируем по номеру листа
		If @error Then ExitLoop
		;здесь все действия с каждым листом.
		Sleep(1000)
	Next
Next
If @error Then
	_ExcelBookClose($o_Excel)
	MsgBox(16, 'Error', 'Error')
Else
	_ExcelBookClose($o_Excel)
	MsgBox(64, 'Info', 'OK')
EndIf
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
что то получается обработать только 1 лист :(
Вот код который получился на данный момент, помогите плз. Также если поможете с оптимизацией буду весьма благодарен...
Собственно сам код:
Код:
#include <Excel.au3>
#include <Array.au3>

$SmtpServer = "mail.domen.com"              ; address for the smtp-server to use - REQUIRED
$FromName = "IT"                      ; name from who the email was sent
$FromAddress = "[email protected]" ; address from where the mail should come
$Subject = ""                   ; subject from the email - can be anything you want it to be
$AttachFiles = ""                       ; the file(s) you want to attach seperated with a ; (Semicolon) - 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"
$Username = "[email protected]"                    ; username for the account used from where the mail gets sent - REQUIRED
$Password = "******"                  ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 25                            ; port used for sending the mail
$ssl = 0                                ; enables/disables secure socket layer sending - put to 1 if using httpS
;~ $IPPort=465                          ; GMAIL port used for sending the mail
;~ $ssl=1                               ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
$s_FilePath = @ScriptDir & '\1.xlsx'
If Not FileExists($s_FilePath) Then
    MsgBox(16, 'Error', 'Документ ' & $s_FilePath & ' не найден! Проверьте наличие такового в папке с программой...' )
    Exit
EndIf
Dim $aResult[1001][5] = [[1000, 4],['', 'Имя', 'Фамилия', 'перерасход', 'SMS']]
$iCount = 1
$sFirst = ''
$sSecond = ' '
$sThird = ' у Вас перелимит в размере '
$sFourth = 'грн. '
$sBody = ''
$sAdress = ''
$iMaxList = 2;сколько листов обрабатывать,

For $w = 1 To 1
    $o_Excel = _ExcelBookOpen($s_FilePath, 0)
    If @error Then ExitLoop
    $a_Sheet = _ExcelSheetList($o_Excel)
    If @error Then ExitLoop
    _ArrayDisplay($a_Sheet)
    If $iMaxList > $a_Sheet[0] Then $iMaxList = $a_Sheet[0]
    For $i = 1 To $iMaxList
        _ExcelSheetActivate($o_Excel, $i) ;активируем по номеру листа
        If @error Then ExitLoop
    ;здесь все действия с каждым листом.
    $a_Array = _ExcelReadSheetToArray($o_Excel)
    If @error Then ExitLoop
    For $i = 1 To $a_Array[0][0]
        For $j = 1 To $a_Array[0][1]
            For $q = 1 To $aResult[0][1]
                If StringInStr($a_Array[$i][$j], $aResult[1][$q]) Then
                    $iCount = 1
                    For $w = $i + 1 To $a_Array[0][0]
                        $iCount += 1
                        $aResult[$iCount][$q] = $a_Array[$w][$j]
                    Next
                EndIf
            Next
        Next
    Next
    ReDim $aResult[$iCount + 1][5]
    $aResult[0][0] = $iCount
    _ArrayDisplay($aResult)

    For $i = 2 To $aResult[0][0]
        $sBody = ''
        $sAdress = ''
        $sMessage = ''
        For $j = 1 To $aResult[0][1]
            $sMessage &= $aResult[1][$j] & ':  ' & $aResult[$i][1] & @LF
        Next
        $sBody = $sFirst & $aResult[$i][1] & $sSecond & $aResult[$i][2] & $sThird & $aResult[$i][3] & $sFourth
        $ToAddress = $aResult[$i][4]
        MsgBox(0, '', StringTrimRight($sMessage, 1))
     Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $sBody, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then
        MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
    EndIf
    Next
        Sleep(1000)
    Next
    ;_ExcelSheetActivate($o_Excel, $s_Sheet_1)
    ;If @error Then ExitLoop
    ;$a_Array = _ExcelReadSheetToArray($o_Excel)
    ;If @error Then ExitLoop
    ;_ExcelBookClose($o_Excel)
Next
If @error Then
    _ExcelBookClose($o_Excel)
    MsgBox(16, 'Error2', 'Error')
    Exit
Else
    _ExcelBookClose($o_Excel)
    MsgBox(64, 'Info', 'Сообщения отправлены!!!')
EndIf



; The UDF
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
EndFunc   ;==>_INetSmtpMailCom
;
;
; Com Error Handler
Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Код:
$str = "http://schemas.microsoft.com/cdo/configuration/"
$hMAIL = ObjCreate ("CDO.Message")
    With $hMAIL
        .From = "[email protected]"
        .To = "[email protected]"
        .Subject = "Test"
        .TextBody = "Test"
        .AddAttachment ("C:\boot.ini") ;файл для отправки
    EndWith
    With $hMAIL.Configuration.Fields
        .Item ($str & "sendusing") = 2
        .Item ($str & "smtpserver") = "smtp.mail.ru" ;SMTP Server
        .Item ($str & "smtpauthenticate") = 1
        .Item ($str & "sendusername") = "[email protected]"
        .Item ($str & "sendpassword") = "pss" ;Пароль SMTP-сервер
        .Item ($str & "smtpserverport") = 2525 ;Порт
        .Update
    EndWith
$hMAIL.Send
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
2 armenxxx1 спасибо, но скрипт отправки почты у меня работает без нареканий, заминка в цикле то получилась...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
помогите домучать скрипт плз
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy,
Сегодня сделаю, занят был.

Попробуйте так:
Код:
#include <Excel.au3>

Opt('TrayMenuMode', 1)
Opt('MustDeclareVars', 1)

Global $sFilePath = @ScriptDir & '\1.xls';файл Excel с данными.
Global $iMaxList = 2;сколько листов обрабатывать, начиная с первого
Global $oExcel, $aSheet, $sFirst = 'Уважаемый ', $sSecond = ' ', $sThird = ' у Вас перелимит в размере ', _
		$sFourth = ' грн. ', $sBody, $sAdress, $iErrorSheet = 0, $iErrorArray = 0, $iCountSMS, $iErrorSMS = 0
Dim $aResult[1001][5] = [[1000, 4],['', 'Имя', 'Фамилия', 'перерасход', 'SMS']]

If Not FileExists($sFilePath) Then
	MsgBox(16, 'Error', 'Отсутствует файл базы.')
	Exit
EndIf

For $i = 1 To 1
	$oExcel = _ExcelBookOpen($sFilePath, 0)
	If @error Then ExitLoop
	$aSheet = _ExcelSheetList($oExcel)
	If @error Then ExitLoop
	If $iMaxList < 1 Or $iMaxList > $aSheet[0] Then $iMaxList = $aSheet[0]
	$aSheet[0] = $iMaxList
Next
If @error Then
	_ExcelBookClose($oExcel)
	MsgBox(16, 'Error', 'Ошибка получения данных')
	Exit
EndIf
For $j = 1 To $aSheet[0]
	_ExcelSheetActivate($oExcel, $j)
	If @error Then
		$iErrorSheet += 1
		ContinueLoop
	EndIf
	_Get_Array_Sheet($oExcel, $aResult)
	If @error Then
		$iErrorArray += 1
	Else
		For $i = 2 To $aResult[0][0]
			$sBody = ''
			$sAdress = ''
			$sBody &= $sFirst & $aResult[$i][1] & $sSecond & $aResult[$i][2] & $sThird & $aResult[$i][3] & $sFourth
			$sAdress = $aResult[$i][4]
			MsgBox(0, $sAdress, $sBody)
			;_INetSmtpMailCom();отправляйте почту вместо MsgBox
			If @error Then
				$iErrorSMS += 1
			Else
				$iCountSMS += 1
			EndIf
		Next
	EndIf
Next
_ExcelBookClose($oExcel)
If (Not $iErrorSheet And Not $iErrorArray And Not $iErrorSMS) Then
	MsgBox(64, 'Info', 'Успешно отправлено SMS: ' & $iCountSMS)
Else
	MsgBox(16, 'Error', 'Ошибок открытия листа: ' & $iErrorSheet & @LF & _
			'Ошибок получения данных: ' & $iErrorArray & @LF & _
			'Ошибок отправки SMS: ' & $iErrorSMS & @LF & _
			'Успешно отправлено SMS: ' & $iCountSMS)
EndIf

Func _Get_Array_Sheet($o_Excel, ByRef $a_Array)
	Local $iCount = 1, $a_ArrayTemp

	$a_ArrayTemp = _ExcelReadSheetToArray($o_Excel)
	If @error Then Return SetError(1)
	For $i = 1 To $a_ArrayTemp[0][0]
		For $j = 1 To $a_ArrayTemp[0][1]
			For $q = 1 To $aResult[0][1]
				If StringInStr($a_ArrayTemp[$i][$j], $a_Array[1][$q]) Then
					$iCount = 1
					For $w = $i + 1 To $a_ArrayTemp[0][0]
						$iCount += 1
						If $iCount = $a_Array[0][0] Then
							$a_Array[0][0] += 1000
							ReDim $a_Array[$a_Array[0][0] + 1][5]
						EndIf
						$a_Array[$iCount][$q] = $a_ArrayTemp[$w][$j]
					Next
				EndIf
			Next
		Next
	Next
	If $iCount = 1 Then Return SetError(1)
	ReDim $a_Array[$iCount + 1][5]
	$a_Array[0][0] = $iCount
	Return SetError(0)
EndFunc   ;==>_Get_Array_Sheet
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
спс, все работает. Тема закрыта :IL_AutoIt_1:
 
Верх