how to send email with c++, need working example

Good day everyone,

Pls I need a working example of how to send email with c++ via Visual Studio, I don't seem to see any good example as most are either in c# or some other funny language.
Pls help.
It needs some cleanup and there may be some errors that were introduced while I was anonymizing it, but it works for plain text on a server that does not require authentication. Also remember to swap out the server + user names:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#ifndef SENDMAIL_H_INCLUDED
#define SENDMAIL_H_INCLUDED

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <string>

#include <windows.h>
#include <winbase.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <winreg.h>



bool SendMail(std::string FromAddr, std::string Subject, std::string File)
{
   int iProtocolPort = 0;

   char SMTPServerName[] = "mail.server.com";///Mail Server Name
   char ToAddr[] =         "user.name@server.com";///Mail To Address
   char Buffer[4096];
   char Line[255];
   char MsgLine[255];

   SOCKET      Server;
   WSADATA     wsaData;
   LPHOSTENT   lpHostEntry;
   LPSERVENT   lpServEntry;
   SOCKADDR_IN SockAddr;

   std::ifstream MsgFile(File.c_str());

   if(WSAStartup(MAKEWORD(1, 1), &wsaData))
   {
      std::cout << "FAILED TO START WSA\n";

      return false;
   }

   lpHostEntry = gethostbyname(SMTPServerName);
   if(!lpHostEntry)
   {
      std::cout << "Could Not Reach Host: " << SMTPServerName << " " << WSAGetLastError() << std::endl;
      return false;
   }

   Server = socket(PF_INET, SOCK_STREAM, 0);
   if(!Server == INVALID_SOCKET)
   {
      std::cout << "Cannot Open Mail Server Socket: " << WSAGetLastError();
      return false;
   }

   lpServEntry = getservbyname("mail", 0);
   if(!lpServEntry)
   {
      iProtocolPort = htons(IPPORT_SMTP);
   }
   else
   {
      iProtocolPort = lpServEntry->s_port;
   }

   SockAddr.sin_family = AF_INET;
   SockAddr.sin_port   = iProtocolPort;
   SockAddr.sin_addr   = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

   if(connect(Server, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
   {
       std::cout << "Error Connecting To Server Socket: " << WSAGetLastError();
       return false;
   }

   try
   {

        recv(Server, Buffer, sizeof(Buffer), 0);///Response From Server Should Be 220 'OK'
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "SERVER NOT READY:%s", Buffer);
                throw Buffer;
            }

        sprintf(MsgLine, "HELO %s%s", SMTPServerName, CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "%s:%s", MsgLine, Buffer);
                throw MsgLine;
            }


        sprintf(MsgLine, "MAIL FROM: %s%s", FromAddr.c_str(), CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "%s:%s", MsgLine, Buffer);
                throw MsgLine;
            }

        sprintf(MsgLine, "RCPT TO: %s%s", ToAddr, CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "%s:%s", MsgLine, Buffer);
                throw MsgLine;
            }

        sprintf(MsgLine, "VRFY %s%s", ToAddr, CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "%s:%s", MsgLine, Buffer);
                throw MsgLine;
            }

        sprintf(MsgLine, "DATA%s", CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);///Mail Server Responds With Code: 354 Telling The Client To End 'DATA' Section With A '.'

        sprintf(MsgLine, "Subject: %s%s", Subject.c_str(), CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0); ///The Mail Server Does Not Respond After DATA Is Sent Until It Sees '.' So No 'recv()'


        MsgFile.getline(Line, sizeof(Line));

        do
        {
            sprintf(MsgLine, "%s%s", Line, CRLF);
            send(Server, MsgLine, strlen(MsgLine), 0);
            MsgFile.getline(Line, sizeof(Line));

        }while(MsgFile.good());

        sprintf(MsgLine, "%s.%s", CRLF, CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                throw Buffer;
            }

        sprintf(MsgLine, "QUIT%s", CRLF);
        send(Server, MsgLine, strlen(MsgLine), 0);
        recv(Server, Buffer, sizeof(Buffer), 0);
            if(Buffer[0] != '2')
            {
                sprintf(MsgLine, "%s:%s", MsgLine, Buffer);
                throw MsgLine;
            }

        std::cout << "Message Sent\n";
   }
   catch(char* Error)
   {
       std::cout << "\nEXCEPTION CAUGHT!\n";
       std::cout << "Server Reply: " << Error << std::endl;

       sprintf(MsgLine, "RSET%s", CRLF);
       send(Server, MsgLine, strlen(MsgLine), 0);
       recv(Server, Buffer, sizeof(Buffer), 0);

       sprintf(MsgLine, "QUIT%s", CRLF);
       send(Server, MsgLine, strlen(MsgLine), 0);
   }

   shutdown(Server, SD_BOTH);
   closesocket(Server);
   WSACleanup();

   return true;
}


#endif // SENDMAIL_H_INCLUDED 
Last edited on
Topic archived. No new replies allowed.