PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Работа с почтой


Работа с почтой

Сообщений 1 страница 30 из 46

1

Приветствую вас! Вопрос такого плана: в какую сторону рыть, что бы сделать обычную прогу по отправке эмейл сообщений на указанное мыло? Понятное дело, что прежде чем это сделать нужно через эту же прогу авторизироваться. Цель: отправка писем на разные ящики, с учетом того, что мой находится на яше. Спасибо.

0

2

В библиотеке Droopy Library, в разделе Library --> Network --> Email есть функции для отправки писем на почту.
Сейчас подготовлю пример программы.

0

3

Пётр написал(а):

Сейчас подготовлю пример программы.

здорово. Сейчас поюзаю справку

0

4

Есть ещё функции в разделе Mail, справки пурика, но ими мне не приходилось пользоватся.

0

5

У меня функции из библиотеки Mail не заработали, уточнил у провайдёра, оказывается 25 порт заблокирован из-за большого количества спама.
Сейчас посмотрю будут ли работать функции из друпии....

0

6

Вообще изучая когда то в прошлом делфи, там были уроки по отправки почты на определенный gmail сервер. То есть не существует общего сценария (действия) по отправке на все сервера. Для каждого нужно как мне кажется прописывать свои определенные настройки и порты :idea:

0

7

Вот попробуй эту процедуру

Код:
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 порт закрыт!

0

8

Ошибку синтаксическую выдает:

Код:
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

0

9

Надо было так процедуру вызывать

Код:
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

0

10

спасибо. Но я так смотрю не очень много функций по этому делу.

0

11

Хоть работает?

0

12

нет) пишет что письмо не отправлено. Пробовал второй пример. Все как то легко получается. Даже адреса не где не прописываются

0

13

Работа с почтой здесь обсуждалась http://purebasic.info/phpBB2/viewtopic.php?t=103
Тогда у меня письма отправлялись, а сейчас провайдер 25 порт закрыл, так что проверить не могу.

0

14

Здесь ещё есть кое-какая информация http://purebasic.info/phpBB2/viewtopic.php?t=869

0

15

Пётр написал(а):

Работа с почтой здесь обсуждалась

ок. гляну. Как будет прогресс отпишусь

Пётр написал(а):

а сейчас провайдер 25 порт закрыл

а что это за 25-ы порт такой?

0

16

Ну это порт, используемый при работе с электронной почтой, по протоколу SMTP
Например, браузер использует 80 или 8080 порт.

0

17

Код:
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, но файла никакого не прекреплено. Но почему, я вроде всё правильно сделал?

0

18

Попробуй более старую версию PureBasic (скажем, 4.02 или 4.10), т. к. у библиотеки Droopy Library есть проблемы с совместимостью с новыми версиями.
Или вытащи в код, процедур из Droopy Library, работающих с мылом.
Тогда должно заработать.

0

19

Пётр написал(а):

Или вытащи в код, процедур из Droopy Library, работающих с мылом

А как вытащить?

0

20

Илья написал(а):

А как вытащить?

Открыть исходник друпии и найти там нужные процедуры.
Вот они:

Код:
;  _____________________________________________________________________________
;  |                                                                           |
;  |                              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

их скорей всего придется переименовать чтобы не возникало ошибок при компияции.

0

21

При запуске выдало: Недопустимое имя, совпадает с внешней командой.
Я и библиотеку Droopy Library удалял, нечего. В чём теперь то дело?

0

22

Илья написал(а):

Я и библиотеку Droopy Library удалял, нечего.

Значит не до конца удалил.
Но не обязательно удалять, я же написал

Пётр написал(а):

их скорей всего придется переименовать чтобы не возникало ошибок при компиляции.

Просто переименуй процедуры на которые ругается и вызывай эти переименованные процедуры.

0

23

Код:
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") '
Я как всегда делаю что то не то?

0

24

По моему, не все переименовано (судя по коду).
Попробуй так подставив свои данные мейлов:

Код:
;  _____________________________________________________________________________
;  |                                                                           |
;  |                              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()

0

25

Я попробовал ваш код, при запуске он завис на одной из строк. Ну, я просто взял и удалил строки на которых он глючил. У меня скомпилиравалось, но письмо всё равно пришло без вложения. А какая именно была ошибка в этом коде?

Код:
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()

0

26

Илья написал(а):

на одной из строк.

На какой именно?

Илья написал(а):

письмо всё равно пришло без вложения.

А если посмотреть с помощью отладчика как выполняется программа и отправляется ли вложение?

0

27

Пётр написал(а):

На какой именно?

на всех строках 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()

0

28

Илья написал(а):

А нельзя найти в интернете библиотеку 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)

0

29

Проверил на примере 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)

0

30

Ну, у меня опять тупануло на одной из строк, ну ладно, нибуду действительно с патим парится, попробую библиотеку PureSMTP. Спасибо.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Работа с почтой