Avatar billede web-geek Nybegynder
02. oktober 2004 - 02:16 Der er 17 kommentarer

Mailform i C++

Hvordan laver jeg en slags "mail form" i c++ sådan hvis man skriver: i brugernavn og kode så sender den til min e-mail.?
Avatar billede jakobdo Ekspert
02. oktober 2004 - 09:56 #1
Hvilken Miljø koder du i?

F.eks. Borland Builder har en smtp-komponent.

Ellers er det at lave en socket forbindelse til en mailserver på port 25, udføre diverse smtp-kommandoer og det er det...

Det kan laves med grafisk brugergrænseflade eller blot i console.
Avatar billede arne_v Ekspert
02. oktober 2004 - 11:58 #2
Eksempel på det sidste:

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

#include <windows.h>
#include <errno.h>

void mailsend(char *hostname,char *to,char * from,char *subj,char *body)
{
  int sd,status,tmp;
  char *buf,ownhost[100];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* lookup host */
  hostinfo=gethostbyname(hostname);
  if(!hostinfo) {
      printf("Error looking up host: %s\n",hostname);
      goto fin;
  }
  /* connect to host */
  remote.sa_family=hostinfo->h_addrtype;
  memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
  *((short *)remote.sa_data)=25;
  tmp=remote.sa_data[0];
  remote.sa_data[0]=remote.sa_data[1];
  remote.sa_data[1]=tmp;
  status=connect(sd,&remote,sizeof(remote));
  if(status!=0) {
      printf("Error connecting to host: %s port: %d\n",hostname,25);
      goto fin;
  }
  /* send email */
  gethostname(ownhost,sizeof(ownhost));
  buf = malloc(2000+strlen(body));
  sprintf(buf,"HELO %s\r\n"
              "MAIL FROM: <%s>\r\n"
              "RCPT TO: <%s>\r\n"
              "DATA\r\n"
              "Return-Path: <%s>\r\n"
              "From: %s\r\n"
              "To: %s\r\n"
              "Subject: %s\r\n"
              "MIME-version: 1.0\r\n"
              "Content-type: text/html; Charset=iso-8859-1\r\n"
              "\r\n"
              "%s\r\n"
              ".\r\n"
              "QUIT\r\n",ownhost,from,to,from,from,to,subj,body);
  status=send(sd,buf,strlen(buf),0);
  if(status<0) {
      printf("Error sending GET request\n");
      goto fin;
  }
  free(buf);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  mailsend("minmailserver", "dig@ditdomain.dk", "mig@mitdomain.dk", "Dette er en test", "<a href='http://www.eksperten.dk/'>E</a>");
  WSACleanup();
  return 0;
}
Avatar billede jakobdo Ekspert
02. oktober 2004 - 12:47 #3
Hej Arne,
skulle lige teste din kode...
Jeg får fejl i linie: buf = malloc(2000+strlen(body));

Fejlen:
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
email.cpp:
Error E2034 email.cpp 49: Cannot convert 'void *' to 'char *' in function mailse
nd(char *,char *,char *,char *,char *)
Warning W8057 email.cpp 82: Parameter 'argc' is never used in function main(int,
char * *)
Warning W8057 email.cpp 82: Parameter 'argv' is never used in function main(int,
char * *)
*** 1 errors in Compile ***
Avatar billede jakobdo Ekspert
02. oktober 2004 - 12:48 #4
Men det kunne så igen let løses med:

buf = (char*)malloc(2000+strlen(body));
Avatar billede arne_v Ekspert
02. oktober 2004 - 13:00 #5
Den stump kode er skrevet for mange år siden med ikke helt så skrappe
compilere og så har jeg bare copy pastet den videre.
Avatar billede web-geek Nybegynder
05. oktober 2004 - 20:56 #6
Koden virker ikke arne
Avatar billede arne_v Ekspert
05. oktober 2004 - 20:58 #7
Den er set virke mange gange
Avatar billede web-geek Nybegynder
05. oktober 2004 - 20:59 #8
Her virker den ikke.

den siger fejl:

  buf = malloc(2000+strlen(body));
Avatar billede web-geek Nybegynder
05. oktober 2004 - 21:00 #9
og det er i Dev-C++
Avatar billede arne_v Ekspert
05. oktober 2004 - 21:03 #10
Den har jakob jo allerede skrevet løsningen på.

02/10-2004 12:48:35
Avatar billede web-geek Nybegynder
05. oktober 2004 - 21:07 #11
Den siger alt muligt underligt med feks:

[Linker error] undefined reference to `socket@12'
[Linker error] undefined reference to `bind@12'
[Linker error] undefined reference to `gethostbyname@4'
[Linker error] undefined reference to `connect@12'
[Linker error] undefined reference to `gethostname@8'
[Linker error] undefined reference to `send@16'
[Linker error] undefined reference to `closesocket@4'
[Linker error] undefined reference to `WSAStartup@8'
[Linker error] undefined reference to `Cleanup@0'
Avatar billede web-geek Nybegynder
05. oktober 2004 - 21:08 #12
Det skal være sådan den sender koden og brugernavnet til den email som serveren er lagt til, feks. jeg har webgeek@webgeek.dk
så skriver man:
brugernavn: webgeek
kode: test
også bliver koden og brugernavnet send til webgeek@webgeek.dk
fra navnet "webgeek" af.
Avatar billede arne_v Ekspert
05. oktober 2004 - 21:10 #13
De fejl fjerner du ved at tilføje -lws2_32 til link options
Avatar billede arne_v Ekspert
05. oktober 2004 - 21:12 #14
Jeg aner ikke noget om C++Builder forms men jeg antager at det
ikke er så svært at kalde mailsend fra din form.
Avatar billede jakobdo Ekspert
06. oktober 2004 - 08:28 #15
Hov Arne_V, hvorfor snakker du Builder?
Tror nok web-geek bruger: Dev-C++!
Avatar billede arne_v Ekspert
06. oktober 2004 - 09:32 #16
Jeg har lige nærlæst indlægene igen. Det er dig som bruger builder ikke
web-geek. Jeg har fået tingene rodet lidt sammen. Sorry.

Men det gør det jo noget mere besværligt. At lave en form i dev-cpp
via Win32 API er ikke bare noget man lige drop and drag'er.
Avatar billede arne_v Ekspert
24. oktober 2004 - 21:46 #17
OK ?
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