Что нового

Реализация SMTP Сервера

La2Angel

Новичок
Сообщения
156
Репутация
1
Добрый вечер.

1. Возможно ли сделать SMTP сервер на AutoIt?

Просто есть сайт, с которого почта отправляется, нужно программу, как SMTP сервер, просто большинство провайдеров закрыли отправку почты, хочу сделать - при регистрации на сайте, писмо отправляется через SMTP сервер на AutoIt, а уже моя программа не отправляет на прямую, а через веб интерфейс.


Пытался читать статьи в интернете, сделал сервер по приему данных от сайта, и отправке ему данных для получения адресата и отправки почты, но сайт не реагирует никак, ждет пока сервер ответит...
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
люди не понимают что ты хочешь и что ты имеешь, у тебя есть хостинг (точка_A), ты хочешь чтобы письма вначале приходили к тебе (точка_B), а уж потом ты рассылал их дальше (точка_C) предварительно почитав так?

вопрос: если есть доступ к серверу, зачем письма пересылать туда сюда?
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Нет, извините, не правильно выразился.

1. Есть собственный сайт, стоит дома на домашней машине.
2. На сайте есть регистрация, естественно есть подтверждение пароля по почте.
3. При регистрации, сайт пытается подключится к SMTP серверу на localhost и порт 25.

Смысл в том, что если скачать SMTP сервер, все нормально работает, но почта отправляется только на yandex.ru. Т.к. mail.ru, google.ru закрыли такой доступ от спама и нужно в тех поддержку им писать.

Я хочу эмулировать SMTP сервер, который будет находится на этой же машине под localhost и порт 25. Он будет принимать почту, но отсылать через веб интерфейс уже.

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

Я знаю что примерно так работает запрос от сайта к серверу SMTP: С - Клиент(сайт), S - сервер.
Код:
S: (ожидает соединения)
C: (Подключается к порту 25 сервера)
S:220 mail.company.tld ESMTP CommuniGate Pro 5.1.4i is glad to see you!
C:HELO
S:250 domain name should be qualified
C:MAIL FROM: <[email protected]>
S:250 [email protected] sender accepted
C:RCPT TO:<[email protected]>
S:250 [email protected] ok
C:RCPT TO: <[email protected]>
S:550 [email protected]  unknown user account
C:DATA
S:354 Enter mail, end with "." on a line by itself
C:from: [email protected]                    //чтобы письмо  
C:to: [email protected]                                //не было добавлено
C:subject: tema                                        //в категорию спам
C:                                                     //
C:Hi!
C:.
S:250 769947 message accepted for delivery
C:QUIT
S:221 mail.company.tld CommuniGate Pro SMTP closing connection
S: (закрывает соединение)
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
В реале даже самодельные письма попадут в спам легко
Самописный SMTP сервер - не панацея. Лучше используй почту для домента от тогоже http://pdd.yandex.ru
 

xaker

Знающий
Сообщения
52
Репутация
16
а можно по другому:
Сделать ящик на yandex.ru и пусть при регистрации SMTP сервер отправляет туда всю информацию, а на AutoIt сделать програму которая будет считывать письма с этого ящика и через интерфейс отправлять куда надо.
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Думаю лучше все таки сделать самопальный SMTP, т.к. на нем я хотя бы могу рандомно хоть 5 почт сделать и пусть с разных отправляет, смысл не в том, что в спам идет письмо, а в том, что вообще на майл и гуугл не отправляет почту.

И кстати ваш 2 пост, имено то и говорит, что я прошу, но у вас только лишний круг делать, отправить почту на яндекс, а через AutoIt в другое место. А я хочу всего лишь на прямую, с моего сайта на AutoIT а он потом уже в др место.
 

xaker

Знающий
Сообщения
52
Репутация
16
вот так можно попробовать ловить почту:
Код:
#include <GUIConstantsEx.au3>

Global $szIPADDRESS = '127.0.0.1'
;~ Global $szIPADDRESS = @IPAddress2
Global $nPORT = 12345
Global $ConnectedSocket, $recv, $hTimer

TCPStartup()
Global $MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit

GUICreate("My Server (IP: " & $szIPADDRESS & ")", 500, 700, 100, 100)
Global $edit = GUICtrlCreateEdit("", 10, 10, 480, 680)
GUISetState()

While 1
	$ConnectedSocket = -1
	Do
		If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
		$ConnectedSocket = TCPAccept($MainSocket)
	Until $ConnectedSocket <> -1
	$hTimer = TimerInit()
	While 1
		If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
		$recv = BinaryToString(TCPRecv($ConnectedSocket, 2048), 4)
		If $recv <> "" Or TimerDiff($hTimer) > 1000 Then
			GUICtrlSetData($edit, " > " & $recv & @CRLF & GUICtrlRead($edit))
			TCPCloseSocket($ConnectedSocket)
			ExitLoop
		EndIf
	WEnd
WEnd
TCPShutdown()
только порт настрой
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Ммм пример выше уже хотя бы не вводити сайт в ожидание, но выводит на экран только > и все, почту не видно. Чего можно дальше придумать ? Или это был отталкивающий пример ?)
 

xaker

Знающий
Сообщения
52
Репутация
16
а если через браузер заходить на 127.0.0.1 то выводит чтото?
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Код:
 > GET / HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14
Host: 127.0.0.1
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Pragma: no-cache
Cache-Control: no-cache
Connection: Keep-Alive
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
xaker
SMTP - это не просто отправка/прием пакета, это полноценный диалог
Почитайте RFC821
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Я к сожалению с Английским на ВЫ, но посмотрел, примерно то же самое я кинул выше, где диалог Клиента с сервером.

Ааа это пост не мне был :smile:


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

Нашел сервачек с исходником на VB, к счастью VB понимаю, но лучше хотелось бы на AutoIT :smile:

Тема актуальна.


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

Если вы все таки решите мне помочь, вот функция в VB за распознование почты:
Код:
Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)

  On Error Resume Next
  Dim Tmp As String
  Dim TP() As String
  Dim FF As Long

  FF = FreeFile
  MkDir RCP(App.Path) & "mail"
  ws(Index).GetData Tmp
  Open RCP(App.Path) & "mail\mail.log" For Append As #FF
  Print #FF, Tmp
  Close #FF

  Tmp = Replace(Tmp, vbNullChar, " ")
  If InStr(Tmp, " ") = 0 Then Tmp = Tmp & " "
  If Left(Tmp, 6) = "DATA" & vbCrLf Then Tmp = "DATA " & vbCrLf
  If Left(Tmp, 6) = "QUIT" & vbCrLf Then Tmp = "QUIT " & vbCrLf
  If Left(Tmp, 3) = "." & vbCrLf Then Tmp = vbCrLf & "." & vbCrLf

  If InStr(Tmp, " ") > 0 Then
    TP = Split(Tmp, " ")
  Else
    TP = Split("1:0", ":")
  End If

  Select Case VBA.UCase$(TP(0))
    Case "HELO", "EHLO":  Msg VBA.UCase$(TP(0)): ws(Index).SendData "250 scinspy.info" & vbCrLf
    Case "MAIL":  Msg VBA.UCase$(TP(0)): ws(Index).SendData "250 OK" & vbCrLf: Mails(Index).FromEmail = Trim(Replace(Replace(Replace(Tmp, vbCrLf, vbNullString), "MAIL FROM", vbNullString), ":", vbNullString))
    Case "RCPT": Msg VBA.UCase$(TP(0)): ws(Index).SendData "250 OK" & vbCrLf: Mails(Index).ToEmail = Trim(Replace(Replace(Replace(Tmp, vbCrLf, vbNullString), "RCPT TO", vbNullString), ":", vbNullString))
    Case ".": ws(Index).SendData "250 OK" & vbCrLf
    Case "DATA":  Msg VBA.UCase$(TP(0)): ws(Index).SendData "354 Start mail input; end with <CRLF>.<CRLF>" & vbCrLf: Mails(Index).Ready = True
    Case "QUIT": Msg VBA.UCase$(TP(0)): ws(Index).Tag = "ok": ws(Index).SendData "221 scinspy.info Service closing transmission channel" & vbCrLf
    Case Else
        If Mails(Index).Ready Then
          If InStr(Tmp, vbCrLf & "." & vbCrLf) > 0 Then
            Tmp = VBA.Left(Tmp, InStr(Tmp, vbCrLf & "." & vbCrLf) - 1)
            Mails(Index).Body = Mails(Index).Body & Tmp
            Call AddMail(Index)
          Else
            Mails(Index).Body = Mails(Index).Body & Tmp
          End If
        End If
  End Select
End Sub
 

xaker

Знающий
Сообщения
52
Репутация
16
а если добавить после
Код:
$hTimer = TimerInit()

вот это
Код:
TCPSend($ConnectedSocket, StringToBinary('220 127.0.0.1 SMTP service ready', 4))
 

xaker

Знающий
Сообщения
52
Репутация
16
и почему же не начинается диалог?
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Вот и я пытаюсь понять, если бы он начался, я уже бы написал по примерам :smile: Но увы, мои знания слишком малы:smile:
 

xaker

Знающий
Сообщения
52
Репутация
16
может снифером сначала посмотреть какие там пакеты летают...
 
Верх