一個C++ 傳送郵件的類
/*********************************************************************** *傳送郵件模組標頭檔案 *可以傳送文字和附件(支援多個附件一起傳送) *************************************************************************/ #pragma once struct SMailInfo //郵件資訊 { // char* m_pcUserName;//使用者登入郵箱的名稱 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 CSendMailTool { public: CSendMailTool(void); ~CSendMailTool(void); public: bool SendMail(SMailInfo &smailInfo);//傳送郵件,需要在傳送的時候初始化郵件資訊 void AddFilePath(char * pcFilePath);//新增附件的決定路徑到附件列表中 void DeleteFilePath(char* pcFilePath);//刪除附件路徑,如果有的話 void DeleteAllPath(void);//刪除全部附件的路徑 protected: void GetFileName(char* fileName,char* filePath);//從附件的路徑中獲取檔名稱 void Char2Base64(unsigned char* pBuff64, unsigned 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: CList<char*,char*> m_pcFilePathList;//記錄附件路徑 char m_cSendBuff[4096];//傳送緩衝區 char m_cReceiveBuff[1024]; char* m_pcFileBuff;//指向附件內容 SMailInfo m_sMailInfo; };
原始檔
使用#include "StdAfx.h" #include "SendMailTool.h" /************************************************************************ * 傳送郵件模組 *可以傳送文字和附件(支援多個附件一起傳送) *Date:2011-12-01 ************************************************************************/ #include "StdAfx.h" #include "SendMailTool.h" #include "winsock2.h" #pragma comment(lib,"WSOCK32") #pragma comment(lib, "ws2_32") CSendMailTool::CSendMailTool(void) { m_pcFileBuff=NULL; memset(m_cSendBuff,0,sizeof(m_cSendBuff)); memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff)); } CSendMailTool::~CSendMailTool(void) { DeleteAllPath(); } void CSendMailTool::Char2Base64(unsigned char* dest, unsigned char* src, int srclen) { int sign = 0; const unsigned char EncodeIndex[] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; for (int i = 0; i!= srclen; i++,src++,dest++) { switch(sign) { case 0: *(dest) = EncodeIndex[*src >> 2]; break; case 1: *dest = EncodeIndex[((*(src-1) & 0x03) << 4) | (((*src) & 0xF0) >> 4)]; break; case 2: *dest = EncodeIndex[((*(src-1) &0x0F) << 2) | ((*(src) & 0xC0) >> 6)]; *(++dest) = EncodeIndex[(*(src) &0x3F)]; break; } (sign == 2)?(sign = 0):(sign++); } switch(sign) { case 0: break; case 1: *(dest++) = EncodeIndex[((*(src-1) & 0x03) << 4) | (((*src) & 0xF0) >> 4)]; *(dest++) = '='; *(dest++) = '='; break; case 2: *(dest++) = EncodeIndex[((*(src-1) &0x0F) << 2) | ((*(src) & 0xC0) >> 6)]; *(dest++) = '='; break; default: break; } } void CSendMailTool::AddFilePath(char * pcFilePath)//新增附件路徑 { if(pcFilePath==NULL) { return; } int i; char* temp; for(i=0;i<m_pcFilePathList.GetCount();i++) { temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i)); if(strcmp(pcFilePath,temp)==0)//如果已經存在就不用再添加了 { return; } } m_pcFilePathList.AddTail(pcFilePath); } void CSendMailTool::DeleteFilePath(char* pcFilePath)//刪除附件路徑 { int i; char* temp; for(i=0;i<m_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 CSendMailTool::DeleteAllPath(void) { m_pcFilePathList.RemoveAll(); } int CSendMailTool::GetFileData(char* FilePath) { m_pcFileBuff=NULL; if(FilePath==NULL) { return 0; } CFile f; int len; USES_CONVERSION; if(!f.Open(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; } /* * 從完整檔案路徑中,取檔名 * * 修正當filePath只有檔名時,fileName沒取到 */ void CSendMailTool::GetFileName(char* fileName,char* filePath) { if(filePath==NULL || fileName==NULL) { return; } char * pName =strrchr(filePath,'\\'); if(pName==NULL)//路徑中只有檔名 pName=filePath; else pName++; strcpy(fileName, pName); } bool CSendMailTool::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);//使用名稱 if (hp == NULL) { DWORD dwErrCode = GetLastError(); return false; } servaddr.sin_addr.s_addr=*(int*)(*hp->h_addr_list); } int ret = connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));//建立連線 if (ret == SOCKET_ERROR) { DWORD dwErr = GetLastError(); return false; } return true; } bool CSendMailTool::Logon(SOCKET &sock) { char local_host[MAX_PATH]; if ( gethostname(local_host, MAX_PATH) != 0 ) { return false; } recv(sock,m_cReceiveBuff,1024,0); memset(m_cSendBuff,0,sizeof(m_cSendBuff)); sprintf_s(m_cSendBuff,"HELO %s\r\n", local_host); 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((unsigned char*)m_cSendBuff,(unsigned char*)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((unsigned char*) m_cSendBuff,(unsigned char*) 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;//登入成功 } bool CSendMailTool::SendHead(SOCKET &sock) { int rt; memset(m_cSendBuff,0,sizeof(m_cSendBuff)); sprintf_s(m_cSendBuff,"MAIL FROM:<%s>\r\n",m_sMailInfo.m_pcSender); rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); if(rt!=strlen(m_cSendBuff)) { return false; } recv(sock,m_cReceiveBuff,1024,0); memset(m_cSendBuff,0,sizeof(m_cSendBuff)); sprintf_s(m_cSendBuff,"RCPT TO:<%s>\r\n",m_sMailInfo.m_pcReceiver); rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); if(rt!=strlen(m_cSendBuff)) { return false; } recv(sock,m_cReceiveBuff,1024,0); memset(m_cSendBuff,0,sizeof(m_cSendBuff)); memcpy(m_cSendBuff,"DATA\r\n",strlen("DATA\r\n")); rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); if(rt!=strlen(m_cSendBuff)) { return false; } recv(sock,m_cReceiveBuff,1024,0); memset(m_cSendBuff,0,sizeof(m_cSendBuff)); sprintf_s(m_cSendBuff,"From:\"%s\"<%s>\r\n",m_sMailInfo.m_pcSenderName,m_sMailInfo.m_pcSender); sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,"To:\"INVT.COM.CN\"<%s>\r\n",m_sMailInfo.m_pcReceiver); sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,"Subject:%s\r\nMime-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"INVT\"\r\n\r\n",m_sMailInfo.m_pcTitle); rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); if(rt!=strlen(m_cSendBuff)) { return false; } return true; } bool CSendMailTool::SendTextBody(SOCKET &sock) { int rt; memset(m_cSendBuff,0,sizeof(m_cSendBuff)); sprintf_s(m_cSendBuff,"--INVT\r\nContent-Type: text/plain;\r\n charset=\"gb2312\"\r\n\r\n%s\r\n\r\n",m_sMailInfo.m_pcBody); rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); if(rt!=strlen(m_cSendBuff)) { return false; } else { return true; } } bool CSendMailTool::SendFileBody(SOCKET &sock) { int i; char* filePath; int rt; int len; int pt=0; char fileName[MAX_PATH]; for(i=0;i<m_pcFilePathList.GetCount();i++) { pt=0; memset(fileName,0,MAX_PATH); filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i)); len=GetFileData(filePath); GetFileName(fileName,filePath); sprintf_s(m_cSendBuff,"--INVT\r\nContent-Type: application/octet-stream;\r\n name=\"%s\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename=\"%s\"\r\n\r\n",fileName,fileName); send(sock,m_cSendBuff,strlen(m_cSendBuff),0); while (pt<len) { memset(m_cSendBuff,0,sizeof(m_cSendBuff)); Char2Base64( (unsigned char*) m_cSendBuff,(unsigned char*) &m_pcFileBuff[pt],min(len-pt,3000)); m_cSendBuff[strlen(m_cSendBuff)]='\r'; m_cSendBuff[strlen(m_cSendBuff)]='\n'; rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); pt+=min(len-pt,3000); if(rt!=strlen(m_cSendBuff)) { return false; } } if(len!=0) { delete [] m_pcFileBuff; } } return true; } bool CSendMailTool::SendEnd(SOCKET &sock) { sprintf_s(m_cSendBuff,"--INVT--\r\n.\r\n"); send(sock,m_cSendBuff,strlen(m_cSendBuff),0); sprintf_s(m_cSendBuff,"QUIT\r\n"); send(sock,m_cSendBuff,strlen(m_cSendBuff),0); closesocket(sock); WSACleanup(); return true; } bool CSendMailTool::SendMail(SMailInfo &smailInfo) { memcpy(&m_sMailInfo,&smailInfo,sizeof(smailInfo)); if(m_sMailInfo.m_pcBody==NULL || m_sMailInfo.m_pcIPAddr==NULL || m_sMailInfo.m_pcIPName==NULL || m_sMailInfo.m_pcReceiver==NULL || m_sMailInfo.m_pcSender==NULL || m_sMailInfo.m_pcSenderName==NULL || m_sMailInfo.m_pcTitle==NULL || m_sMailInfo.m_pcUserName==NULL || m_sMailInfo.m_pcUserPassWord==NULL) { return false; } SOCKET sock; if(!CReateSocket(sock))//建立連線 { return false; } if(!Logon(sock))//登入郵箱 { return false; } if(!SendHead(sock))//傳送郵件頭 { return false; } if(!SendTextBody(sock))//傳送郵件文字部分 { return false; } if(!SendFileBody(sock))//傳送附件 { return false; } if(!SendEnd(sock))//結束郵件,並關閉sock { return false; } return true; }
void TestSendMail()
{
CTime t = CTime::GetCurrentTime(); //獲取系統日期
int d=t.GetDay(); //獲得幾號
int y=t.GetYear(); //獲取年份
int m=t.GetMonth(); //獲取當前月份
int h=t.GetHour(); //獲取當前為幾時
int mm=t.GetMinute(); //獲取分鐘
int nowtime=m*1000000+d*10000+h*100+mm;
char str3[50];
char str1[12]={0};
itoa(nowtime,str1,10);
char* str2="【警告】伺服器出現清算錯誤_";
strcpy(str3,str2);
strcat(str3,str1);
char* str=(LPSTR)str3;
SMailInfo mailInfo;
//126 smtp
mailInfo.m_pcUserName = " [email protected]"; //"你的郵箱帳號";
mailInfo.m_pcUserPassWord = "ssssssssss"; // "密碼";
mailInfo.m_pcSenderName = "交易伺服器提示"; //傳送郵件者的名稱
mailInfo.m_pcSender = "[email protected]"; //傳送者的郵箱地址
mailInfo.m_pcReceiver = "[email protected]"; //接收者的郵箱地址
mailInfo.m_pcTitle = str; //郵箱標題
mailInfo.m_pcBody = "1234567979797979797979"; //郵件文字正文
mailInfo.m_pcIPAddr = ""; //伺服器的IP可以留空
mailInfo.m_pcIPName = "smtp.163.com" ; //伺服器的名稱(IP與名稱二選一,優先取名稱)
CSendMail smtpMail;
smtpMail.AddFilePath("cDisp.log"); //附件1 可給出完整的附件路徑
smtpMail.AddFilePath("TradeSrv.log"); //附件2
smtpMail.SendMail(mailInfo);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 並在失敗時顯示錯誤
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改錯誤程式碼以符合您的需要
_tprintf(_T("錯誤: MFC 初始化失敗\n"));
nRetCode = 1;
}
else
{
// TODO: 在此處為應用程式的行為編寫程式碼。
}
TestSendMail();
return nRetCode;
}
相關推薦
一個C++ 傳送郵件的類
/*********************************************************************** *傳送郵件模組標頭檔案 *可以傳送文字和附件(支援多個附件一起傳送) **************************
C#傳送郵件類
public class Email { /// <summary> /// 傳送者 /// </summary> public string mailFrom { get; s
C#傳送郵件(附件)類
本部落格主要利用C#中System.Net.Mail中的MailMessage 類進行郵件的傳送。話不多說直接上程式碼: using System; using System.Collections.Generic; using System.Conf
C# 傳送郵件(帶附加件傳送)
有時候不太適合寫這些東西:不太會描述,因為在開發過程中遇到了,所以記錄一下,以便後面看看。 由於開發一直用的VS2015或者VS2017,所以不知道其他的版本開發情況,其實差不多 這是下面的核心程式碼:簡單的傳送郵件(不發附件):去掉新增附近的程式碼即可 string user = "***@163.
C# 傳送郵件功能實現
郵件傳送功能在OA以及一些網站驗證中很常用。下面是郵件傳送的一個函式,引數傳入收件人地址,郵件主題,郵件內容,讀者可根據自己的需求新增郵件的附件或者抄送人等。 /// <summary> /// 傳送郵件 /// </su
C# 傳送郵件內容嵌入圖片
我們在傳送郵件時,一般圖片都是用網路路徑,但有時如果接收方不可直接訪問外網,就不能看到圖片了,比如公司內部郵件,跟外界就沒法交流圖片。 那麼我們就來把圖片嵌入郵件中;檢視人就沒有限制了。 1。以linked的方式,此方式在郵件中不會出現圖片的附件 郵件內容呼
C#傳送郵件(新增附件)!
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.T
使用.net(C#)傳送郵件(帶成功案例)
1.瞭解傳送郵件的三種方式 第一:client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; //通過遠端SMTP伺服器傳送該郵件,這裡的network表示你要使用的遠端SMTP伺服器。 第
一些關於C#傳送郵件的程式碼
SmtpClient smtp = new SmtpClient(); smtp.EnableSsl = false; smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.Host = "smtp.163.com"; smtp.Credentials
C# 傳送郵件 附件名稱為空
// 1.建立郵件 MailMessage mailMsg = new MailMessage(); mailMsg.To.Add(new MailAddress("[email protected]")); // 2.設定郵件標題、正文等資訊 mailMsg.HeadersEnco
C++傳送郵件實現
首先,別忘了要設定傳送郵箱的smtp,例如,假設你需要用網易郵箱,你需要去你的163郵箱設定開啟smtp(有的郵箱還需要設定授權碼)。接著就可以用以下程式碼傳送郵件了: // SendMail.h #ifndef _SEND_MAIL_H_ #define
c#傳送郵件(帶抄送,密送,群發,附件)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mail; using System.Net.Mime; using System.Text; using
使用C#傳送郵件
最近有使用者提出了一個新的需求,希望公司的ERP系統在交易申請書被批准以後自動發郵件到相關人員的郵箱中,讓他們能第一時間知道。因為他們不想多打一次電話,也不願意每天都開著ERP,但是他們的Outlook能每5分鐘自動掃描一次新郵件跳出提醒。使用者的需求並不過分,所以我就接下來
【Java郵件開發】5.編寫一個JavaMail傳送郵件的程式
之前我們對JavaMail的API進行了簡單的介紹,並下載了相應的jar包。 這次,我們要著手使用JavaMail開發一個可以傳送郵件的程式。 1.建立工程 首先我們在Eclipse中新建一個名為JavaMailTest的工程: 然後我們新建一個lib資料夾,將mail
web開發 開發一個能傳送郵件的應用
開發一個能傳送郵件的應用,前人種的樹,借鑑 參考大牛的程式碼,做的小應用。 大概是這樣的: 其中SMTP密碼,並非使用者名稱所對應的登入密碼,而是在開啟 163信箱這個服務時,自己設定的授權碼,按步驟即可輕鬆開啟這個服務,並獲得授權碼,其中,本次實驗的主要是163信箱,
c# STMP類傳送郵件
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient { Host = "smtp.163.com",//使用163的SMTP伺服器傳送郵
c#幫助類:傳送郵件
1 private static string IsOpenSendMail = ConfigurationManager.AppSettings["IsOpenSendMail"]; //是否啟用異常訊息傳送郵箱功能 2 private static string
C#中使用MailMessage類傳送郵件(QQ郵箱或者163郵箱)的小細節
一年前,我用程式碼操作QQ郵箱傳送郵件,直接失敗,但是QQ郵箱檢測到了我的這種行為,並且很友好的提示了一下,內容忘記了,意思記得,大概是您的QQ郵箱沒有開啟相關服務,不能進行...操作。 如上圖所示,就是這個沒有被勾選,那麼當時我設定選中後,儲存,就能用這個QQ郵箱進
一個c#的與web服務器交互的HttpClient類
指示 all 斷點續傳 www. mod bytearray dex ron 發出 using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Ne
C#調用C++導出類的一個實例
新建 分享圖片 img a* mys cte try namespace 失敗 一直認為帶導出類dll的只有VC自己可以調用,其它編程語言無法調用,今天看到一篇文章才知道自己錯了。https://blog.csdn.net/huiyouyongdeyu2011/articl