⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smailer.cpp

📁 关于smtp的网络编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
// Simple Mail Sender (Implementation)
//
// Copyright (c) 2003 by Morning
// http://morningspace.51.net
// mailto:moyingzz@etang.com
//
// Permission to use, copy, modify, distribute and sell this program for any 
// purpose is hereby granted without fee, provided that the above copyright 
// notice appear in all copies and that both that copyright notice and this 
// permission notice appear in supporting documentation.
//
// It is provided "as is" without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include "SMailer.h"
#include "../MUtils/Base64Helper.h"
#include "../MUtils/FileHelper.h"
//
namespace SMailer {

// constants defination
/////////////////////////////////////

enum {MAX_BUFFER_SIZE = 255};

const std::string Priority::important = "1";
const std::string Priority::normal    = "3";
const std::string Priority::trivial   = "5";

const std::string MailWrapper::_mailer_name = "SMailer";
const std::string MailWrapper::_boundary    = "#BOUNDARY#";
const int SENDCOUNT= 78;

// Member functions of class MimeContent
/////////////////////////////////////

MimeContent::MimeContent(const std::string content) : _content(content)
{
}

std::string MimeContent::getDisposition() const
{
    return "";
}

// Member functions of class PlainTextContent
/////////////////////////////////////

TextPlainContent::TextPlainContent(const std::string content, 
                                   const std::string charset)
    : MimeContent(content), _charset(charset)
{
}

std::string TextPlainContent::getType() const
{
    return "text/plain; charset=" + _charset;
}

std::string TextPlainContent::getTransEncoding() const
{
    return "8bit";
}

std::string& TextPlainContent::getContent()
{
    // you can add more codes here, such as wrapping lines 
    // or replacing '\n' with '\r\n', etc.
    return _content;
}

// Member functions of class TextHtmlContent
/////////////////////////////////////

TextHtmlContent::TextHtmlContent(const std::string content, 
                                 const std::string charset)
    : MimeContent(content), _charset(charset)
{
}

std::string TextHtmlContent::getType() const
{
    return "text/html; charset=" + _charset;
}

std::string TextHtmlContent::getTransEncoding() const
{
    return "8bit";
}

std::string& TextHtmlContent::getContent()
{
    // you can add more codes here, such as wrapping lines 
    // or replacing '\n' with '\r\n', etc.
    return _content;
}

// Member functions of class AppOctStrmContent
/////////////////////////////////////

AppOctStrmContent::AppOctStrmContent(const std::string file_name)
    : _file_name(file_name)
{
    char drive[_MAX_DRIVE];
    char direc[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAX_EXT];
    _splitpath(file_name.c_str(), drive, direc, fname, ext);
    _name  = fname;
    _name += ext;
}


std::string AppOctStrmContent::getType() const
{
    return "application/octet-stream; name=" + _name;
}


std::string AppOctStrmContent::getDisposition() const
{
    return "attachment; filename=" + _name;
}

std::string AppOctStrmContent::getTransEncoding() const
{
    return "base64";
}

//得到流文件的文本
std::string& AppOctStrmContent::getContent()
{
    // you can add more codes here, such as wrapping lines 
    // or replacing '\n' with '\r\n', etc.
    MUtils::FileHelper::open(_file_name, _content);


//	_content = MUtils::Base64Helper::encode(_content);


    return _content;
}

// Member functions of class MailInfo
/////////////////////////////////////

MailInfo::MailInfo() : _priority(Priority::normal)
{
}

void MailInfo::setSenderName(const std::string name)
{
    _sender_name = name;
}

void MailInfo::setSenderAddress(const std::string address)
{
    _sender_address = address;
}

std::string MailInfo::getSenderName() const
{
    return _sender_name;
}

std::string MailInfo::getSenderAddress() const
{
    return _sender_address;
}

void MailInfo::addReceiver(const std::string name, const std::string address)
{
    _receivers.insert(Receivers::value_type(name, address));
}

void MailInfo::setReceiver(const std::string name, const std::string address)
{
    _receivers.clear();
    _receivers.insert(Receivers::value_type(name, address));
}

const Receivers& MailInfo::getReceivers() const
{
    return _receivers;
}

void MailInfo::setPriority(std::string priority)
{
    _priority = priority;
}

std::string MailInfo::getPriority() const
{
    return _priority;
}

void MailInfo::setSubject(const std::string subject)
{
    _subject = subject;
}

std::string MailInfo::getSubject() const
{
    return _subject;
}

void MailInfo::addMimeContent(MimeContent* content)
{
    _contents.push_back(content);
}

void MailInfo::clearMimeContents()
{
    _contents.clear();
}

const MimeContents& MailInfo::getMimeContents() const
{
    return _contents;
}

// Member functions of class MailWrapper
/////////////////////////////////////

MailWrapper::MailWrapper(MailInfo* mail_info) : _mail_info(mail_info)
{
	start=0;
}


std::string MailWrapper::getSenderAddress()
{
    std::string address;

    address  = "<";
    address += _mail_info->getSenderAddress();
    address += ">";

    return address;
}


std::string MailWrapper::getHeader()
{

    std::string header;

    header  = "From: ";
    header += prepareFrom() + "\r\n";

    header += "To: ";
    header += prepareTo() + "\r\n";

    header += "Date: ";
    header += prepareDate() + "\r\n";

    header += "Subject: ";
    header += _mail_info->getSubject() + "\r\n";

    header += "X-Mailer: ";
    header += _mailer_name + "\r\n";

    header += "X-Priority: ";
    header += _mail_info->getPriority() + "\r\n";

    header += "MIME-Version: 1.0\r\n";
    header += "Content-type: multipart/mixed; boundary=\"";
    header += _boundary + "\"\r\n";

    header += "\r\n";

    return header;
}


void MailWrapper::traverseReceiver()
{
    _rcv_itr = _mail_info->getReceivers().begin();
}


//有其它接收者
bool MailWrapper::hasMoreReceiver()
{
    return ( _rcv_itr != _mail_info->getReceivers().end() );
}


//下个接收者地址
std::string MailWrapper::nextReceiverAddress()
{
    std::string address;

    address  = "<";
    address += (_rcv_itr++)->second;
    address += ">";

    return address;
}

//编成内容
void MailWrapper::traverseContent()
{
    _con_itr = _mail_info->getMimeContents().begin();
}

//有其它内容
bool MailWrapper::hasMoreContent()
{
    return ( _con_itr != _mail_info->getMimeContents().end() );
}


//下一断文本
std::string& MailWrapper::nextContent()
{	

	//针对二进制流文件
	std::string s="app",d="";
	d=(*_con_itr)->getType();	
	if(int(d.find("app",0))>=0)
	{
				
			//分界线 标示为一组
            if(start==0)
			{				
				_content  = "--" + _boundary + "\r\n";			
				_content += "Content-Type: ";
				_content += (*_con_itr)->getType() + "\r\n"; 				
				
				//得到当前文件
				std::string disposition = (*_con_itr)->getDisposition();
				if (!disposition.empty() )
				{
					_content += "Content-Disposition: ";;
					_content += disposition + "\r\n";
				}			
				_content += "Content-Transfer-Encoding: ";
				_content += (*_con_itr)->getTransEncoding() + "\r\n\r\n";
				strfile="";				
				strfile=(*_con_itr)->getContent();					
            }
			else
			{
				_content="\r\n";			
			}			
			std::string temp="";
			long lcount=0,j=0;
            start++;				
			lcount=strfile.size();	
			//一次传送多少字节		
			if(lcount-(start-1)*SENDCOUNT<=SENDCOUNT)
			{
				//_content+=strfile.substr((start-1)*j,(lcount-(start-1)*j))+"\r\n";

				temp=strfile.substr((start-1)*SENDCOUNT,(lcount-(start-1)*SENDCOUNT));
				_content+=MUtils::Base64Helper::encode(temp)+"\r\n";

				_con_itr++;	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -