Enviar e-mail com C++
estou a trabalhar num projecto em C++, que inclui uma funcionalidade de enviar informação para alguém como 'anexo de E-mail'.
Está tudo feito excepto esta coisa do "E-mail". Não sei como tornar este programa capaz de enviar um e-mail sem usar qualquer cliente de E-mail ou abrir um navegador. Eu procurei muito na internet, mas não consegui encontrar qualquer coisa de trabalho (eu não tenho nenhum conhecimento desocket
, Winsock
, etc).
5 answers
Não tenho a certeza se concordo com o que está a fazer ao espiar os utilizadores sobre o que eles fazem, mas independentemente disso, aqui está algum código C++ útil para enviar e-mails:
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <iostream.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
// Insist on at least Winsock v1.1
const VERSION_MAJOR = 1;
const VERSION_MINOR = 1;
#define CRLF "\r\n" // carriage-return/line feed pair
void ShowUsage(void)
{
cout << "Usage: SENDMAIL mailserv to_addr from_addr messagefile" << endl
<< "Example: SENDMAIL smtp.myisp.com [email protected] [email protected] message.txt" << endl;
exit(1);
}
// Basic error checking for send() and recv() functions
void Check(int iStatus, char *szFunction)
{
if((iStatus != SOCKET_ERROR) && (iStatus))
return;
cerr << "Error during call to " << szFunction << ": " << iStatus << " - " << GetLastError() << endl;
}
int main(int argc, char *argv[])
{
int iProtocolPort = 0;
char szSmtpServerName[64] = "";
char szToAddr[64] = "";
char szFromAddr[64] = "";
char szBuffer[4096] = "";
char szLine[255] = "";
char szMsgLine[255] = "";
SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
LPSERVENT lpServEntry;
SOCKADDR_IN SockAddr;
// Check for four command-line args
if(argc != 5)
ShowUsage();
// Load command-line args
lstrcpy(szSmtpServerName, argv[1]);
lstrcpy(szToAddr, argv[2]);
lstrcpy(szFromAddr, argv[3]);
// Create input stream for reading email message file
ifstream MsgFile(argv[4]);
// 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");
// 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: <[email protected]>
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: <[email protected]>
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");
// Send all lines of message body (using supplied text file)
MsgFile.getline(szLine, sizeof(szLine)); // Get first line
do // for each line of message text...
{
sprintf(szMsgLine, "%s%s", szLine, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() message-line");
MsgFile.getline(szLine, sizeof(szLine)); // get next line.
} while(MsgFile.good());
// 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");
// Report message has been sent
cout << "Sent " << argv[4] << " as email message to " << szToAddr << endl;
// Close server socket and prepare to exit.
closesocket(hServer);
WSACleanup();
return 0;
}
Muitos links na internet para um problema semelhante, encontrei isto:
parabéns por tentares codificá-lo. Isto eleva-te acima da média do script kiddy.
Mas envergonhe-se de espiar o seu irmão. O negócio privado dele é dele e não teu.
Além disso, se o teu irmão for um pouco esperto, não se vai apaixonar por um anexo de E-mail executável. Além disso, a maioria dos programas de E-mail e webmailers vai avisar contra a execução desta coisa. Se tornasses isto infalível, terias de O encontrar. vulnerabilidades no(S) cliente (s) de E-mail usado (S), para injectar código, a melhor maneira de IR é atacar o carregador de imagem e rotinas de compressão, mas você terá que encontrar um 0-dia idealmente, caso contrário essas façanhas podem ter sido corrigidas antes de você obter o seu spyware para fora. Alguns tópicos que você pode querer ler são- stack overflow exploits
- heap pulverization
- programação baseada no retorno (usada para combater a protecção W^X e implementações ligeiras do espaço de endereços randomization)
O envio de E-mail resume-se para implementar o protocolo SMTP documentado em http://www.faqs.org/rfcs/rfc821.html
Tecnicamente, pode-se enviar um e-mail directamente para um servidor de destino, mas estes normalmente rejeitam os e-mails que vêm directamente das ligações de ligação, uma vez que este é um método barato mas eficaz para combater o spam. Então é melhor reveres um MTA com registos MX adequados. Freemailers são seus amigos, Hotmail é muito popular para isso. Como queiras. tem que implementar SMTP-Auth, então, também. Documentado em http://www.faqs.org/rfcs/rfc2554.html
É claro que em vez de enviar um e-mail, pode enviar um ficheiro para algum lado. Ou você pode implementar IMAP e usar um freemailer capaz de IMAP para armazenar os dados no diretório IMAP rascunhos. Por isso, se conseguires fazer isto sozinho, com o teu próprio código, acho que mereces o sucesso, mas só se isto não envolver bibliotecas de malware de terceiros. kits de construção (sim, existem).Uma solução de trabalho para enviar e-mail usando cURL
Download cURL {[[14]} de Aqui, e extrair. Agora, execute o executável a partir do código C++ usando WinExec()
a partir de windows.h
.
#include <windows.h>
int main(void){
char* command = "curl smtp://smtp.gmail.com:587 -v --mail-from \"[email protected]\" --mail-rcpt \"[email protected]\" --ssl -u [email protected]:PASSWORD -T \"ATTACHMENT.FILE\" -k --anyauth";
WinExec(command, SW_HIDE);
return 0;
}
Local curva.exe na mesma pasta. Indique o seu endereço de E-mail e a sua senha no command
. Aqui, a mensagem é gravada em um arquivo de texto (anexo.ARQUIVO).
Atenção: O command
pode não suporta alguns caracteres especiais (como o- &
).
TIdSMTP *IdSMTP1 = new TIdSMTP(this);
IdSMTP1->Host = "myhost";
IdSMTP1->Port = 25;
TIdMessage *MSG = new TIdMessage(this);
MSG->Clear();
MSG->From->Address = "[email protected]";
MSG->From->Name = "Someone";
MSG->Subject = "Spy Email";
MSG->Recipients->EMailAddresses = "[email protected]";
MSG->Body->Text = "your being watched ";
IdSMTP1->Connect();
IdSMTP1->Send(MSG);
IdSMTP1->Disconnect(true);
delete MSG;
delete IdSMTP1;
E vem instalado com construtor agora