Приветствую вас! Вопрос такого плана: в какую сторону рыть, что бы сделать обычную прогу по отправке эмейл сообщений на указанное мыло? Понятное дело, что прежде чем это сделать нужно через эту же прогу авторизироваться. Цель: отправка писем на разные ящики, с учетом того, что мой находится на яше. Спасибо.
Работа с почтой
Сообщений 1 страница 30 из 46
Поделиться207.06.2010 17:22:12
В библиотеке Droopy Library, в разделе Library --> Network --> Email есть функции для отправки писем на почту.
Сейчас подготовлю пример программы.
Поделиться307.06.2010 17:26:58
Сейчас подготовлю пример программы.
здорово. Сейчас поюзаю справку
Поделиться407.06.2010 17:47:07
Есть ещё функции в разделе Mail, справки пурика, но ими мне не приходилось пользоватся.
Поделиться507.06.2010 18:00:57
У меня функции из библиотеки Mail не заработали, уточнил у провайдёра, оказывается 25 порт заблокирован из-за большого количества спама.
Сейчас посмотрю будут ли работать функции из друпии....
Поделиться607.06.2010 18:07:29
Вообще изучая когда то в прошлом делфи, там были уроки по отправки почты на определенный gmail сервер. То есть не существует общего сценария (действия) по отправке на все сервера. Для каждого нужно как мне кажется прописывать свои определенные настройки и порты
Поделиться707.06.2010 18:28:32
Вот попробуй эту процедуру
Procedure Send_Mail(Name.s, Send_M.s, Send_Pass.s, Recipient_M.s, Title.s, Text.s) ; Name - имя отправителя письма, например, Вася Пупкин ; Send_M - Адрес отправителя, например Vasa_Pupkin@mail.ru ; Send_Pass - Пароль мейла - отправителя ; Recipient_M - Адрес мейла - получателя, например, Sidorov@gmail.com ; Title - Тема письма ; Text - Текст письма Server.s="" Pos=FindString(Send_M, "@", 1) If Pos>0 Server=Right(Send_M, Len(Send_M)-Pos) Else ProcedureReturn 0 EndIf SendEMailInit() ; Инициализация библиотеки AddAttachment("D:\knigi.txt") ; Это прикреплённый файл. Может отсутствовать. ProcedureReturn SendEmail(Name,Send_M, Recipient_M, Send_M, Send_Pass, "smtp."+Server, Title, Text) EndProcedure
Сам проверить не могу - 25 порт закрыт!
Поделиться807.06.2010 18:41:04
Ошибку синтаксическую выдает:
Procedure Send_Mail(Вася Пупкин, daiomik@yandex.ru, XXX, mayadik@yandex.ru, sss, ghbdtnsfsfgsgs) ; Name - имя отправителя письма, например, Вася Пупкин ; Send_M - Адрес отправителя, например Vasa_Pupkin@mail.ru ; Send_Pass - Пароль мейла - отправителя ; Recipient_M - Адрес мейла - получателя, например, Sidorov@gmail.com ; Title - Тема письма ; Text - Текст письма Server.s="" Pos=FindString(Send_M, "@", 1) If Pos>0 Server=Right(Send_M, Len(Send_M)-Pos) Else ProcedureReturn 0 EndIf SendEMailInit() ; Инициализация библиотеки AddAttachment("D:\knigi.txt") ; Это прикреплённый файл. Может отсутствовать. ProcedureReturn SendEmail(Name,Send_M, Recipient_M, Send_M, Send_Pass, "smtp."+Server, Title, Text) EndProcedure Repeat Send_Mail() Until Event=#PB_Event_CloseWindow
Поделиться907.06.2010 18:54:01
Надо было так процедуру вызывать
Procedure Send_Mail(Name.s, Send_M.s, Send_Pass.s, Recipient_M.s, Title.s, Text.s) ; Name - имя отправителя письма, например, Вася Пупкин ; Send_M - Адрес отправителя, например Vasa_Pupkin@mail.ru ; Send_Pass - Пароль мейла - отправителя ; Recipient_M - Адрес мейла - получателя, например, Sidorov@gmail.com ; Title - Тема письма ; Text - Текст письма Server.s="" Pos=FindString(Send_M, "@", 1) If Pos>0 Server=Right(Send_M, Len(Send_M)-Pos) Else ProcedureReturn 0 EndIf SendEMailInit() ; Инициализация библиотеки ;AddAttachment("D:\knigi.txt") ; Это прикреплённый файл. Может отсутствовать. ProcedureReturn SendEmail(Name,Send_M, Recipient_M, Send_M, Send_Pass, "smtp."+Server, Title, Text) EndProcedure If Send_Mail("Вася Пупкин", "daiomik@yandex.ru", "XXX", "mayadik@yandex.ru", "sss", "ghbdtnsfsfgsgs") MessageRequester("", "Письмо успешно отправленно", #MB_OK|#MB_ICONINFORMATION) Else MessageRequester("", "Письмо не отправлено", #MB_OK|#MB_ICONERROR) EndIf
А вот вариант с функциями пурика
InitNetwork() Procedure Send_Mail(Send_M.s, Recipient_M.s, Title.s, Text.s) ; Send_M - Адрес отправителя, например Vasa_Pupkin@mail.ru ; Recipient_M - Адрес мейла - получателя, например, Sidorov@gmail.com ; Title - Тема письма ; Text - Текст письма Server.s="" Pos=FindString(Send_M, "@", 1) If Pos>0 Server=Right(Send_M, Len(Send_M)-Pos) Else ProcedureReturn 0 EndIf If CreateMail(0, Send_M, Title) SetMailBody(0, Text) AddMailRecipient(0, Recipient_M, #PB_Mail_To) ProcedureReturn SendMail(0, "smtp."+Server, 25) EndIf EndProcedure If Send_Mail( "daiomik@yandex.ru", "mayadik@yandex.ru", "sss", "ghbdtnsfsfgsgs") MessageRequester("", "Письмо успешно отправленно", #MB_OK|#MB_ICONINFORMATION) Else MessageRequester("", "Письмо не отправлено", #MB_OK|#MB_ICONERROR) EndIf
Поделиться1007.06.2010 19:22:15
спасибо. Но я так смотрю не очень много функций по этому делу.
Поделиться1107.06.2010 19:27:22
Хоть работает?
Поделиться1207.06.2010 19:30:43
нет) пишет что письмо не отправлено. Пробовал второй пример. Все как то легко получается. Даже адреса не где не прописываются
Поделиться1307.06.2010 19:42:55
Работа с почтой здесь обсуждалась http://purebasic.info/phpBB2/viewtopic.php?t=103
Тогда у меня письма отправлялись, а сейчас провайдер 25 порт закрыл, так что проверить не могу.
Поделиться1407.06.2010 19:47:02
Здесь ещё есть кое-какая информация http://purebasic.info/phpBB2/viewtopic.php?t=869
Поделиться1507.06.2010 22:07:35
Работа с почтой здесь обсуждалась
ок. гляну. Как будет прогресс отпишусь
а сейчас провайдер 25 порт закрыл
а что это за 25-ы порт такой?
Поделиться1608.06.2010 00:41:36
Ну это порт, используемый при работе с электронной почтой, по протоколу SMTP
Например, браузер использует 80 или 8080 порт.
Поделиться1721.03.2011 22:40:13
SendEMailInit() AddAttachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") SendEmail("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") NoAttachment()
я этот код запускаю и на мой e-mail приходит письмо от меня с темой AAA и с текстом sss, но файла никакого не прекреплено. Но почему, я вроде всё правильно сделал?
Поделиться1821.03.2011 22:48:46
Попробуй более старую версию PureBasic (скажем, 4.02 или 4.10), т. к. у библиотеки Droopy Library есть проблемы с совместимостью с новыми версиями.
Или вытащи в код, процедур из Droopy Library, работающих с мылом.
Тогда должно заработать.
Поделиться1921.03.2011 23:02:38
Или вытащи в код, процедур из Droopy Library, работающих с мылом
А как вытащить?
Поделиться2021.03.2011 23:11:43
А как вытащить?
Открыть исходник друпии и найти там нужные процедуры.
Вот они:
; _____________________________________________________________________________ ; | | ; | SendEmail (New) | ; | _______________ | ; | | ; |___________________________________________________________________________| ;{ SendEmail (New) (Start) ; Author : clipper ; PureBasic 3.93 ; Sending Mail with SMTP-AUTH + add multiple attachments ; Donґt fill the Username if you don't want authentification Enumeration #eHlo #RequestAuthentication #Username #Password #MailFrom #RcptTo #Data #Quit #Complete EndEnumeration ProcedureDLL SendEMailInit() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure ProcedureDLL AddAttachment(File.s) AddElement(Attachments()) Attachments() = file EndProcedure ProcedureDLL NoAttachment() ClearList(Attachments()) EndProcedure Procedure.s GetMIMEType(Extension.s) Extension = "." + Extension hKey.l = 0 KeyValue.s = Space(255) DataSize.l = 255 If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_READ, @hKey) KeyValue = "application/octet-stream" Else If RegQueryValueEx_(hKey, "Content Type", 0, 0, @KeyValue, @DataSize) KeyValue = "application/octet-stream" Else KeyValue = Left(KeyValue, DataSize-1) EndIf RegCloseKey_(hKey) EndIf ProcedureReturn KeyValue EndProcedure Procedure.s Base64Encode(strText.s) Define.s Result *B64EncodeBufferA = AllocateMemory(Len(strText)+1) *B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1) PokeS(*B64EncodeBufferA, strText, -1, #PB_UTF8) Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3) Result = PeekS(*B64EncodeBufferB) FreeMemory(-1) ProcedureReturn Result EndProcedure Procedure Send(msg.s) msg+#CRLF$ SendNetworkData(SendEMailConnectionID, @msg, Len(msg)) EndProcedure Procedure SendFiles() ResetList(Attachments()) While(NextElement(Attachments())) file.s=Attachments() Send("") If ReadFile(0,file.s) InputBufferLength.l = Lof(0) OutputBufferLength.l = InputBufferLength * 1.4 *memin=AllocateMemory(InputBufferLength) If *memin *memout=AllocateMemory(OutputBufferLength) If *memout Boundry.s = "--MyBoundary" Send(Boundry) Send("Content-Type: "+GetMIMEType(GetExtensionPart(file.s)) + "; name=" + Chr(34) + GetFilePart(file.s) + Chr(34)) Send("Content-Transfer-Encoding: base64") Send("Content-Disposition: Attachment; filename=" + Chr(34) + GetFilePart(file) + Chr(34)) Send("") ReadData(0, *memin,InputBufferLength) Base64Encoder(*memin,60,*memout,OutputBufferLength) Send(PeekS(*memout,60)) ; this must be done because For i=0 To OutputBufferLength/60 doesnВґt work Base64Encoder(*memin,InputBufferLength,*memout,OutputBufferLength) For i=1 To OutputBufferLength/60 temp.s=Trim(PeekS(*memout+i*60,60)) If Len(temp)>0 Send(temp) EndIf Next EndIf EndIf FreeMemory(-1) CloseFile(0) EndIf Wend ProcedureReturn EndProcedure ProcedureDLL SendEmail(Name.s,sender.s,recipient.s,Username.s,Password.s,smtpserver.s,subject.s,body.s) If InitNetwork() SendEMailConnectionID = OpenNetworkConnection(smtpserver, 25) If SendEMailConnectionID loop250.l=0 Repeat If NetworkClientEvent(SendEMailConnectionID) ReceivedData.s=Space(9999) ct=ReceiveNetworkData(SendEMailConnectionID ,@ReceivedData,9999) If ct cmdID.s=Left(ReceivedData,3) cmdText.s=Mid(ReceivedData,5,ct-6) Select cmdID Case "220" If Len(Username)>0 Send("Ehlo " + Hostname()) State=#eHlo Else Send("HELO " + Hostname()) State=#MailFrom EndIf Case "221" Send("[connection closed]") State=#Complete quit=1 Case "235" Send("MAIL FROM: <" + sender + ">") State=#RcptTo Case "334" If State=#RequestAuthentication Send(Base64Encode(Username)) State=#Username EndIf If State=#Username Send(Base64Encode(password)) state=#Password EndIf Case "250" Select state Case #eHlo Send("AUTH LOGIN") state=#RequestAuthentication Case #MailFrom Send("MAIL FROM: <" + sender + ">") state=#RcptTo Case #RcptTo Send("RCPT TO: <" + recipient + ">") state=#Data Case #Data Send("DATA") state=#Quit Case #Quit Send("QUIT") EndSelect Case "251" Send("DATA") state=#Data Case "354" Send("X-Mailer: eSMTP 1.0") Send("To: " + recipient) Send("From: " + name + " <" + sender + ">") Send("Reply-To: "+sender) Send("Date:" + FormatDate("%dd/%mm/%yyyy @ %hh:%ii:%ss", Date()) ) Send("Subject: " + subject) Send("MIME-Version: 1.0") Send("Content-Type: multipart/mixed; boundary="+Chr(34)+"MyBoundary"+Chr(34)) Send("") Send("--MyBoundary") Send("Content-Type: text/plain; charset=us-ascii") Send("Content-Transfer-Encoding: 7bit") Send("") Send(body.s) SendFiles() Send("--MyBoundary--") Send(".") Case "550" quit=1 EndSelect EndIf EndIf Until quit = 1 CloseNetworkConnection(SendEMailConnectionID) EndIf EndIf EndProcedure
их скорей всего придется переименовать чтобы не возникало ошибок при компияции.
Поделиться2121.03.2011 23:30:14
При запуске выдало: Недопустимое имя, совпадает с внешней командой.
Я и библиотеку Droopy Library удалял, нечего. В чём теперь то дело?
Поделиться2221.03.2011 23:33:00
Я и библиотеку Droopy Library удалял, нечего.
Значит не до конца удалил.
Но не обязательно удалять, я же написал
их скорей всего придется переименовать чтобы не возникало ошибок при компиляции.
Просто переименуй процедуры на которые ругается и вызывай эти переименованные процедуры.
Поделиться2321.03.2011 23:46:33
ProcedureDLL qqq() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure qqq() AddAttachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") SendEmail("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") NoAttachment()
Я извиняюсь за нескончаемую тупость, но я переименовал, и когда запустил то оно зависло на строке ' AddAttachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") '. Когда строку убрал встало на строке 'SendEmail("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") '
Я как всегда делаю что то не то?
Поделиться2422.03.2011 00:12:14
По моему, не все переименовано (судя по коду).
Попробуй так подставив свои данные мейлов:
; _____________________________________________________________________________ ; | | ; | SendEmail (New) | ; | _______________ | ; | | ; |___________________________________________________________________________| ;{ SendEmail (New) (Start) ; Author : clipper ; PureBasic 3.93 ; Sending Mail with SMTP-AUTH + add multiple attachments ; Donґt fill the Username if you don't want authentification Enumeration #eHlo #RequestAuthentication #Username #Password #MailFrom #RcptTo #Data #Quit #Complete EndEnumeration ProcedureDLL Send_EMailInit() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure ProcedureDLL Add_Attachment(File.s) AddElement(Attachments()) Attachments() = file EndProcedure ProcedureDLL No_Attachment() ClearList(Attachments()) EndProcedure Procedure.s GetMIMEType(Extension.s) Extension = "." + Extension hKey.l = 0 KeyValue.s = Space(255) DataSize.l = 255 If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_READ, @hKey) KeyValue = "application/octet-stream" Else If RegQueryValueEx_(hKey, "Content Type", 0, 0, @KeyValue, @DataSize) KeyValue = "application/octet-stream" Else KeyValue = Left(KeyValue, DataSize-1) EndIf RegCloseKey_(hKey) EndIf ProcedureReturn KeyValue EndProcedure Procedure.s Base64Encode(strText.s) Define.s Result *B64EncodeBufferA = AllocateMemory(Len(strText)+1) *B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1) PokeS(*B64EncodeBufferA, strText, -1, #PB_UTF8) Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3) Result = PeekS(*B64EncodeBufferB) FreeMemory(-1) ProcedureReturn Result EndProcedure Procedure Send(msg.s) msg+#CRLF$ SendNetworkData(SendEMailConnectionID, @msg, Len(msg)) EndProcedure Procedure SendFiles() ResetList(Attachments()) While(NextElement(Attachments())) file.s=Attachments() Send("") If ReadFile(0,file.s) InputBufferLength.l = Lof(0) OutputBufferLength.l = InputBufferLength * 1.4 *memin=AllocateMemory(InputBufferLength) If *memin *memout=AllocateMemory(OutputBufferLength) If *memout Boundry.s = "--MyBoundary" Send(Boundry) Send("Content-Type: "+GetMIMEType(GetExtensionPart(file.s)) + "; name=" + Chr(34) + GetFilePart(file.s) + Chr(34)) Send("Content-Transfer-Encoding: base64") Send("Content-Disposition: Attachment; filename=" + Chr(34) + GetFilePart(file) + Chr(34)) Send("") ReadData(0, *memin,InputBufferLength) Base64Encoder(*memin,60,*memout,OutputBufferLength) Send(PeekS(*memout,60)) ; this must be done because For i=0 To OutputBufferLength/60 doesnВґt work Base64Encoder(*memin,InputBufferLength,*memout,OutputBufferLength) For i=1 To OutputBufferLength/60 temp.s=Trim(PeekS(*memout+i*60,60)) If Len(temp)>0 Send(temp) EndIf Next EndIf EndIf FreeMemory(-1) CloseFile(0) EndIf Wend ProcedureReturn EndProcedure ProcedureDLL Send_Email(Name.s,sender.s,recipient.s,Username.s,Password.s,smtpserver.s,subject.s,body.s) If InitNetwork() SendEMailConnectionID = OpenNetworkConnection(smtpserver, 25) If SendEMailConnectionID loop250.l=0 Repeat If NetworkClientEvent(SendEMailConnectionID) ReceivedData.s=Space(9999) ct=ReceiveNetworkData(SendEMailConnectionID ,@ReceivedData,9999) If ct cmdID.s=Left(ReceivedData,3) cmdText.s=Mid(ReceivedData,5,ct-6) Select cmdID Case "220" If Len(Username)>0 Send("Ehlo " + Hostname()) State=#eHlo Else Send("HELO " + Hostname()) State=#MailFrom EndIf Case "221" Send("[connection closed]") State=#Complete quit=1 Case "235" Send("MAIL FROM: <" + sender + ">") State=#RcptTo Case "334" If State=#RequestAuthentication Send(Base64Encode(Username)) State=#Username EndIf If State=#Username Send(Base64Encode(password)) state=#Password EndIf Case "250" Select state Case #eHlo Send("AUTH LOGIN") state=#RequestAuthentication Case #MailFrom Send("MAIL FROM: <" + sender + ">") state=#RcptTo Case #RcptTo Send("RCPT TO: <" + recipient + ">") state=#Data Case #Data Send("DATA") state=#Quit Case #Quit Send("QUIT") EndSelect Case "251" Send("DATA") state=#Data Case "354" Send("X-Mailer: eSMTP 1.0") Send("To: " + recipient) Send("From: " + name + " <" + sender + ">") Send("Reply-To: "+sender) Send("Date:" + FormatDate("%dd/%mm/%yyyy @ %hh:%ii:%ss", Date()) ) Send("Subject: " + subject) Send("MIME-Version: 1.0") Send("Content-Type: multipart/mixed; boundary="+Chr(34)+"MyBoundary"+Chr(34)) Send("") Send("--MyBoundary") Send("Content-Type: text/plain; charset=us-ascii") Send("Content-Transfer-Encoding: 7bit") Send("") Send(body.s) SendFiles() Send("--MyBoundary--") Send(".") Case "550" quit=1 EndSelect EndIf EndIf Until quit = 1 CloseNetworkConnection(SendEMailConnectionID) EndIf EndIf EndProcedure ;} Send_EMailInit() Add_Attachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") Send_Email("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") No_Attachment()
Поделиться2522.03.2011 00:24:38
Я попробовал ваш код, при запуске он завис на одной из строк. Ну, я просто взял и удалил строки на которых он глючил. У меня скомпилиравалось, но письмо всё равно пришло без вложения. А какая именно была ошибка в этом коде?
ProcedureDLL qqq() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure qqq() AddAttachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") SendEmail("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") NoAttachment()
Поделиться2622.03.2011 00:44:30
на одной из строк.
На какой именно?
письмо всё равно пришло без вложения.
А если посмотреть с помощью отладчика как выполняется программа и отправляется ли вложение?
Поделиться2722.03.2011 01:12:03
На какой именно?
на всех строках FreeMemory(-1)
А нельзя найти в интернете библиотеку droopu но совместимую с PB 4.30?
А какая именно была ошибка в этом коде?
ProcedureDLL qqq() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure qqq() AddAttachment("C:\Users\СбС\Desktop\Новая папка (4)\test.txt") SendEmail("pig","мой e-mail","мой e-mai","мой e-mail","мой пароль","mail.rambler.ru","AAA","sss") NoAttachment()
Поделиться2822.03.2011 06:39:05
А нельзя найти в интернете библиотеку droopu но совместимую с PB 4.30?
Да не мучайся ты с этой библиотекой! Она хороша во многих отношениях, но с почтой работает не очень. Есть прекрасная библиотека для почты PureSMTP для отправки с вложениями и PurePOP3 для получения с вложениями. Найти можно тут: http://gnozal.ucoz.com/
Там ещё много разных хороших и полезных программ и библиотек, которые постоянно обновляются в соответствии с версиями Пурика. Рекомендую!
P.s.
А на счет FreeMemory - ну прочитай же наконец справку, там же ясно написано, что освобождать надо ранее выделенную память при помощи AllocateMemory() или ReAllocateMemory(). Значит код должен выглядеть так:
... FreeMemory(*B64EncodeBufferA) FreeMemory(*B64EncodeBufferB) ...
И по образу в другом случае.
Отредактировано ВиниПур (22.03.2011 07:00:38)
Поделиться2922.03.2011 07:23:30
Проверил на примере mail.ru, У меня работает отлично, только надо тщательно заполнять поля, особенно логин ( в маиле без @mail.ru) и правильный сервер smtp ( разный у разных сервисов)
; _____________________________________________________________________________ ; | | ; | SendEmail (New) | ; | _______________ | ; | | ; |___________________________________________________________________________| ;{ SendEmail (New) (Start) ; Author : clipper ; PureBasic 3.93 ; Sending Mail with SMTP-AUTH + add multiple attachments ; Donґt fill the Username if you don't want authentification Enumeration #eHlo #RequestAuthentication #Username #Password #MailFrom #RcptTo #Data #Quit #Complete EndEnumeration ProcedureDLL Send_EMailInit() Global NewList Attachments.s() Global SendEMailConnectionID.l EndProcedure ProcedureDLL Add_Attachment(File.s) AddElement(Attachments()) Attachments() = file EndProcedure ProcedureDLL No_Attachment() ClearList(Attachments()) EndProcedure Procedure.s GetMIMEType(Extension.s) Extension = "." + Extension hKey.l = 0 KeyValue.s = Space(255) DataSize.l = 255 If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_READ, @hKey) KeyValue = "application/octet-stream" Else If RegQueryValueEx_(hKey, "Content Type", 0, 0, @KeyValue, @DataSize) KeyValue = "application/octet-stream" Else KeyValue = Left(KeyValue, DataSize-1) EndIf RegCloseKey_(hKey) EndIf ProcedureReturn KeyValue EndProcedure Procedure.s Base64Encode(strText.s) Define.s Result *B64EncodeBufferA = AllocateMemory(Len(strText)+1) *B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1) PokeS(*B64EncodeBufferA, strText, -1, #PB_UTF8) Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3) Result = PeekS(*B64EncodeBufferB) FreeMemory(*B64EncodeBufferA) FreeMemory(*B64EncodeBufferB) ProcedureReturn Result EndProcedure Procedure Send(msg.s) msg+#CRLF$ SendNetworkData(SendEMailConnectionID, @msg, Len(msg)) EndProcedure Procedure SendFiles() ResetList(Attachments()) While(NextElement(Attachments())) file.s=Attachments() Send("") If ReadFile(0,file.s) InputBufferLength.l = Lof(0) OutputBufferLength.l = InputBufferLength * 1.4 *memin=AllocateMemory(InputBufferLength) If *memin *memout=AllocateMemory(OutputBufferLength) If *memout Boundry.s = "--MyBoundary" Send(Boundry) Send("Content-Type: "+GetMIMEType(GetExtensionPart(file.s)) + "; name=" + Chr(34) + GetFilePart(file.s) + Chr(34)) Send("Content-Transfer-Encoding: base64") Send("Content-Disposition: Attachment; filename=" + Chr(34) + GetFilePart(file) + Chr(34)) Send("") ReadData(0, *memin,InputBufferLength) Base64Encoder(*memin,60,*memout,OutputBufferLength) Send(PeekS(*memout,60)) ; this must be done because For i=0 To OutputBufferLength/60 doesnВґt work Base64Encoder(*memin,InputBufferLength,*memout,OutputBufferLength) For i=1 To OutputBufferLength/60 temp.s=Trim(PeekS(*memout+i*60,60)) If Len(temp)>0 Send(temp) EndIf Next EndIf EndIf FreeMemory(*memin) FreeMemory(*memout) CloseFile(0) EndIf Wend ProcedureReturn EndProcedure ProcedureDLL Send_Email(Name.s,sender.s,recipient.s,Username.s,Password.s,smtpserver.s,subject.s,body.s) If InitNetwork() SendEMailConnectionID = OpenNetworkConnection(smtpserver, 25) If SendEMailConnectionID loop250.l=0 Repeat If NetworkClientEvent(SendEMailConnectionID) ReceivedData.s=Space(9999) ct=ReceiveNetworkData(SendEMailConnectionID ,@ReceivedData,9999) If ct cmdID.s=Left(ReceivedData,3) cmdText.s=Mid(ReceivedData,5,ct-6) Select cmdID Case "220" If Len(Username)>0 Send("Ehlo " + Hostname()) State=#eHlo Else Send("HELO " + Hostname()) State=#MailFrom EndIf Case "221" Send("[connection closed]") State=#Complete quit=1 Case "235" Send("MAIL FROM: <" + sender + ">") State=#RcptTo Case "334" If State=#RequestAuthentication Send(Base64Encode(Username)) State=#Username EndIf If State=#Username Send(Base64Encode(password)) state=#Password EndIf Case "250" Select state Case #eHlo Send("AUTH LOGIN") state=#RequestAuthentication Case #MailFrom Send("MAIL FROM: <" + sender + ">") state=#RcptTo Case #RcptTo Send("RCPT TO: <" + recipient + ">") state=#Data Case #Data Send("DATA") state=#Quit Case #Quit Send("QUIT") EndSelect Case "251" Send("DATA") state=#Data Case "354" Send("X-Mailer: eSMTP 1.0") Send("To: " + recipient) Send("From: " + name + " <" + sender + ">") Send("Reply-To: "+sender) Send("Date:" + FormatDate("%dd/%mm/%yyyy @ %hh:%ii:%ss", Date()) ) Send("Subject: " + subject) Send("MIME-Version: 1.0") Send("Content-Type: multipart/mixed; boundary="+Chr(34)+"MyBoundary"+Chr(34)) Send("") Send("--MyBoundary") Send("Content-Type: text/plain; charset=us-ascii") Send("Content-Transfer-Encoding: 7bit") Send("") Send(body.s) SendFiles() Send("--MyBoundary--") Send(".") Case "550" quit=1 EndSelect EndIf EndIf Until quit = 1 CloseNetworkConnection(SendEMailConnectionID) EndIf EndIf EndProcedure ;} Send_EMailInit() Add_Attachment("C:\какой то файл.ТХТ") Send_Email("pig","от_меня@mail.ru","Ему_шлю@mail.ru","от_меня","мой_пароль","smtp.mail.ru","Тема","Текст письма") No_Attachment()
Отредактировано ВиниПур (22.03.2011 07:24:17)
Поделиться3022.03.2011 12:41:37
Ну, у меня опять тупануло на одной из строк, ну ладно, нибуду действительно с патим парится, попробую библиотеку PureSMTP. Спасибо.