Email Verteiler

Anwendungen, Tools, Userlibs und anderes nützliches.
Caliban
Beiträge: 41
Registriert: 08.09.2004 08:46

Email Verteiler

Beitrag von Caliban »

Hallo,

hab ein kleines Programm geschrieben das eine Email an Beliebig viele Empfänger verschickt. Dabei ist die Zeit die zwischen dem verschicken jeder einzelnen Email vergeht einstellbar. Die einzelenen Email Adressen entnimmt es dabei aus einer Textdatei, in der jede Email Adresse in einer neuen Zeile Stehen muss. Feheler und Erfolgsmeldungen werden in der Console angezeigt und in einer Textdatei im gleichen Verzeichnis als log.txt gespeichert.

Zum compilieren wird die PureSmtp Libery aus PureArea.net gebraucht.

Sinn ist das Verschicken an sehr viele Empfänger (>100), so das man die Verteiler Funktion von Outlook nicht mehr verwenden kann.

Bitte entschuldigt den etwas chaotischen Stil, aber ich brauchte mal schnell so ein Programm.

Code: Alles auswählen

;- Window Constants
;

Enumeration
  #Window_0
  #Window_Einstellungen
  #Window_Wait
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_EmailListe
  #Text_10
  #Button_Suchen
  #Text_15
  #String_Betreff
  #Text_17
  #Editor_Text
  #Button_Senden
  #Button_Einstellungen
  
  #Text_0
  #Text_1
  #Text_3
  #Text_5
  #Text_7
  #Text_9
  #String_Server
  #String_User
  #String_PW
  #String_MailFrom
  #String_Delay
  #Text_12
  #String_Port
  #Button_0
  
  #Progressbar
  #PrText
EndEnumeration

Global Delay

Structure SmtpServer
  Adress.s
  Port.l
  User.s
  Password.s
EndStructure

Structure Email
  MailFrom.s
  MailTo.s
  Subject.s
  MsgBody.s
EndStructure

NewList LogBuffer.s()
  
Global Server.SmtpServer
Global Email.Email 

Procedure SendMail(Logfile.s) 
  
  ClearList(LogBuffer())
  
  AddElement(LogBuffer())
  LogBuffer() = FormatDate("%mm.%dd.%yyyy %hh:%ii:%ss", Date())
  
  If PureSMTP_OpenSMTPConnection(Server\Adress, Server\Port) = #PureSMTP_Ok
    
    AddElement(LogBuffer())
    LogBuffer() = PureSMTP_GetLastServerMessage()
    
    If PureSMTP_SendMail(Email\MailTo, Email\MailFrom, Email\Subject, Email\MsgBody,"",Server\User,Server\Password) = #PureSMTP_Ok
      AddElement(LogBuffer())
      LogBuffer() = "Ok! - " + Email\MailTo
    Else
      AddElement(LogBuffer())
      LogBuffer() = "Error: " + Email\MailTo
      AddElement(LogBuffer())
      LogBuffer() = PureSMTP_GetLastServerMessage() 
    EndIf
    
    PureSMTP_CloseSMTPConnection()
  Else
    
    AddElement(LogBuffer())
    LogBuffer() = "Error! Serververbinden"
    AddElement(LogBuffer())
    LogBuffer() = PureSMTP_GetLastServerMessage()
  EndIf
  
  File = OpenFile(#PB_Any,Logfile)
  FileSeek(Lof())
  If File
    ForEach LogBuffer()
      WriteStringN(LogBuffer())
    Next
    CloseFile(File)
  EndIf
  
EndProcedure

Procedure Load_Einstellungen()
    OpenPreferences("Config.ini")
    Server\Adress = ReadPreferenceString("Server","")
    Server\Port = ReadPreferenceLong("Port",25)
    Server\User = ReadPreferenceString("User","")
    Server\Password = ReadPreferenceString("PW","")
    Email\MailFrom = ReadPreferenceString("MailFrom","")
    Delay = ReadPreferenceLong("Delay",30)
    ClosePreferences()
EndProcedure

Procedure Save_Einsetllungen()
  Server\Adress = GetGadgetText(#String_Server)
  Server\Port = Val(GetGadgetText(#String_Port))
  Server\User = GetGadgetText(#String_User)
  Server\Password = GetGadgetText(#String_PW)
  Email\MailFrom = GetGadgetText(#String_MailFrom)
  Delay = Val(GetGadgetText(#String_Delay))
  CreatePreferences("config.ini")
  WritePreferenceString("Server",Server\Adress)
  WritePreferenceLong("Port",Server\Port)
  WritePreferenceString("User",Server\User)
  WritePreferenceString("PW",Server\Password)
  WritePreferenceString("MailFrom",Email\MailFrom)
  WritePreferenceLong("Delay",Delay)
  ClosePreferences()
EndProcedure

Procedure Open_Window_Einstellungen()
  HideWindow(#Window_0,1)
  Load_Einstellungen()
  If OpenWindow(#Window_Einstellungen, 243, 205, 258, 217,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Einstellungen")
    If CreateGadgetList(WindowID())
      TextGadget(#Text_0, 10, 10, 50, 20, "Server") 
      TextGadget(#Text_1, 10, 40, 50, 20, "Port")
      TextGadget(#Text_3, 10, 70, 50, 20, "Username")
      TextGadget(#Text_5, 10, 100, 50, 20, "Passwort")
      TextGadget(#Text_7, 10, 130, 50, 20, "Email")
      TextGadget(#Text_9, 10, 160, 70, 20, "Verzögerung")
      StringGadget(#String_Server, 90, 10, 160, 20, Server\Adress)
      StringGadget(#String_User, 90, 70, 160, 20, Server\User)
      StringGadget(#String_PW, 90, 100, 160, 20, Server\Password, #PB_String_Password)
      StringGadget(#String_MailFrom, 90, 130, 160, 20, Email\MailFrom)
      StringGadget(#String_Delay, 90, 160, 20, 20, Str(Delay))
      TextGadget(#Text_12, 120, 160, 70, 20, "in Sekunden")
      StringGadget(#String_Port, 90, 40, 40, 20, Str(Server\Port))
      
      Repeat
        
        Event = WaitWindowEvent()
        
        If Event = #PB_EventCloseWindow
          If EventWindowID() = #Window_Einstellungen 
            Save_Einsetllungen()
            CloseWindow(#Window_Einstellungen)
            HideWindow(#Window_0,0)
            Break
          EndIf
        EndIf
        
      ForEver
    EndIf
  EndIf
EndProcedure

NewList eMails.s()  

Procedure Send(File.s)
  
  Load_Einstellungen()
  ClearList(eMails())
  
  ;Email Adressen öffnen
  OpenFile(0,File)
  While ~Eof(0) 
    AddElement(eMails())
    eMails() = ReadString()
  Wend 
  CloseFile(0)
  
  HideWindow(#Window_0,1)
  
  If OpenWindow(#Window_Wait,330,148,150,67,#PB_Window_ScreenCentered,"Emails werden verschickt")
    If CreateGadgetList(WindowID())
      TextGadget(#PrText,10,10,130,12,"x/x",#PB_Text_Center)
      ProgressBarGadget(#Progressbar,10,27,130,30,0,CountList(eMails()),#PB_ProgressBar_Smooth)
      SetGadgetState(#Progressbar,0)
    EndIf
  EndIf
  
  ForEach eMails()
    SetGadgetState(#Progressbar,ListIndex(eMails())+1)
    SetGadgetText(#PrText,Str(ListIndex(eMails())+1) + "/" + Str(CountList(eMails())))
    Email\MailTo = eMails()
    SendMail("log.txt")
    ForEach LogBuffer()
      PrintN(LogBuffer())
    Next 
    
    anfang = GetTickCount_()
    Repeat
      Delay(5)
      WindowEvent()
    Until (GetTickCount_() - anfang) > 1000 * Delay
    
  Next
  
  CloseWindow(#Window_Wait)
  HideWindow(#Window_0,0)
  MessageRequester("Fertig!","Alle Emails wurden versandt.")
  
EndProcedure
  

If OpenWindow(#Window_0, 330, 148, 239, 308,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "E-Mail Verteiler")
  If CreateGadgetList(WindowID())
    StringGadget(#String_EmailListe, 10, 30, 160, 20, "")
    TextGadget(#Text_10, 10, 10, 60, 20, "Email Liste")
    ButtonGadget(#Button_Suchen, 180, 30, 50, 20, "Suchen")
    TextGadget(#Text_15, 10, 60, 60, 20, "Betreff")
    StringGadget(#String_Betreff, 10, 80, 220, 20, "")
    TextGadget(#Text_17, 10, 110, 60, 20, "Text")
    EditorGadget(#Editor_Text, 10, 130, 220, 140)
    ButtonGadget(#Button_Senden, 160, 280, 70, 20, "Senden")
    ButtonGadget(#Button_Einstellungen,10,280,70,20,"Einstellungen")
  EndIf
  
Else
  End
EndIf

OpenConsole()

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_EventCloseWindow
    If EventWindowID() = #Window_0 : End : EndIf
  EndIf
  
  If Event = #PB_EventGadget
    
    ;Debug "WindowID: " + Str(EventWindowID())
    
    GadgetID = EventGadgetID()
     
    If GadgetID = #Button_Suchen
      File.s = OpenFileRequester("E-Mail Verteilerliste","","",0)
      SetGadgetText(#String_EmailListe,File)
      
    ElseIf GadgetID = #Button_Senden
      Send(File)
    ElseIf GadgetID = #Button_Einstellungen
      Open_Window_Einstellungen()
    ElseIf GadgetID = #String_Betreff
      Email\Subject = GetGadgetText(#String_Betreff)
    ElseIf GadgetID = #Editor_Text
      Email\MsgBody = GetGadgetText(#Editor_Text)
      
    EndIf
    
  EndIf
  
ForEver

CloseConsole()

End
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Habs zwar noch nicht probiert :oops: (bin @ school), aber die Idee ist schon mal nicht schlecht! :allright: Wär was für das nächste CodeArchiv... (ANDRÉ, WIR WARTEN!) :wink:

cya
Pascal
Caliban
Beiträge: 41
Registriert: 08.09.2004 08:46

Beitrag von Caliban »

Danke für die Antwort. :D

Heute wird das Programm seiner Bestimmung übergeben, und es wird hoffentlich Problemlos ca. 1000 Mails versenden.
Antworten