Avatar billede !asp Nybegynder
20. december 1999 - 21:48 Der er 20 kommentarer og
1 løsning

CGI prog der kan redirecte og sende E-mail

Jeg skal bruge et C++ CGI program der modtager 2 parametre.

Den ene som f.eks hedder Emails indeholder E-mail adresser separeret med komma.

Den anden en URL.

Det første programmet skal gøre er at redirecte browseren til URL'en.

Derefter skal programmet sende en besked til hver Email adresse.
Avatar billede !asp Nybegynder
20. december 1999 - 21:59 #1
Det skal funke på en Unix og meget gerne også på en NT.
Avatar billede bjarke Nybegynder
21. december 1999 - 08:53 #2
Hvis du selv har koden, som scriptet skal generere, så skal jeg nok bakse et lille unix-c++-script sammen til dig.

Hvis du også har en email-adresse, så kan jeg sende det til dig.

-Bjarke
Avatar billede dmk Nybegynder
21. december 1999 - 10:45 #3
Hejsa

Jeg ved ikke om du er bekendt med tcp/ip protokollen? Du kan vha. den sende mails ved at koble dig på en mailserver, og få sendt dine mails igennem den. Jeg er ikke klar over om der findes en mere simpel måde at gøre det på.
Hvis du skulle være intresseret, så kan jeg godt hjælpe dig med at skrive noget der kan sende mails via en mail-server. Men så sig lige til!

Redirect kan jeg desværre ikke hjælpe med.

DMK
Avatar billede bjarke Nybegynder
21. december 1999 - 10:56 #4
Hej !asp

Jeg har lavet et lille script, som tager inputtene. Hvis du fortæller mig hvordan koden der skal genereres ser ud, så kan jeg lige lave scriptet færdigt. Ved du i øvrigt det, eller er det en del af opgaven?

Scriptet virker lige nu, sådan at det kan tage op til 100 adresser à 30 karakterer hver. Det kan sagtens laves om. Bare fortæl hvad kravene er (om nødvendigt kan jeg lave det om til dynamisk hukommelsesallokering - det vil sige, at den tilgængelige hukommelse sætter grænsen for antallet af mulige mails).

- Bjarke
Avatar billede !asp Nybegynder
22. december 1999 - 09:40 #5
Dynamisk hukommelsesallokering vil jeg meget gerne have!

Jeg har noget kode som kan sende mail på en Unix, men ikke NT. Koden er nappet herfra : http://www.scriptcreations.com/free/quickemailer/

Det er alt hvad jeg har. Mit kendskab til C++ er meget begrænset. Jeg kan dog JavaScript og Php, så jeg er vel tæt på :)

Hvis det kan gøres via mailserver må du meget gerne hjælpe til DMK.
Avatar billede bjarke Nybegynder
22. december 1999 - 09:56 #6
Kan du selv compile koden? Så kan jeg bare sende den, og så har du den selv og kan rette den hvis du får andre behov engang. Jeg har aldrig brugt JavaScript, men jeg har set noget kode og det ligner næsten til forveksling C/C++ (i hvert fald syntaksen).
Avatar billede !asp Nybegynder
22. december 1999 - 10:02 #7
Du kan evt. poste koden her eller sende den til sproing@wanadoo.dk

Php syntaksen ligner også meget C++  :)
Avatar billede bjarke Nybegynder
22. december 1999 - 10:33 #8
Jeg skal lige se om jeg kan nå at lave det om til dynamisk allokering (+ ryddet op i koden ;-).
Avatar billede bjarke Nybegynder
22. december 1999 - 11:27 #9
Jeg ved ikke hvornår jeg får tid til at kigge på det igen, så jeg paster lige koden (med statisk hukommelsesallokering). Hvis jeg når det skal jeg kigge på det med den dynamiske i stedet. Men i mangel af bedre kan du måske bruge dette (som er lavet i største hast) og så selv rette til(?).

#include <string.h>
#include <stdio.h>

const int ANTAL = 100;
const int MAX = 30;

int main(int argc, char* argv[])
    {
    char* Liste = argv[1];
    char Adresse[ANTAL][MAX];
    int i;
    int Index = 0;
    int AdrIndex = 0;

    for(i=0;i<ANTAL;i++)
        Adresse[i][0]='\0';

    if( argc!=3 )
        {
        printf("Der var fejl i indparametrene!\n");
        printf("Indparametre skal v‘re 1) mailliste, 2) url");
        return 1;
        }

    while(*Liste!='\0')
        {
        if(*Liste==',')
            {
            Adresse[AdrIndex][Index] = '\0';
            AdrIndex++; Index=0; Liste++;
            }
        else
            {
            Adresse[AdrIndex][Index] = *Liste;
            Liste++; Index++;
            }
        }
    Adresse[AdrIndex][Index] = '\0';


    printf("\n******* OUTPUT ********\n");
    AdrIndex = 0;
    while(strlen(Adresse[AdrIndex])>1)
        {
        printf("Adresse : %s\n", Adresse[AdrIndex]);
        AdrIndex++;
        }
    printf("\nURL    : %s", argv[2]);
    return 0;
    }
Avatar billede !asp Nybegynder
22. december 1999 - 11:32 #10
Tak, så er jeg da kommet noget af vejen.
Avatar billede dmk Nybegynder
22. december 1999 - 12:10 #11
Hej !asp og Bjarke

Nu er jeg blevet lidt i tvivl om hvad det egentlig er der er brug for. Så vidt jeg kunne forstå, så vil du have en stump kode der kan redirecte en browser, samt en stump kode der kan sende emails til en række personer.
Så vidt jeg kan se, så har du nu fået noget kode fra Bjarke, som kan parse nogle inputs og lave en liste af email-adresser, men du har vel stadig ikke fået løst de to første opgaver?

Jeg kan som sagt ikke hjælpe dig med at redirecte din browser, men jeg kan muligivs godt hjælpe dig med noget der kan sende emails. Det kan gøres ved at lave en TCP/IP forbindelse til en mailserver, og bede den om at sende dine mails.

DMK
Avatar billede !asp Nybegynder
22. december 1999 - 12:28 #12
DMK: Korrekt, mit vel nok største problem er at få den til at sende en E-mail. Det må du meget gerne hjælpe med.

At få den til at redirecte kan jeg selv klare; Tror jeg :)
Avatar billede bjarke Nybegynder
22. december 1999 - 12:39 #13
Ok, indrømmet. Jeg ved ikke noget om de ting der skal udføres, men hvis det bare er output der skal genereres - nærmest lige som ASP -(altså en eller anden bestemt tekst), så kan jeg godt lave det. Men ellers kan jeg nok ikke hjælpe.

Jeg tager i øvrigt på juleferie nu, så der bliver i alle tilfælde ikke noget hjælp fra min side de første 14 dage - beklager, men dmk kan vist også alt hvad jeg kan og en del til :-)

Håber, at I finder ud af det og glædelig jul!
Avatar billede dmk Nybegynder
22. december 1999 - 13:04 #14
Hej igen

Jamen rigtig glædelig jul til dig også, Bjarke!

Jeg vil prøve at kigge lidt på det på et tidspunkt, men det er nok en lidt større opgave, så det kommer til at tage lidt tid. Men jeg skal nok vende tilbage med et-eller-andet, det lover jeg!

DMK
Avatar billede !asp Nybegynder
22. december 1999 - 13:16 #15
Det lyder super, og glædelig jul herfra :)
Avatar billede dmk Nybegynder
22. december 1999 - 15:16 #16
Hej igen

Her er noget kode, som i hvert fald virker hos mig. Der mangler måske noget bedre fejl-håndtering, og nogle bedre fejl-beskeder, men du kan da se om du kan få det her til at virke.

Enjoy!

DMK


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#include <winsock2.h>
#include <stdio.h>
#include "string.h"

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
inline bool ReturnError(char* Message);

bool DoReceive(int SocketId, char* AcceptCode);
bool DoSend(int SocketId, char* SendData);

bool DoConnect(int &SocketId, char* MailServer);
bool DoDisconnect(int SocketId);

bool DoSendMail(int SocketId, char* Receiver, char* Sender, char* Subject, char* Message);
void SendMails(char* MailServer, char* Receivers, char* Message, char* Subject, char* Sender);

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
inline bool ReturnError(char* Message)
{
  printf("%s\n", Message);
  return false;
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool DoSend(int SocketId, char* SendData)
{
  int len=strlen(SendData);
  int size=0;
  int tsize;
  while (size<len)
  {
    tsize=send(SocketId, &SendData[size],len-size,0);
    if(tsize==-1)
    return ReturnError("Error sending ");
    size=size+tsize;
  } // END while not all data send
  return true;
} // END myseend

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool DoReceive(int SocketId, char* AcceptCode)
{
  char buffer[5000];
  int l=0,t=0, CurrPos=0, ret;
  while(true)
  {
    ret=recv(SocketId, &buffer[CurrPos], 5000-CurrPos, 0); 
    if (ret<0) return ReturnError("Error receiving");
    l+=ret;
    if (buffer[l-1]!='\n')
    {
      CurrPos=l;
      continue;
    }
    while (t+3<l && memcmp(&buffer[t], AcceptCode, 3)!=0) t++;
    if (t+3<l) return true;
    return false;
  }
} // END DoReceive

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool DoConnect(int &SocketId, char* MailServer)
{
  char Buffer[5000];
  struct sockaddr_in ServerAddress;
  WORD VersionRequested;
  WSADATA SocketData;
  struct hostent *hostinfo;             
  VersionRequested = MAKEWORD(2, 2);
  if(WSAStartup(VersionRequested, &SocketData)!=0)
    return ReturnError("Unable to startup winsocket");
  memset(&ServerAddress, 0x00, sizeof(struct sockaddr_in));
  if ((SocketId= socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
  return ReturnError("Error creating socket");
  hostinfo = gethostbyname(MailServer);
  if (hostinfo==NULL)
    return ReturnError("Unable to find mailserver");
  memcpy((char *) &ServerAddress.sin_addr.s_addr, hostinfo->h_addr_list[0], hostinfo->h_length);
  ServerAddress.sin_port = htons(25);
  ServerAddress.sin_family = AF_INET;
  if (connect(SocketId, (struct sockaddr *) &ServerAddress, sizeof(ServerAddress)) == SOCKET_ERROR)
    return ReturnError("Unable to connect");
  if(!DoReceive(SocketId, "220"))
    return ReturnError("Mailserver does not allow connection");
  sprintf(Buffer, "HELO %s\r\n", hostinfo->h_name);
  if(!DoSend(SocketId, Buffer))
    return false;

  if(!DoReceive(SocketId, "250"))
    return ReturnError("Mailserver does not allow connection");
  return true;
}// END connect


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool DoDisconnect(int SocketId)
{
  if(!DoSend(SocketId, "QUIT\r\n"))
    return false;
  if(!DoReceive(SocketId, "221"))
    return ReturnError("QUIT responds not received correctly");
  if(closesocket(SocketId)==SOCKET_ERROR)
    return ReturnError("Error disconnecting");
  return true;
} // END DoDisconnect

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

bool DoSendMail(int SocketId, char* Receiver, char* Sender, char* Subject, char* Message)
{
  char Buffer[5000];

  sprintf(Buffer, "mail from:<%s>\r\n",Sender);
  if(!DoSend(SocketId, Buffer))
  return ReturnError("Error sending mail request");
  if(!DoReceive(SocketId, "250"))
  return ReturnError("Error receiving mail request");

  sprintf(Buffer, "rcpt to:<%s>\r\n",Receiver);
  if(!DoSend(SocketId, Buffer))
    return ReturnError("Error sending receiver request");
  if(!DoReceive(SocketId, "250"))
    return ReturnError("Error receiving receiver request");

  sprintf(Buffer, "data\r\n");
  if(!DoSend(SocketId, Buffer))
    return ReturnError ("Error sending data request");
  if(!DoReceive(SocketId, "354"))
    return ReturnError("Error receiving data request");

  sprintf(Buffer, "subject:%s\r\n",Subject);
  if(!DoSend(SocketId, Buffer))
    return ReturnError("Error sending subject request");

  sprintf(Buffer, "\r\n%s\r\n", Message);
  if(!DoSend(SocketId, Buffer))
    return ReturnError("Error sending end-of-message request");

  sprintf(Buffer, "\r\n.\r\n");
  if(!DoSend(SocketId, Buffer))
    return ReturnError("Error sending end-of-message request");
  if(!DoReceive(SocketId, "250"))
    return ReturnError("Error receiving end-of-message request");
  return true;
} // END DoSendMail

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void SendMails(char* MailServer, char* Receivers, char* Message, char* Subject, char* Sender)
{
  int SocketId;                           
  int CurrentIdx=0, Idx=0;
  int RecLen=strlen(Receivers);
  char* Addresses=(char*)malloc(RecLen+1);
  memcpy(Addresses, Receivers, RecLen+1);
  if (DoConnect(SocketId, MailServer))
  {
    while (true)
    {
      while (Addresses[Idx]!=0x00 && Addresses[Idx]!=',') Idx++;
      Addresses[Idx]=0x00;
      if (Idx!=CurrentIdx)
      if (!DoSendMail(SocketId, &Addresses[CurrentIdx], Sender, Subject, Message)) break;
      if (Idx==RecLen) break;
      Idx++;
      CurrentIdx=Idx;
    } // END while more addresses
  } // END if connect ok
  else printf("Unable to connect: No mails send\n");
  DoDisconnect(SocketId);
  free(Addresses);
} // END sendmails

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

int main(int ArgCount, char** Arguments)
{
  if (ArgCount!=6)
  {
    printf("Arguments for %s: \n    MailServer Receivers Sender Subject Message", Arguments[0]);
    getchar();
    return 0;
  } // END if invalid number of arguments
  char* MailServer=Arguments[1];
  char* Receivers=Arguments[2];
  char* Sender=Arguments[3];
  char* Subject=Arguments[4];
  char* Message=Arguments[5];
  SendMails(MailServer, Receivers, Message, Subject, Sender);
  return 0;
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Avatar billede dmk Nybegynder
07. januar 2000 - 10:57 #17
Hej !asp.

Hvaaaah? Er du død?

Jeg kunne da godt tænke mig at høre, om du kunne bruge det til noget? Det er ikke for at virke grådig, men jeg brugte faktisk en del tid på at lave det her, så jeg vil da gerne vide om du har fået det til at virke.

Og godt nytår i øvrigt!

DMK
Avatar billede !asp Nybegynder
07. januar 2000 - 11:02 #18
Beklager, jeg har løst det via php, men du skal da have dine point!
Avatar billede dmk Nybegynder
07. januar 2000 - 11:19 #19
Hej !ASP.

Det er jeg da både ked af og glad for at høre. Jeg er ked af at du ikke kunne bruge det jeg lavede, men selvfølgelig glad for, at du løste dit problem. Jeg kan ikke særlig meget ASP, så på den front kan jeg ikke rigtig hjælpe dig. Måske du i øvrigt skulle ændre dit handle? ;-)

DMK
Avatar billede !asp Nybegynder
07. januar 2000 - 11:39 #20
!asp læser jeg som Not Asp  :)
Jeg arbejder med Php primært, men kan også Asp.
Avatar billede dmk Nybegynder
07. januar 2000 - 11:45 #21
Ups, sorry!

Jeg læste det lige som ASP, men du skrev selvfølgelig PHP.

DMK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester