Что нового

[Ошибки] Не работает функция отправки письма через smtp.yandex.ru

Юрий

Новичок
Сообщения
82
Репутация
3
День добрый. Вотс функция найденная на этом же форуме, но выдаёт ошибку:
"The requested action with this object has failed.:
With $hMAIL.Configuration.Fields"


Код:
Send_Email()
Func Send_Email()
#cs
 data - массив стандарной для autoit структуры. Элемент 0 - длина массива, начиная с первого - элементы массива
 Порядок элементов:
 1 From
 2 To
 3 Subject
 4 Smtp
 5 Username
 6 Password
 7 Port
 8 ТекстСообщения
#ce

$str = "http://schemas.microsoft.com/cdo/configuration/"
 $hMAIL = ObjCreate ("CDO.Message")
 If Not IsObj($hMAIL) Then 
        MsgBox(8208, "имя программы", "Не найден объект CDO. Отправка почты невозможна", 10)
 Else
    With $hMAIL
       .Bodypart.Charset = "windows-1251"                   ; Кодировка
       .From                  = "[email protected]"
       .To                     = "[email protected]"
       .Subject               = "Всё ок!"
       .TextBody            = "Лови подачу" & @CRLF
       .AddAttachment (@ScriptDir & "info.txt")                    ;файл для отправки
    EndWith

    With $hMAIL.Configuration.Fields
       .Item ($str & "languagecode") = 1049
       .Item ($str & "sendusing") = 2
       .Item ($str & "smtpserver") = "smtp.yandex.ru"                  ; SMTP Server
       .Item ($str & "smtpauthenticate") = 1
       .Item ($str & "sendusername") = "[email protected]"             ; username
       .Item ($str & "sendpassword") = "pass"        ; Пароль SMTP-сервера
       .Item ($str & "smtpserverport") = 25            ; Порт
       .Item ($str & "smtpconnectiontimeout") = 30
       .Update
    EndWith
$hMAIL.Send
EndIf
EndFunc

;~ Все хорошо, письма уходят, проблемы возникают при ошибках отправки (недоступен почтовый сервер и так далее). Необходимо эти ошибки перехватить и обработать. Ставим обработчик:


Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Global $oMyRet[2]

Func MyErrFunc()
 $HexNumber = Hex($oMyError.number, 8)
 $oMyRet[0]   = $HexNumber
 $oMyRet[1]   = StringStripWS($oMyError.description, 3)
 MsgBox(4096,"имя программы","Error Number: " & $HexNumber & " ScriptLine: " & $oMyError.scriptline & " Description:" & $oMyRet[1] & @LF,15)
 SetError(1)                                                ; something to check for when this function returns
 Return
EndFunc


Изначальный вид функции: http://autoit-script.ru/index.php/topic,11422.msg75014/topicseen.html#msg75014
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
"The requested action with this object has failed.:
У меня бывает эта ошибка только если я не включу обработчик событий
Код:
ObjEvent("AutoIt.Error", "MyErrFunc")

а когда он включен функция MyErrFunc успешно все ошибки перехватывает.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Я пользуюсь вот такой функцией:
Код:
Local $SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl
;
;##################################
; Include
;##################################
#Include <file.au3>
;##################################
; Variables
;##################################
$SmtpServer = "smtp.yandex.ru"  ; address for the smtp-server to use - REQUIRED
$FromName = "alex33" ; name from who the email was sent
$FromAddress = "a****-s***[email protected]"  ; address from where the mail should come
$ToAddress = "alex********@gmail.com" ; destination address of the email - REQUIRED
$Subject = "Проверка" ; subject from the email - can be anything you want it to be
$Body = "<h1>Успешно</h1><p>Отправка html письма из AutoIt скрипта
Всё работает и всё получается.
отправка файлов.
Я во вложении отправил файл.</p>"
      ; the messagebody from the mail - can be left blank but then you get a blank mail
$AttachFiles = "C:\Windows\Media\town.mid"
#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 = "a****-s***s" ; username for the account used from where the mail gets sent - REQUIRED
$Password = "12345678" ; 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

;##################################
; 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(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
 If FileExists($S_Files2Attach[$x]) Then
 $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
Пользуюсь очень давно и никаких ошибок у меня не было.
Функцию я нашол здесь и она мне очень нравится.
 
Автор
Юрий

Юрий

Новичок
Сообщения
82
Репутация
3
нет, ну я не знаю. версии AutoIT последняя, попробовал уже три функции, может это из-за 64-битной семёрки?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
о, у меня xp 32 и раньше была семёрка 32
 
Автор
Юрий

Юрий

Новичок
Сообщения
82
Репутация
3
Код:
### COM Error ! Number: 80020009 ScriptLine: 95 Description:Недопустимое значение конфигурации "SendUsing".



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

о, у меня xp 32 и раньше была семёрка 32

а я перешёл на 64 только для того что бы скрипты и для 64 и для 86 битов компилировать) но всё таки не понятная проблема(
 

Defant

Новичок
Сообщения
2
Репутация
1
Проверьте:
Настройка -> Почтовые программы -> Разрешить доступ к почтовому ящику с помощью почтовых клиентов.
 
Автор
Юрий

Юрий

Новичок
Сообщения
82
Репутация
3
Проверьте:
Настройка -> Почтовые программы -> Разрешить доступ к почтовому ящику с помощью почтовых клиентов.

Пришёл на другой комп (тоже Windows 7 Ultimate x64 бита) и всё заработало :ok: :IL_AutoIt_1:
Скорее всего причина именно в этом :scratch: но уточните, пожалуйста, где эти настройки находятся? вы имели ввиду панель управления? но поиск ничего не нашёл :scratch:
 

d-polozov

Новичок
Сообщения
2
Репутация
0
Ну первый скрипт, у меня тоже не работает выдает ошибку, не стал разбираться, скорее всего дело в номере порта и ssl,
а вот скрипт alex33, "Smtp Mailer от 11 May 2013 by Jos" рабочий
оба они используют "cdo", что недостаток, но в принципе офис стоит почти на каждой винде.
 
Верх