Avatar billede sm00king Nybegynder
05. juni 2004 - 03:32 Der er 27 kommentarer og
1 løsning

Mail-server

er ved at lave et program der kan sende simple mails.
Problemet er bare at det bliver noget lort når man bruger SMTP da nogle ikke tillader og sende mails osv.

Hvordan benytter man sin egen mailserver til at sende med?
kort sagt:
Nogle der har et fuldt virkende eksempel på hvordan man kan sende en enkelt mail fra C++ (uden brug af DLL, SMTP og andet tilbehør, hvor programmet selv finder DNS osv.)

BTW: bruger Borland compiler
Avatar billede titad Nybegynder
05. juni 2004 - 04:25 #1
nu har jeg ikke forstand på c++ men måske en funktion der fungere som formmail?
Avatar billede sm00king Nybegynder
05. juni 2004 - 11:15 #2
Jeg tror det ikke. har ihvertfald ikke set den form for funktion nogle steder.
Der findes en masse dll'er osv. på nettet der kan gøre det, men vil jo gerne holde mit program så clean og så enkelt som muligt.
Avatar billede arne_v Ekspert
05. juni 2004 - 13:33 #3
Jeg har nogle gange postet et eksempel som sender email via en socket forbindelse
til en mailserver.

Det kan køre på enhver Windows PC uden at installere noget.

Det kræver stadig en mailserver at connecte til. At lave en hel mail server
med MX record lookup etc. er ikke helt simpelt.
Avatar billede sm00king Nybegynder
05. juni 2004 - 15:22 #4
men hvilken mailserver sender gratis mail hvor du ikke behøver at logge ind,
altså bare:
from:
to:
subject:
Text:
Avatar billede arne_v Ekspert
05. juni 2004 - 15:33 #5
Der hvor man har ens internet forbindelse.

De fleste programmer enten beder folk konfigurere det manuelt eller snuser
lidt i opsætningen af gængse email programmer.
Avatar billede sm00king Nybegynder
05. juni 2004 - 15:47 #6
problemet er bare at man jo tager programmet med sig og så skal man til at sætte op alt efter deres forbindelse..
Findes der en smtp server der virker på alle forbindelser?

Findes der eller kan du lave et eksempel på MX lookup?
der må da være lavet nogle includes filer som folk kan bruge til det rundt omkring (kan bare ikke finde dem :P )

Vil virkelig gerne have et eksempel på at sende mail som en mail-server (og skal nok spytte flere points i det hvis det er, men det er jo somregl ikke points folk er her efter :) )
Avatar billede arne_v Ekspert
05. juni 2004 - 15:49 #7
Nej der findes ikke en SMTP server som kan bruges af alle.

Håber jeg ihvertfald ikke. Det ville jo være spammernes ønskedrøm.
Avatar billede sm00king Nybegynder
05. juni 2004 - 15:51 #8
Det har du jo ret i men nu om dage finder, spammere finder vel bare et par zombies til at sende email for dem..

Findes der slet ikke nogle kildekoder til mailservers?
Avatar billede arne_v Ekspert
05. juni 2004 - 15:53 #9
Selvfølgelig gør der det.

Jeg kan også godt prøve at finde noget.
Avatar billede sm00king Nybegynder
05. juni 2004 - 15:56 #10
Det må du meget gerne, nu har jeg ledt i oseaner af tid men er stadig ny i C++ området :D

Bruger bare ikke MFC at du ved det :)
programmet er lavet til DOS men mangler ligesom den funktion der hedder:

bool SendMail(char *Fra, char *Til, char*subject, char *Tekst);
Avatar billede arne_v Ekspert
05. juni 2004 - 20:35 #11
http://www.codeproject.com/internet/dnsquery.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dns/dns/dnsquery.asp

Eksemplet er vist enten MFC eller ihvertfald MFC style.

Men selve kaldet er ikke MFC.

Skal jeg prøve at lave et eksempel med den ?
Avatar billede arne_v Ekspert
05. juni 2004 - 22:37 #12
Eksempel på MX record lookup:

#include <windows.h>
#include <windns.h>

#include <iostream>

using namespace std;

int main()
{
    char *emaildomain = "microsoft.com";
    DNS_RECORD *rs = NULL;
    DNS_STATUS status = DnsQuery(emaildomain,DNS_TYPE_MX,DNS_QUERY_STANDARD,NULL,&rs, NULL);
    if(status == ERROR_SUCCESS)
    {
        DNS_RECORD *curr = rs;
        while(curr!=NULL)
        {
            if(curr->wType == DNS_TYPE_MX)
            {
                cout << curr->Data.MX.pNameExchange << " " << curr->Data.MX.wPreference << endl;
            }
            curr = curr->pNext;
        }
    }
    else
    {
        LPTSTR errstr;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,status,0,(LPTSTR)&errstr,0,NULL);
        cout << errstr << endl;
    }
    DnsRecordListFree(rs,DnsFreeRecordList);
    return 0;
}
Avatar billede arne_v Ekspert
05. juni 2004 - 22:38 #13
DNSAPI kræver at du installerer Platform SDK (kan downloades gratis fra Microsoft)
Avatar billede sm00king Nybegynder
06. juni 2004 - 03:49 #14
Koden ser jo lovende ud :) Er nok den sidste brik jeg mangler for at kunne gøre puslespillet færdig :D

Har bare et problem: fandt 1000x Platform SDK med hver deres emne men fandt ingen med noget omkring DNS.
Kan du give et link?
Avatar billede arne_v Ekspert
06. juni 2004 - 09:49 #15
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

Det er Core SDK du skal bruge.

Og siden virker kun i MSIE ...

:-(
Avatar billede sm00king Nybegynder
06. juni 2004 - 16:42 #16
Nu har jeg fået det installeret og fået lagt filerne rigtigt.. har bare et problem når jeg compiler.. se følgende:

C:\Borland\Bin>bcc32 mslookup.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
mslookup.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external 'DnsQuery_A' referenced from C:\BORLAND\BIN\MSLOOKUP.
OBJ
Error: Unresolved external 'DnsRecordListFree' referenced from C:\BORLAND\BIN\MS
LOOKUP.OBJ
Avatar billede arne_v Ekspert
06. juni 2004 - 17:12 #17
Du skal linke med dnsapi.lib

Og så skal du nok have konverteret dnsapi.lib fra COF til OMF
Avatar billede arne_v Ekspert
06. juni 2004 - 17:17 #18
coff2omf \psdketellerandet\dnsapi.lib \etandetsted\dnsapi.lib
bcc32 mslookup.cpp \etandetsted\dnsapi.lib
Avatar billede sm00king Nybegynder
06. juni 2004 - 17:57 #19
C:\Borland\Bin>bcc32 mslookup.cpp dnsapi.lib
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
mslookup.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 'C:\BORLAND\LIB\DNSAPI.LIB' contains invalid OMF record, type 0x21 (possi
bly COFF)

C:\Borland\Bin>
Avatar billede arne_v Ekspert
06. juni 2004 - 18:22 #20
Som jeg skrev skal du konvertere først.
Avatar billede sm00king Nybegynder
06. juni 2004 - 18:56 #21
Doh :) Jamen nu virker det sq. Så kan jeg endelig sende mails :P Takker :D
Avatar billede arne_v Ekspert
06. juni 2004 - 19:10 #22
Du skal jo så også lige have SMTP til at virke ...
Avatar billede sm00king Nybegynder
06. juni 2004 - 22:10 #23
Det er selvfølgelig rigtigt men det har jeg haft rodet med før så det tror jeg ikke bliver så stort et problem.
Men hvad betyder tallet til sidst? altså det der kan være fx: 1, 5,10,20,30
Avatar billede arne_v Ekspert
06. juni 2004 - 22:18 #24
Du mener preference ?

Spille reglerne for email er at du laver et opslag af MX records, så forsøger
du først med den server med lavest preference, derefter med den næstlaveste etc..
Avatar billede sm00king Nybegynder
06. juni 2004 - 22:27 #25
Iorden der :)

citat: "Jeg har nogle gange postet et eksempel som sender email via en socket forbindelse
til en mailserver"
gider du at gi et link til det eksempel ? :P (Det er jo dumt at bruge lang tid på at lave noget 2 gange :D)
Avatar billede arne_v Ekspert
06. juni 2004 - 22:29 #26
#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 arne_v Ekspert
06. juni 2004 - 22:33 #27
Koden tester ikke for svaret for mail serveren. Det bør nok tilføjes.
Avatar billede sm00king Nybegynder
06. juni 2004 - 22:44 #28
Ja men nu har jeg da ihvertfald noget at gå efter :)
Burde nok kunne bixe noget sammen nu :P
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis