sexta-feira, 6 de fevereiro de 2009

Código de como enviar e-mail pelo c++

Olá pessoal,

Demorei, mas postei o código de uma função de como enviar e-mail utilizando o c++.

Nesta função deixei o remetente como constante e a passagem da mensagem e do destinatário como parâmetro. A função pode ser mudada para passagem de parâmetro do remetente também. Não tive essa necessidade, mas pode ser que alguém tenha.

Espero que tenha ajudado vocês.

Até a próxima dica.


void CSIOAVISODlg::email(CString StrAvisoProblema, LPCTSTR to)
//Primeiro parâmetro é a mensagem a ser enviada e o segundo é o destinatário
{

int iProtocolPort = 0;
char szSmtpServerName[64] = "";
char szToAddr[64] = "";
char szFromAddr[64] = "";
char szBuffer[8192] = "";
char szLine[255] = "";
char szMsgLine[8192] = "";
char szSubject[255] = "";
char szMsg[16384] = "";

SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
LPSERVENT lpServEntry;
SOCKADDR_IN SockAddr;

// Convert to a char*
const size_t newsize = 16384;
char nstring[newsize];
strcpy(nstring, StrAvisoProblema);
// strcat(nstring, " (char *)");

lstrcpy(szSmtpServerName, "10.153.205.21"); //Servidor SMTP
lstrcpy(szToAddr, to); //Destinatário
lstrcpy(szFromAddr, "teste@teste.com.br"); //Remetente
lstrcpy(szSubject, "código fonte email - Carlos Augusto"); //Assunto

// Attempt to intialize WinSock (1.1 or later)
if(WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData))
{
//cout << "Cannot find Winsock v" << VERSION_MAJOR << "." << VERSION_MINOR << " or later!" << endl;

// return 1;
}

// Lookup email server's IP address.
lpHostEntry = gethostbyname(szSmtpServerName);
if(!lpHostEntry)
{
// cout << "Cannot find SMTP mail server " << szSmtpServerName << endl;
// return 1;
}

// Create a TCP/IP socket, no specific protocol
hServer = socket(PF_INET, SOCK_STREAM, 0);
if(hServer == INVALID_SOCKET)
{
// cout << "Cannot open mail server socket" << endl;
// return 1;
}

// Get the mail service port
lpServEntry = getservbyname("mail", 0);

// Use the SMTP default port if no other port is specified
if(!lpServEntry)
iProtocolPort = htons(IPPORT_SMTP);
else
iProtocolPort = lpServEntry->s_port;

// Setup a Socket Address structure
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = iProtocolPort;
SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

// Connect the Socket
if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
{
// cout << "Error connecting to Server socket" << endl;

// return 1;
}

// Receive initial response from SMTP server
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");

//Aqui já entra o código baseado no post anterior sobre como enviar email usando telnet

// Send HELO server.com
sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO");

// Send MAIL FROM:
sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM");

// Send RCPT TO:
sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO");

// Send DATA
sprintf(szMsgLine, "DATA%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA");

sprintf(szMsgLine, "FROM: %s%sSUBJECT: %s%s%s%s%s", szFromAddr, CRLF, szSubject, CRLF, CRLF, nstring, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");

// Send blank line and a period
sprintf(szMsgLine, "%s.%s", CRLF, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message");

// Send QUIT
sprintf(szMsgLine, "QUIT%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT");

// Close server socket and prepare to exit.
closesocket(hServer);

WSACleanup();

}

//fim da função de enviar email

//para executar basta chamá-la dessa forma
// email(Str, "augustoffilho@gmail.com");
//Primeiro a variável contendo a mensagem que deve ser do tipo CString
// e depois o destinatário

// quando copiarem o código cuidado com as quebras de linhas que não
// ficou muito bom aqui no blog

2 comentários:

  1. Olá, eu estou escrevendo uma função em C++ pra mandar e-mail's, vi a sua e me interessei, porém vc não mostra quais bibliotecas usa, e tem a tal função Check que não sei de onde vem...

    Poderia explicar melhor seu código?

    Se fizesse isso ficaria mto grato.

    ps. claro que não pretendo copiar seu código, só queria entende-lo.

    ResponderExcluir
  2. As bibliotecas que utilizei são essas:
    #include <windows.h>
    #include <winsock2.h>

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <wchar.h>

    A função Check() verifica se teve algum erro no envio ou recebimento dos comandos. (send recv)

    Espero que tenha ajudado.
    Abraço.

    ResponderExcluir

Obrigado pela participação. Continue visitando Dúvidas de Programação - Programming Doubts

Links

Related Posts with Thumbnails