、邮件服务系统由哪些组件组成,各组件功能是什么?
邮件系统组成的5部分:MTA,MSA,MUA,MDA,MAA
MUA邮件用户 *** (Mail
User
Agent,MUA)是一个邮件系统的客户端程序,它提供了阅读,发送和接受电子邮件的用户接口。最常用的有:linux中的mail,elm,pine等;Windows的outlook
,foxmail等
MSA邮件提交 *** (Mail Submmission
Agent,MSA)负责消息有MTA发送之前必须完成的所有准备工作和错误检测,MSA就像在MUA和MTA之间插入了一个头脑清醒的检测员对所有的主机名,从MUA得到的信息头等信息进行检测。
MTA邮件 *** 器(Mail
Transfer Agent,MTA)负责邮件的存储和转发(store and
forward)。监视用户 *** 的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接受到的邮件进行缓冲。在linux下的MTA程序有:sendmail,qmail等
MDA邮件投递 *** (Mail
Ddlivery
Agent,MDA)从MTA接收邮件并进行适当的本地投递,可以投递个一个本地用户,一个邮件列表,一个文件或是一个程序。Linux下常用的MDA是mail.local, *** rsh和procmail()
MAA邮件访问 *** (Mail Access
Agent,MAA)用于将用户连接到系统邮件库,使用POP或IMAP协议收取邮件。Linux下常用的MAA有UW-IMAP,Cyrus-IMAP,COURIER-IMAP等邮件中继:就是当邮件向目的地址传输时,一旦源地址和目的地址都不是本地系统,那么本地系统就是邮件的中继(中转站)
在添加windows组件里面没有电子邮件服务选项怎么办啊?
很多企业局域网内都架设了邮件服务器,用于进行公文发送和工作交流。但使用专业的企业邮件系统软件需要大量的资金投入,这对于很多小型企业来说是无法承受的。其实我们完全可以通过Windows Server 2003提供的POP3服务和 *** TP服务,来架设小型的邮件服务器满足我们的需要。接下来,小编就带领大家利用Windows Server 2003提供的POP3服务和 *** TP服务,架设一台小型的邮件服务器。
一、安装POP3和 *** TP服务组件
Windows Server 2003默认情况下是没有安装POP3和 *** TP服务组件的,因此我们需要手工添加。
1、安装POP3服务组件
以系统管理员身份登录Windows Server 2003系统。依次进入“控制面板→添加/删除程序→添加/删除Windows组件”,在弹出的“Windows组件向导”对话框中选中“电子邮件服务”选项,点击“详细信息”按钮,可以看到该选项包括两部分内容:POP3服务和POP3服务Web管理。为方便用户远程Web方式管理邮件服务器,建议选中“POP3服务Web管理”。
2、安装 *** TP服务组件
选中“应用程序服务器”选项,点击“详细信息”按钮,接着在“Internet信息服务(IIS)”选项中查看详细信息,选中“ *** TP Service”选项,最后点击“确定”按钮。此外,如果用户需要对邮件服务器进行远程Web管理,一定要选中“万维网服务”中的“远程管理(HTML)”组件。完成以上设置后,点击“下一步”按钮,系统就开始安装配置POP3和 *** TP服务了。
二、配置POP3服务器
1、创建邮件域
点击“开始→管理工具→POP3服务”,弹出POP3服务控制台窗口。选中左栏中的POP3服务后,点击右栏中的“新域”,弹出“添加域”对话框,接着在“域名”栏中输入邮件服务器的域名,也就是邮件地址“@”后面的部分,如“MAIL.COM”,最后点击“确定”按钮。
2、创建用户邮箱
选中刚才新建的“MAIL.COM”域,在右栏中点击“添加邮箱”,弹出添加邮箱对话框,在“邮箱名”栏中输入邮件用户名,然后设置用户密码,最后点击“确定”按钮,完成邮箱的创建,本例中创建的mailbox是frank@mail.com。
三、配置 *** TP服务器
完成POP3服务器的配置后,就可开始配置 *** TP服务器了。点击“开始→程序→管理工具→Internet信息服务(IIS)管理器”,在“IIS管理器”窗口中右键点击“默认 *** TP虚拟服务器”选项,在弹出的菜单中选中“属性”,进入“默认 *** TP虚拟服务器”窗口,切换到“常规”标签页,在“IP地址”下拉列表框中选中邮件服务器的IP地址即可。点击“确定”按钮,这样一个简单的邮件服务器就架设完成了。
完成以上设置后,用户就可以使用邮件客户端软件连接邮件服务器进行邮件收发工作,只要在pop3和 *** tp处输入邮件服务器的IP地址即可。
注意:到这步为止,基本的mail功能已经实现了,可以正常的收发mail。这个时候 *** TP AcCESs里面设置的是匿名访问,此时任何一个人都可以利用此mail服务器发邮件。
四、客户端测试
我用的是Becky、 *** TP和POP3,ID填frank@mail.com,是因为我在POP3服务建立account的时候有一个提示框提示。
测试mail正常收发,我是给自己也就是frank@mail.com发邮件,然后看效果如何,大家注意这时候无论在 *** TP验证那里填什么都能收发邮件,因为在服务器端Access里面设置的是匿名访问。
如何在C++下使用CDO组件开发邮件功能
仅供参考:
/***********************************************************************
*发送邮件模块头文件
*可以发送文本和附件(支持多个附件一起发送)
*************************************************************************/
#pragma once
struct sMailInfo //邮件信息
{
char* m_pcUserName;//用户登录邮箱的名称
char* m_pcUserPassWord;//用户登录邮箱的密码
char* m_pcSenderName;//用户发送时显示的名称
char* m_pcSender;//发送者的邮箱地址
char* m_pcReceiver;//接收者的邮箱地址
char* m_pcTitle;//邮箱标题
char* m_pcBody;//邮件文本正文
char* m_pcIPAddr;//服务器的IP
char* m_pcIPName;//服务器的名称(IP与名称二选一,优先取名称)
sMailInfo(){memset(this,0,sizeof(sMailInfo));}
};
class CSendMail
{
public:
CSendMail(void);
~CSendMail(void);
public:
bool SendMail(sMailInfo *** ailInfo);//发送邮件,需要在发送的时候初始化邮件信息
void AddFilePath(char * pcFilePath);//添加附件的决定路径到附件列表中
void DeleteFilePath(char* pcFilePath);//删除附件路径,如果有的话
void DeleteAllPath(void);//删除全部附件的路径
protected:
void GetFileName(char* fileName,char* filePath);//从附件的路径中获取文件名称
void Char2Base64(char* pBuff64,char* pSrcBuff,int iLen);//把char类型转换成Base64类型
bool CReateSocket(SOCKET sock);//建立socket连接
bool Logon(SOCKET sock);//登录邮箱,主要进行发邮件前的准备工作
int GetFileData(char* FilePath);//由文件路径获取附件内容
bool SendHead(SOCKET sock);//发送邮件头
bool SendTextBody(SOCKET sock);//发送邮件文本正文
bool SendFileBody(SOCKET sock);//发送邮件附件
bool SendEnd(SOCKET sock);//发送邮件结尾
protected:
CListchar*,char* m_pcFilePathList;//记录附件路径
char m_cSendBuff[4096];//发送缓冲区
char m_cReceiveBuff[1024];
char* m_pcFileBuff;//指向附件内容
sMailInfo m_sMailInfo;
};
/************************************************************************
* 发送邮件模块
*可以发送文本和附件(支持多个附件一起发送)
*Date:2011-12-01
************************************************************************/
#include "StdAfx.h"
#include "SendMail.h"
#include "winsock2.h"
#pragma comment(lib,"WSOCK32")
CSendMail::CSendMail(void)
{
m_pcFileBuff=NULL;
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff));
}
CSendMail::~CSendMail(void)
{
DeleteAllPath();
}
void CSendMail::Char2Base64(char* pBuff64,char* pSrcBuff,int iLen)
{
//1 1 1 1 1 1 1 1
// 分配给pBuff64 ↑ 分配给pBuff64+1
// point所在的位置
static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64所映射的字符表
int point;//每一个源字符拆分的位置,可取2,4,6;初始为2
point=2;
int i;
int iIndex;//base64字符的索引
char n=0;//上一个源字符的残留值
for(i=0;iiLen;i++)
{
if(point==2)
{
iIndex=((*pSrcBuff)point)0x3f;//取得pSrcBuff的高point位
}
else if (point==4)
{
iIndex=((*pSrcBuff)point)0xf;//取得pSrcBuff的高point位
}
else if(point==6)
{
iIndex=((*pSrcBuff)point)0x3;//取得pSrcBuff的高point位
}
iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引
*pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64
n=((*pSrcBuff)(6-point));//计算源字符中的残留值
n=n0x3f;//确保n的更高两位为0
point+=2;//源字符的拆分位置上升2
if(point==8)//如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次
{
iIndex=(*pSrcBuff)0x3f;//提取低6位,这就是索引了
*pBuff64++=Base64Encode[iIndex];//
n=0;//残留值为0
point=2;//拆分位置设为2
}
pSrcBuff++;
}
if(n!=0)
{
*pBuff64++=Base64Encode[n];
}
if(iLen%3==2)//如果源字符串长度不是3的倍数要用'='补全
{
*pBuff64='=';
}
else if(iLen%3==1)
{
*pBuff64++='=';
*pBuff64='=';
}
}
void CSendMail::AddFilePath(char * pcFilePath)//添加附件路径
{
if(pcFilePath==NULL)
{
return;
}
int i;
char* temp;
for(i=0;im_pcFilePathList.GetCount();i++)
{
temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));
if(strcmp(pcFilePath,temp)==0)//如果已经存在就不用再添加了
{
return;
}
}
m_pcFilePathList.AddTail(pcFilePath);
}
void CSendMail::DeleteFilePath(char* pcFilePath)//删除附件路径
{
int i;
char* temp;
for(i=0;im_pcFilePathList.GetCount();i++)
{
temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));
if(strcmp(temp,pcFilePath)==0)//找到并删除它,如果没找到就算了
{
m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i));
delete[] temp;
return;
}
}
}
void CSendMail::DeleteAllPath(void)
{
m_pcFilePathList.RemoveAll();
}
int CSendMail::GetFileData(char* FilePath)
{
m_pcFileBuff=NULL;
if(FilePath==NULL)
{
return 0;
}
CFile f;
int len;
USES_CONVERSION;
if(!f.Open(A2W(FilePath),CFile::modeRead|CFile::modeNoTruncate|CFile::typeBinary))
{
return 0;
}
len=(int)f.GetLength();
m_pcFileBuff=new char[len+1];
memset(m_pcFileBuff,0,len+1);
f.Read(m_pcFileBuff,len);
f.Close();
return len;
}
void CSendMail::GetFileName(char* fileName,char* filePath)
{
if(filePath==NULL || fileName==NULL)
{
return;
}
int i;
for(i=0;i(int)strlen(filePath);i++)
{
if(filePath[strlen(filePath)-1-i]=='\\')
{
memcpy(fileName,filePath[strlen(filePath)-i],i);
return;
}
}
}
bool CSendMail::CReateSocket(SOCKET sock)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, wsaData );
if ( err != 0 )
{
return false;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return false;
}
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if (sock == INVALID_SOCKET)
{
return false;
}
sockaddr_in servaddr;
memset(servaddr,0,sizeof(sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(25);//发邮件一般都是25端口
if(m_sMailInfo.m_pcIPName=="")
{
servaddr.sin_addr.s_addr = inet_addr(m_sMailInfo.m_pcIPAddr);//直接使用IP地址
}
else
{
struct hostent *hp=gethostbyname(m_sMailInfo.m_pcIPName);//使用名称
servaddr.sin_addr.s_addr=*(int*)(*hp-h_addr_list);
}
int ret = connect(sock,(sockaddr*)servaddr,sizeof(servaddr));//建立连接
if (ret == SOCKET_ERROR)
{
return false;
}
return true;
}
bool CSendMail::Logon(SOCKET sock)
{
recv(sock,m_cReceiveBuff,1024,0);
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
sprintf_s(m_cSendBuff,"HELO []\r\n");
send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//开始会话
recv(sock,m_cReceiveBuff,1024,0);
if(m_cReceiveBuff[0]!='2' || m_cReceiveBuff[1]!='5' || m_cReceiveBuff[2]!='0')
{
return false;
}
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
sprintf_s(m_cSendBuff,"AUTH LOGIN\r\n");
send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//请求登录
recv(sock,m_cReceiveBuff,1024,0);
if(m_cReceiveBuff[0]!='3' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='4')
{
return false;
}
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserName,strlen(m_sMailInfo.m_pcUserName));
m_cSendBuff[strlen(m_cSendBuff)]='\r';
m_cSendBuff[strlen(m_cSendBuff)]='\n';
send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//发送用户名
recv(sock,m_cReceiveBuff,1024,0);
if(m_cReceiveBuff[0]!='3' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='4')
{
return false;
}
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserPassWord,strlen(m_sMailInfo.m_pcUserPassWord));
m_cSendBuff[strlen(m_cSendBuff)]='\r';
m_cSendBuff[strlen(m_cSendBuff)]='\n';
send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//发送用户密码
recv(sock,m_cReceiveBuff,1024,0);
if(m_cReceiveBuff[0]!='2' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='5')
{
return false;
}
return true;//登录成功
}
return; } } } void CSendMail::DeleteAllPath(void) { m_pcFilePathList
32") CSendMail::CSendMail(void) { m_pcFileBuff=NULL; memset(m_cSendBuff,0,sizeof(m_cSendBuff)); memset