使用C++发送电子邮件

Moh*_*man 21 c++ email

我正在开发一个C++项目,其中包括将信息作为"电子邮件附件"发送给某人的功能.

除了这个'电子邮件'之外,一切都已完成.我不知道如何使该程序能够在不使用任何电子邮件客户端或打开浏览器的情况下发送电子邮件.我寻觅了很多在互联网上,但无法找到任何工作的事情(我没有任何知识socket,Winsock等等).

Dav*_*ras 23

我不确定我是否同意你在监视用户所做的事情上所做的事情,但不管这里有一些用于发送电子邮件的C++代码:

#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 rcvr@elsewhere.com my_id@mydomain.com 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: <sender@mydomain.com>
  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: <receiver@domain.com>
  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;
}
Run Code Online (Sandbox Code Playgroud)

互联网上有很多关于类似问题的链接,我发现了这个:

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


dat*_*olf 18

感谢您尝试自己编写代码.这让你高于普通的脚本小伙子.

但是在监视你的兄弟时会感到羞耻.他的私人业务是HIS业务,而不属于您.

此外,如果你的兄弟只是有点聪明,他也不会因为某些可执行的电子邮件附件而陷入困境.此外,大多数电子邮件程序和网络管理员都会警告不要执行此操作.如果你要使这个万无一失,你需要在使用的电子邮件客户端中找到漏洞,注入代码,最好的方法是攻击图像加载器和压缩例程,但你必须在理想情况下找到0day,否则,在你的间谍软件出来之前,这些漏洞可能已被修补.您可能想要阅读的一些主题是

  • 堆栈溢出漏洞利用
  • 堆喷涂
  • 基于返回的编程(用于对抗W ^ X保护和地址空间随机化的温和实现)

发送电子邮件归结为实现http://www.faqs.org/rfcs/rfc821.html中记录的SMTP协议

从技术上讲,人们可以直接向目标服务器发送电子邮件,但这些邮件通常会拒绝直接来自拨号连接的邮件,因为这是一种廉价但有效的方法来抵制垃圾邮件.因此,您最好使用适当的MX记录查看MTA.Freemailers是你的朋友,Hotmail非常受欢迎.但是,您也必须实现SMTP-Auth.记录在http://www.faqs.org/rfcs/rfc2554.html

当然,您可以在某处上传文件,而不是发送电子邮件.或者您可以实现IMAP并使用支持IMAP的freemailer将数据存储在IMAP草稿目录中.

因此,如果您设法使用自己的代码自行解决这个问题,那么我认为您应该获得成功,但前提是这不涉及恶意软件构建工具包的第三方库(是的,它们存在).


Min*_*mal 9

使用cURL发送电子邮件的工作解决方案


这里下载cURL,然后解压缩.现在,使用from 从C++代码运行可执行文件.WinExec()windows.h

以下是Gmail演示:

#include <windows.h>

int main(void){
    char* command = "curl smtp://smtp.gmail.com:587 -v --mail-from \"SENDER.EMAIL@gmail.com\" --mail-rcpt \"RECEIVER.EMAIL@gmail.com\" --ssl -u SENDER.EMAIL@gmail.com:PASSWORD -T \"ATTACHMENT.FILE\" -k --anyauth";
    WinExec(command, SW_HIDE);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

curl.exe放在同一目录中.在中输入您的电子邮件地址和密码command.这里,消息保存在文本文件(ATTACHMENT.FILE)中.

注意:command可能不支持一些特殊字符(喜欢- &).


对于更深入的应用程序,您可以使用libcurl.

  • cURL作为lib存在:libCurl.并且还有一个CPP包装curlpp. (3认同)

Sha*_*776 5

indy还具有通过SMTP发送电子邮件的组件

TIdSMTP *IdSMTP1 = new TIdSMTP(this);
IdSMTP1->Host = "myhost";
IdSMTP1->Port = 25;
TIdMessage *MSG = new TIdMessage(this);
MSG->Clear();
MSG->From->Address = "someone@someone.com";
MSG->From->Name = "Someone";
MSG->Subject = "Spy Email";
MSG->Recipients->EMailAddresses = "Watcher@watch.com";
MSG->Body->Text = "your being watched ";
IdSMTP1->Connect();
IdSMTP1->Send(MSG);
IdSMTP1->Disconnect(true);
delete MSG;
delete IdSMTP1;
Run Code Online (Sandbox Code Playgroud)

它现在安装了Builder