组件邮箱,电子邮件 附件

hacker|
86

、邮件服务系统由哪些组件组成,各组件功能是什么?

邮件系统组成的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;//登录成功  

    }

2条大神的评论

  • avatar
    访客 2022-10-10 下午 03:38:34

                      return;              }          }      }  void CSendMail::DeleteAllPath(void)      {          m_pcFilePathList

  • avatar
    访客 2022-10-10 上午 05:49:23

    32")             CSendMail::CSendMail(void)      {          m_pcFileBuff=NULL;          memset(m_cSendBuff,0,sizeof(m_cSendBuff));          memset

发表评论