tar сказал(а):Здравствуйте. В сообщении текст заменяется знаками вопроса. Как исправить?
Код:#AutoIt3Wrapper_Run_AU3Check= N #include <File.au3> $SmtpServer = 'smtp.yandex.ru' $FromAddress = '[email protected]' $Username = '[email protected]' $Password = 'ftuiutwfu19' ;$ToAddress = 'адресат@inbox.ru' $Subject = 'Гарантийное обслуживание ХОК.' $Body = 'Здравствуйте. Вы не подали заявку на технический осмотр оборудования. Напоминаем, если мы не получим заявку до 31.07.18, ремонт по гарантии станет не возможен.' $hFile = FileOpen("roma.txt") While 1 $ToAddress = FileReadLine($hFile) If @error Then ExitLoop _INetSmtpMailCom($SmtpServer, '', $FromAddress, $ToAddress, $Subject, $Body, '', '', '', $Username, $Password) Sleep(60000) WEnd FileClose($hFile) Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 1) $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($s_Body, "<") And StringInStr($s_Body, ">") Then $objEmail.HTMLBody = $s_Body Else $objEmail.Textbody = $s_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]) If FileExists($S_Files2Attach[$x]) Then $objEmail.AddAttachment($S_Files2Attach[$x]) Else $i_Error_desciption = $i_Error_desciption & @LF & 'File not found to attach: ' & $S_Files2Attach[$x] 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 $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort 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 $objEmail.Configuration.Fields.Update $objEmail.Send If @error Then SetError(2) EndIf EndFunc ;==>_INetSmtpMailCom
Сохранял текст в notepad, в 2 файла. Один в ANSI, другой в UTF-8. По очереди копировал текст в скрипт. В обоих случаях приходит сообщение с вопросительными знаками вместо кириллицы, латинские символы "P.S." отобразились верно.Попробуй поиграться с кодировкой..... ANSI, UTF-8
$s = @ScriptDir & "\mytext.txt"
With ObjCreate("ADODB.Stream")
.Type = 2
.Mode = 3
.Charset = "windows-1251"
.Open
.LoadFromFile($s)
.Position = 0
$s = .ReadText
.Close
EndWith
MsgBox(0,0,$s)
В MsgBox выводит правильно сообщение из файла с кодировкой ANSI. На почту приходят знаки вопросов вместо кириллицы, латиница приходит верно. Какие возможны варианты?Если так, поместить текст в файл, потом прочесть и отправить?
Может чего не правильно сделал?вот что у меня приходит, все норм да же если добавляю это все норм..
$Subject = 'test 1'
$s = @ScriptDir & "\textoANSI.txt"
With ObjCreate("ADODB.Stream")
.Type = 2
.Mode = 3
.Charset = "windows-1251"
.Open
.LoadFromFile($s)
.Position = 0
$s = .ReadText
.Close
EndWith
$Body = $s
$hFile = FileOpen("roma.txt")
While 1
$ToAddress = FileReadLine($hFile)
If @error Then ExitLoop
_INetSmtpMailCom($SmtpServer, '', $FromAddress, $ToAddress, $Subject, $Body, '', '', '', $Username, $Password)
Sleep(60000)
WEnd
$objEmail.Send
$objEmail^ ERROR
->20:44:43 AutoIt3.exe ended.rc:1
+>20:44:43 AutoIt3Wrapper Finished.
>Exit code: 1 Time: 1.627
#AutoIt3Wrapper_Run_AU3Check= N
#include <File.au3>
$SmtpServer = 'smtp.yandex.ru'
$FromAddress = '[email protected]'
$Username = '[email protected]'
$Password = 'ftuiutwfu19'
;$ToAddress = 'адресат@inbox.ru'
$Subject = 'Гарантийное обслуживание ХОК.'
$Body = 'Здравствуйте. Вы не подали заявку на технический осмотр оборудования. Напоминаем, если мы не получим заявку до 31.07.18, ремонт по гарантии станет не возможен.'
_INetSmtpMailCom($SmtpServer, '', $FromAddress, '[email protected]', $Subject, $Body, '', '', '', $Username, $Password)
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 1)
$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($s_Body, "<") And StringInStr($s_Body, ">") Then
$objEmail.HTMLBody = $s_Body
Else
$objEmail.BodyPart.Charset = "utf-8" ; utf-8, windows-1251, koi8-r, koi8-u, iso-8859-5
$objEmail.TextBodyPart.Charset = "utf-8"
$objEmail.Textbody = $s_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])
If FileExists($S_Files2Attach[$x]) Then
$objEmail.AddAttachment($S_Files2Attach[$x])
Else
$i_Error_desciption = $i_Error_desciption & @LF & 'File not found to attach: ' & $S_Files2Attach[$x]
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
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
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
$objEmail.Configuration.Fields.Update
$objEmail.Send
If @error Then
SetError(2)
EndIf
EndFunc ;==>_INetSmtpMailCom
$sFromName = 'Отправитель'
$sFromAddress = '[email protected]'
$sSubject = 'Гарантийное обслуживание ХОК.'
$sBody = 'Здравствуйте. Вы не подали заявку на технический осмотр оборудования. Напоминаем, если мы не получим заявку до 31.07.18, ремонт по гарантии станет не возможен.'
$sToAddress = '[email protected]'
$sSmtp = 'smtp.yandex.ru'
$iPort = 25
$bSsl = True
$sUsername = 'username'
$sPassword = 'password'
$hDll = DllOpen('mailer.dll')
If $hDll Then
$hMail = mail_create($hDll, $sFromName, $sFromAddress, $sSubject, $sBody)
If ($hMail <> 0) Then
mail_add_recipient($hDll, $hMail, $sToAddress)
mail_send($hDll, $hMail, $sSmtp, $iPort, $bSsl, $sUsername, $sPassword)
mail_close($hDll, $hMail)
EndIf
DllClose($hDll)
EndIf
Func mail_create($hDll, $sFromName, $sFromAddress, $sSubject, $sBody)
Local $aRet = DllCall($hDll, 'handle', 'mail_create', 'wstr', $sFromName, 'wstr', $sFromAddress, 'wstr', $sSubject, 'wstr', $sBody)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_close($hDll, $hMail)
Local $aRet = DllCall($hDll, 'bool', 'mail_close', 'handle', $hMail)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_add_recipient($hDll, $hMail, $sToAddress)
Local $aRet = DllCall($hDll, 'bool', 'mail_add_recipient', 'handle', $hMail, 'wstr', $sToAddress)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_send($hDll, $hMail, $sSmtp, $iPort, $bSsl, $sUsername, $sPassword)
Local $aRet = DllCall($hDll, 'bool', 'mail_send', 'handle', $hMail, 'wstr', $sSmtp, 'int', $iPort, 'bool', $bSsl, 'wstr', $sUsername, 'wstr', $sPassword)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Спасибо, порядок. В таком варианте, как можно отправить активную ссылку?Если не нужно прикреплять файлы и отправлять HTML письма, то набросал это.
Задайте вопрос специалисту http://restprom.ru/about_us/vopros-otvet/
tar сказал(а):Afonichev [?]
Спасибо, порядок. В таком варианте, как можно отправить активную ссылку?Если не нужно прикреплять файлы и отправлять HTML письма, то набросал это.
Примерно такКод:Задайте вопрос специалисту http://restprom.ru/about_us/vopros-otvet/
<a href="http://restprom.ru/about_us/vopros-otvet/">Задайте вопрос специалисту</a>
$sFromName = 'Отправитель'
$sFromAddress = '[email protected]'
$sSubject = 'Гарантийное обслуживание ХОК.'
$sBody = 'Здравствуйте. Вы не подали заявку на технический осмотр оборудования. Напоминаем, если мы не получим заявку до 31.07.18, ремонт по гарантии станет не возможен.</br></br><a href="http://restprom.ru/about_us/vopros-otvet/">Задайте вопрос специалисту</a>'
$bHtml = True
$sToAddress = '[email protected]'
$sSmtp = 'smtp.yandex.ru'
$iPort = 25
$bSsl = True
$sUsername = 'username'
$sPassword = 'password'
$hDll = DllOpen('mailer.dll')
If $hDll Then
$hMail = mail_create($hDll, $sFromName, $sFromAddress, $sSubject, $sBody, $bHtml)
If ($hMail <> 0) Then
If mail_add_recipient($hDll, $hMail, $sToAddress) Then
$bResult = mail_send($hDll, $hMail, $sSmtp, $iPort, $bSsl, $sUsername, $sPassword)
ConsoleWrite($bResult & @CRLF)
EndIf
mail_close($hDll, $hMail)
EndIf
DllClose($hDll)
EndIf
Func mail_create($hDll, $sFromName, $sFromAddress, $sSubject, $sBody, $bHtml)
Local $aRet = DllCall($hDll, 'handle', 'mail_create', 'wstr', $sFromName, 'wstr', $sFromAddress, 'wstr', $sSubject, 'wstr', $sBody, 'bool', $bHtml)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_close($hDll, $hMail)
Local $aRet = DllCall($hDll, 'bool', 'mail_close', 'handle', $hMail)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_add_recipient($hDll, $hMail, $sToAddress)
Local $aRet = DllCall($hDll, 'bool', 'mail_add_recipient', 'handle', $hMail, 'wstr', $sToAddress)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Func mail_send($hDll, $hMail, $sSmtp, $iPort, $bSsl, $sUsername, $sPassword)
Local $aRet = DllCall($hDll, 'bool', 'mail_send', 'handle', $hMail, 'wstr', $sSmtp, 'int', $iPort, 'bool', $bSsl, 'wstr', $sUsername, 'wstr', $sPassword)
If (@error Or (Not IsArray($aRet))) Then
Return SetError(0, 0, 1)
EndIf
Return $aRet[0]
EndFunc
Спасибо большое. Получил он уведомление или нет? Заказчики довольно часто ошибаются в написании собственных е-адресов. Когда отправляю вручную, то видно, что адрес не существует и такому приходится звонить. Нет ли возможности узнать, а ещё лучше, перед отправкой, проверить существование адреса, чтобы почтовиков не нервировать. Несуществующий адрес сохранить в файл.Добавил отправку HTML писем.
$re='/.*@(.*)/';
preg_match($re, $email, $match);
$domain=$match[1];
$mx_records=dns_get_record($domain, DNS_MX);
$port = 25; //Порт работы сервера
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
//AF_INET - семейство протоколов
//SOCK_STREAM - тип сокета
//SOL_TCP - протокол
echo "\nSocket creating error\n";
}
$result = socket_connect($socket, $domain, $port);
if ($result === false) {
echo "\nError connecting to socket\n";
} else {
echo "\nSocket connected\n";
}
> HELO domain.com
< 250 OK
> MAIL FROM: <[email protected]>
< 250 OK
> RCPT TO: <email@dlya_proverki.com>
< Ответ с резульатом проверки
</email@dlya_proverki.com></[email protected]>
$msg="HELO domain.com";
socket_write($socket, $msg, strlen($msg));
$out = socket_read($socket, 1024);
echo $out;