谁有邮件发送源代码?可否给我一份?急。。。。
rt 问题点数:100、回复次数:9Top
1 楼zbl101(星期五)回复于 2003-09-04 05:24:55 得分 0
最好是c语言版本Top
2 楼lonely001(独行客)回复于 2003-09-04 09:12:35 得分 100
C + SDK的,要不要?
要就留EMAIL:)Top
3 楼Skt32(荒城之月)回复于 2003-09-04 20:39:53 得分 0
邮件发送程序源代码 详细信息 < Internet与WEB服务 >
使用CSocket类实现发送邮件的SMTP客户程序。
[代码性质] VC完整应用程序代码
[代码作者]
[文件大小] 90K
[更新日期] 2002-3-3 20:28:00
[下载次数] 2967
http://www.vckbase.com/code/downcode.asp?id=392Top
4 楼Skt32(荒城之月)回复于 2003-09-04 20:49:41 得分 0
前言
去年年末的时候,codez 写了一个 Email 发送的小程序,叫做 ZMailer,使用的是 ZJMailer V0.1 邮件发送引擎。公布以后,很多朋友都非常感兴趣,纷纷来信要求公布源码。很感谢这些朋友对这个小程序感兴趣。
本来我并不打算公布源码的(至少是短时间内),并不是我不想公开,只是由于这个程序写的时候就没有好好整理思路,也没有一个好的计划,所以开发出来的代码非常乱(因为好多东西都是随手加进去的),而且还有一些地方没有实现,真的不想拿出来献丑。但是既然这么多朋友感兴趣,那我就公布了吧。(V0.1a+ 修正了 V0.1a 中不能将域名正确转换为 IP 地址的问题,基本可以正常使用了)
如果有问题或者发现了错误请一定给我写信: webmaster@jaysoft2002.com
我会尽快更改或回复!
介绍
CZJSocket:
一个 SOCKET 的封装类,为什么不使用 MFC 的 CSocket 呢?因为我并不需要那么复杂的功能,而在这个类中我们提供了一些更方便的函数以供 CZJMailAgent 使用。
CZJAttachment:
维护一个附件文件列表,由 CZJMailAgent 使用。
CZJMessage:
存储邮件信息主体,并自动生成发送需要的对应格式。
CZJMailAgent:
ZJMailer 引擎的代理类。相当于一个 manager,它管理上述个各类并使之正常工作。
另外,CTextBuffer 用来自动管理,分配,释放所需内存。
CBase64Buffer 继承 CTextBuffer 并提供将该缓冲区中的字符进行 Base64 编码和解码。
过段时间,也许会重新整理一下它的源码。好了,不多说废话了,有兴趣就下载吧。
使用方法
// The use way as follow:
CZJMessage msg;
CZJMailAgent mail;
// Add Attachement
msg.m_attach.AddFile(CString(_T("C:\\Autoexec.bat")));
// Initialize the message body
msg.SetTo(CString(_T("Destination@domain.com"));
msg.SetFrom(CString(_T("codez"), _T("codez@codez.com"));
msg.SetSubject(CString(_T("This is title subject"));
msg.SetBody(CString(_T("This is body context."));
// if u want to use ESMTP AUTH mode, please add follow codes:
// mail.SetAuthLogin(true);
// mail.SetAuthLoginParam(_T("codez") /* User Name */,
// _T("password") /* Auth passowrd */);
// Send mail
if (mail.Connect(_T("smtp.domain.com") /* your smtp server */, 25))
if (mail.Hello(_T("codez"))) // HELO message, anything as u like
if (mail.SendMail(msg))
{ /* Send Succeeded! */ return TRUE;}
// Otherwise
{ /* Send Failed */ }
下载
源码下载 http://www.jaysoft2002.com/soft/zjm_src.zip
Top
5 楼zbl101(星期五)回复于 2003-09-04 22:03:29 得分 0
webmaster@win32.51.net
谢谢!!Top
6 楼cnxiaohai(相声独一处(回归,为了编程,为了C,为了CSDN))回复于 2003-09-05 07:51:34 得分 0
网上很多的
你自己搜索以下吧Top
7 楼lonely001(独行客)回复于 2003-09-06 18:15:06 得分 0
呵呵,两天没上来,不知道会不会晚了。
楼主,不好意思了,明天一定发,但愿不会晚:)Top
8 楼lonely001(独行客)回复于 2003-09-08 16:39:21 得分 0
下面是整理后的代码:
// Windows Header Files:
#include <windows.h>
#include <winsock2.h>
// C RunTime Header Files
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#define MAX_LOADSTRING 128
#define WZM_NOTIFY (WM_USER + 0x20)
#define WZM_START_NOTIFY (WZM_NOTIFY + 1)
#define SMTP_CONN 0x0001
#define SMTP_HELO 0x0002
#define SMTP_MAIL 0x0004
#define SMTP_RCPT 0x0008
#define SMTP_DATA 0x0010
#define SMTP_VRFY 0x0020
#define SMTP_EXPN 0x0040
#define SMTP_QUIT 0x0080
#define SMTP_SEND 0x0100
#define SMTP_AUTH 0x0200
#define SMTP_USER 0x0400
#define SMTP_PASS 0x0800
#define HSM_FAILED 0x0000
#define HSM_SUCCESSED 0x0001
#define GRS_INVALID_PARAM 501 // 参数格式错误
#define GRS_BAD_COMMAND 502 // 命令不可实现
#define GRS_BAD_CMDSERIAL 503 // 错误的命令序列
#define GRS_BAD_PARAM 504 // 命令参数不可实现
#define GRS_SYS_STATUSHELP 211 // 系统状态或系统帮助响应
#define GRS_HELP 214 // 帮助信息
#define GRS_SERVER_READY 220 // <domain> 服务就绪
#define GRS_SERVER_CLOSED 221 // <domain> 服务关闭传输信道
#define GRS_SERVER_NOTREADY 421 // <domain> 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)
#define GRS_CMD_FINISHED 250 // 要求的邮件操作完成
#define GRS_NOT_LOCALUSER 251 // 用户非本地,将转发向<forward-path>
#define GRS_EMAIL_BUSY 450 // 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
#define GRS_EMAIL_INVALID 550 // 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
#define GRS_ABORT_OR_ERROR 451 // 放弃要求的操作;处理过程中出错
#define GRS_USER_NOTLOCAL 551 // 用户非本地,请尝试<forward-path>
#define GRS_MEMORY_FEWNESS 452 // 系统存储不足,要求的操作未执行
#define GRS_MEMORY_OUT 552 // 过量的存储分配,要求的操作未执行
#define GRS_BAD_EMAIL 553 // 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
#define GRS_RECV_INPUT 354 // 开始邮件输入,以<CRLF>.<CRLF>结束
#define GRS_CMD_FAILED 554 // 操作失败
#define GRS_AUTH_PASS 334 // AUTH 命令用户验证通过
#define GRS_AUTH_LOGINED 235 // AUTH 命令密码验证通过
#define WM_SOCKET_NOTIFY (WM_USER + 0x50)
#define WM_SOCKET_GETHOST (WM_USER + 0x51)
LRESULT CALLBACK Send(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
WORD WINAPI HandleSmtpMessage(SOCKET Socket,LPWORD pwStatus,LPSTR pBuf,WORD wSize,LPSTR pBufSend,WORD wSendSize);
WORD WINAPI GetReturnStatus(LPSTR pRet);
BOOL WINAPI CloseSocket(SOCKET socket);
int WINAPI ANSIToBase64(const char *szInANSI,int nInLen,char *szOutBase64,int nOutLen);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_SEND),NULL,(DLGPROC)Send);
return 0;
}
Top
9 楼lonely001(独行客)回复于 2003-09-08 16:39:51 得分 0
LRESULT CALLBACK Send(HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
int nReturnCode = 0;
TCHAR szTemporary[MAX_LOADSTRING] = "";
static WORD wStatus = 0;
static HANDLE hHost = NULL;
static BYTE byHostEntry[MAXGETHOSTSTRUCT] = "";
static SOCKET Socket = INVALID_SOCKET;
static SOCKADDR_IN saServerAddr = {0};
switch(uMsg)
{
case WM_INITDIALOG:
InitDialog(hInst,hWnd,hDlg,wpPages,lParam);
Socket = INVALID_SOCKET;
wStatus = 0;
SetTimer(hDlg,1,500,NULL);
SetDlgItemText(hDlg,IDC_INFO,"正在初始化数据 ...");
return TRUE;
case WM_TIMER:
KillTimer(hDlg,1);
PostMessage(hDlg,WZM_NOTIFY,0L,0L);
return TRUE;
case WZM_NOTIFY:
const WORD MAJOR_VERSION_REQUIRED = 1;
const WORD MINOR_VERSION_REQUIRED = 1;
WORD wVersionRequired = MAKEWORD(MAJOR_VERSION_REQUIRED,MINOR_VERSION_REQUIRED);
WSADATA wsaData = {0};
nReturnCode = WSAStartup(wVersionRequired,&wsaData);
if(nReturnCode != 0)
{
SetDlgItemText(hDlg,IDC_INFO,"初始化 Socket 库失败!");
break;
}
if(wsaData.wVersion != wVersionRequired)
{
SetDlgItemText(hDlg,IDC_INFO,"Socket 库版本错误!");
WSACleanup();
break;
}
TCHAR szHost[32] = "";
lstrcpy(szHost,"smtp.21cn.com");
hHost = WSAAsyncGetHostByName(hDlg,
WM_SOCKET_GETHOST,
szHost,
(LPSTR)byHostEntry,
MAXGETHOSTSTRUCT);
if(hHost == NULL)
{
SetDlgItemText(hDlg,IDC_INFO,"解析服务器地址失败!\0");
WSACleanup();
break;
}
return TRUE;
case WM_SOCKET_NOTIFY:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
break;
case FD_READ:
int nReadedByte = 0;
BYTE byRecvBuffer[2048] = "";
TCHAR szCommand[MAX_LOADSTRING] = "";
LPSTR pszBase64 = NULL;
nReadedByte = recv(Socket,(LPSTR)byRecvBuffer,2048,0);
if(nReadedByte == 0)break; //连接已经被关闭
if(nReadedByte == SOCKET_ERROR)break; //出错,错误号: nReadedByte
switch(wStatus)
{
case SMTP_CONN:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 HELO ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_SERVER_READY:
lstrcpy(szCommand,"HELO 21cn.com\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_HELO:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 AUTH LOGIN ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_CMD_FINISHED:
lstrcpy(szCommand,"AUTH LOGIN\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_AUTH:
SetDlgItemText(hDlg,IDC_INFO,"校验用户 ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_AUTH_PASS:
ZeroMemory(szCommand,MAX_LOADSTRING);
ANSIToBase64("lzm@edu.21cn.com",lstrlen("lzm@edu.21cn.com"),szCommand,MAX_LOADSTRING);
lstrcat(szCommand,"\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_USER:
SetDlgItemText(hDlg,IDC_INFO,"校验密码 ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_AUTH_PASS:
ZeroMemory(szCommand,MAX_LOADSTRING);
ANSIToBase64("lzm",lstrlen("lzm"),szCommand,MAX_LOADSTRING);
lstrcat(szCommand,"\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_PASS:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 MAIL FROM ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_AUTH_LOGINED:
lstrcpy(szCommand,"MAIL FROM: lzm@edu.21cn.com\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_MAIL:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 RCPT TO ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_CMD_FINISHED:
lstrcpy(szCommand,"RCPT TO: bsmaster@21cn.com\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_RCPT:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 DATA ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_CMD_FINISHED:
lstrcpy(szCommand,"DATA\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_DATA:
SetDlgItemText(hDlg,IDC_INFO,"正在发送数据 ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_RECV_INPUT:
TCHAR szMail[1024 * 10];
ZeroMemory(szMail,1024 * 10);
lstrcpy(szMail,"FROM: lzm@edu.21cn.com\r\n");
lstrcat(szMail,"TO: bsmaster@21cn.com\r\n");
lstrcat(szMail,"Content-Type: text/plain;charset=\"GB2312\"\r\n");
lstrcat(szMail,"SUBJECT: 测试\r\n");
wsprintf(szCommand,"Date: %s\r\n","2003-09-08");
lstrcat(szMail,szCommand);
lstrcat(szMail,"X-Priority: 3\r\n");
lstrcat(szMail,"X-Mailer: Bisheng Science & Technology Ltd. Register\r\n");
lstrcat(szMail,"\r\n");
wsprintf(szCommand,"姓名/单位名:%s\r\n","独行客");
lstrcat(szMail,szCommand);
lstrcat(szMail,"\r\n.\r\n");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szMail,lstrlen(szMail));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_SEND:
SetDlgItemText(hDlg,IDC_INFO,"发送命令 QUIT ...\0");
switch(GetReturnStatus((LPSTR)byRecvBuffer))
{
case GRS_CMD_FINISHED:
lstrcpy(szCommand,"QUIT\r\n\0");
HandleSmtpMessage(Socket,&wStatus,(LPSTR)byRecvBuffer,nReadedByte,szCommand,lstrlen(szCommand));
break;
default:
SetDlgItemText(hDlg,IDC_INFO,(LPSTR)byRecvBuffer);
break;
}
break;
case SMTP_VRFY:
break;
case SMTP_EXPN:
break;
case SMTP_QUIT:
SetDlgItemText(hDlg,IDC_INFO,"数据发送完毕!\0");
HandleSmtpMessage(Socket,&wStatus,NULL,0,NULL,0);
break;
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
if(Socket != INVALID_SOCKET)
{
CloseSocket(Socket);
WSACleanup();
}
break;
}
return TRUE;
Top
相关问题
- 不能发送邮件(内付源代码),请帮忙查错?
- 求:用API写的发送邮件的程序源代码,在线等待!
- 求ASP.NET发送邮件的源代码 (调试成功立即结贴)
- 谁有用TNMSNTP控件发送邮件的源代码?要能用(不要BCB自带的)
- 高分急求win32简单邮件发送程序的源代码例子,不要MFC的,请高手帮忙
- 文件发送,请帖出源代码!
- 软件测试——发送源代码!
- 请问谁有用SDK发送邮件的源代码,请给我一份,不胜感激。。(最好有祥细解说--小弟为菜鸟,没办法,哎~~~)
- 急需C#源码,放出500高分,寻求C#发送邮件源代码[带参数的],具体情况如下:
- java怎么将网页通过javamail发送到别人的邮箱,在邮件正文显示网页内容,而不是他的网页源代码




