Отправить электронную почту с помощью С++

Я работаю над проектом на С++, который включает в себя функцию отправки информации кому-то как "вложение электронной почты".

Все сделано, за исключением этой "электронной почты". Я не знаю, как заставить эту программу отправлять электронную почту без использования почтового клиента или открытия браузера. Я много искал по Интернету, но не мог найти никакой рабочей вещи (я не знаю никаких socket, Winsock и т.д.).

Ответы

Ответ 1

Я не уверен, что согласен с тем, что вы делаете, следя за пользователями за тем, что они делают, но независимо от того, какой код С++ полезен для отправки электронных писем:

#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 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;
}

много ссылок в Интернете для аналогичной проблемы, я нашел это:

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/12345906-8a17-41c2-846f-fd3e1a135238/

Ответ 2

Престижность к вам за то, что вы пытаетесь сами ее закодировать. Это поднимает вас выше среднего script kiddy.

Но позорьтесь на шпионаже на своего брата. Его частный бизнес - это бизнес, и никто из вас.

Кроме того, если ваш брат немного умнее, он не попадет в какое-либо исполняемое приложение электронной почты. Кроме того, большинство почтовых программ и веб-мастеров будут предупреждать об этом. Если вам нужно сделать это без защиты, вам нужно будет найти уязвимости в используемом почтовом клиенте (-ах), чтобы ввести код, лучший способ пойти - атаковать загрузчик изображений и процедуры сжатия, но вам нужно будет найти идеальный вариант, в противном случае эти эксплойты могут быть исправлены до того, как вы вытащите шпионское ПО. Некоторые темы, которые вы можете прочитать, - это

  • эксплойты
  • распыление кучи
  • программирование на основе возврата (используется для защиты W ^ X и мягких реализаций рандомизации адресного пространства)

Отправка электронной почты сводится к реализации протокола SMTP, зарегистрированного в http://www.faqs.org/rfcs/rfc821.html

Технически можно отправить электронное письмо непосредственно на целевой сервер, но обычно они будут отклонять почту, поступающую непосредственно из коммутируемых соединений, поскольку это дешевый, но эффективный метод борьбы со спамом. Поэтому вам лучше пройти MTA с надлежащими записями MX. Freemailers - ваш друг, Hotmail очень популярен для этого. Однако вам также придется реализовать SMTP-Auth. Документировано в http://www.faqs.org/rfcs/rfc2554.html

Конечно, вместо отправки электронной почты вы могли бы просто загрузить файл где-нибудь. Или вы можете внедрить IMAP и использовать freemailer, поддерживающий IMAP, для хранения данных в каталоге IMAP Drafts.

Итак, если вам удастся это сделать самостоятельно, с собственным кодом, я думаю, что вы заслуживаете успеха, но только если это не связано с сторонними библиотеками комплектов сборки вредоносных программ (да, они существуют).

Ответ 3

Рабочее решение для отправки электронной почты с использованием cURL


Скачайте cURL отсюда и распакуйте. Теперь запустите исполняемый файл из кода C++, используя WinExec() из windows.h.

Вот демонстрация для Gmail:

#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;
}

Поместите curl.exe в тот же каталог. Введите свой адрес электронной почты и пароль в command. Здесь сообщение сохраняется в текстовом файле (ATTACHMENT.FILE).

Внимание: command может не поддерживать некоторые специальные символы (like- &).


Для более глубокого применения вы можете использовать libcurl.

Ответ 4

У indy также есть компоненты для отправки писем через SMTP

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;

и теперь он устанавливается вместе с Builder

Ответ 5

Я должен рекомендовать Fine VMime библиотеку. Это настоящая библиотека С++ и обрабатывает все сообщения электронной почты.

Мне также говорят, что cURL поддерживает SMTP.

Ответ 6

mailio - действительно хорошая и современная библиотека, написанная на C++