我在C++的一个项目中工作,其中包括发送信息作为‘电子邮件附件’给某人的功能。
除了“电子邮件”这件事之外,所有的事情都完成了。我不知道如何在不使用任何电子邮件客户端或打开浏览器的情况下使此程序能够发送电子邮件。我已经在互联网上搜索了很多,但没有找到任何可以工作的东西(我对socket
,Winsock
等没有任何知识)。
发布于 2011-09-04 19:12:36
我不确定我是否同意您在监视用户所做的事情上所做的事情,但不管怎样,下面是一些发送电子邮件有用的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;
}
在互联网上有很多类似问题的链接,我找到了:
发布于 2011-09-04 21:57:21
感谢您尝试自己编写代码。这会让你超越一般的脚本孩子。
但是你为监视你弟弟而感到羞耻。他的私事是他的事,不关你的事。
此外,如果你的兄弟只有一点点聪明,他不会被一些可执行的电子邮件附件所迷惑。此外,大多数电子邮件程序和网络邮件程序将警告不要执行这件事。如果你想做到万无一失,你需要在使用的电子邮件客户端中找到漏洞,注入代码,最好的方法是攻击图像加载程序和压缩例程,但理想情况下你必须找到0day,否则在你发布间谍软件之前,这些漏洞可能已经被修补了。您可能想要阅读以下主题
的温和实现
发送电子邮件归结为实现http://www.faqs.org/rfcs/rfc821.html中记录的SMTP协议。
从技术上讲,人们可以直接向目标服务器发送电子邮件,但这些服务器通常会拒绝直接来自拨号连接的邮件,因为这是一种既便宜又有效的对抗垃圾邮件的方法。所以你最好用适当的MX记录检查一下MTA。免费邮件是你的朋友,Hotmail在这方面很受欢迎。但是,您也必须实现SMTP-Auth。在http://www.faqs.org/rfcs/rfc2554.html中记录
当然,与发送电子邮件相比,您也可以直接将文件上传到某个地方。或者,您可以实现IMAP并使用支持IMAP的免费电子邮件程序将数据存储在IMAP草稿目录中。
所以,如果你用自己的代码成功地完成了这件事,那么我认为你理应获得成功,但前提是这不涉及恶意软件构建工具包的第三方库(是的,它们确实存在)。
发布于 2015-11-22 23:21:24
使用cURL发送电子邮件的可行解决方案
从here下载cURL并解压。现在,使用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;
}
将curl.exe放在同一目录中。在command
中输入您的电子邮件地址和密码。在这里,消息保存在一个文本文件(ATTACHMENT.FILE)中。
警告: command
可能不支持某些特殊字符(如- &
)。
以上只是cURL的一个演示。对于实际用法,您应该使用libcurl。这里的是一个用于发送邮件的 (适用于Windows和Linux)。
https://stackoverflow.com/questions/7298762
复制相似问题