Cómo enviar correos electrónicos en C++
1. Las palabras clave de C++ no tienen la función de enviar correos electrónicos. C++ es solo un lenguaje de programación. ?C++ en sí no tiene la función de enviar correos electrónicos. Si desea que envíe correos electrónicos, debe utilizar algunas funciones de la biblioteca C++, marcos, etc. escritos por otros.
2. Rutina: /************************************* *. ********************************?
*¿Enviar archivo de encabezado del módulo de correo? p>
*¿Se pueden enviar textos y archivos adjuntos (se admite el envío de varios archivos adjuntos juntos)?
*********************** * ************************************************* ** */?
#pragma?once?
struct?sMailInfo?//Información de correo?
{?
char *m_pcUserName ;//¿El nombre del buzón de inicio de sesión del usuario?
char*m_pcUserPassWord;//¿La contraseña del buzón de inicio de sesión del usuario?
char*m_pcSenderName;//El nombre mostrado cuando el usuario envía?
p>char*m_pcSender;//¿Dirección de correo electrónico del remitente?
char*m_pcReceiver;//¿Dirección de correo electrónico del destinatario?
char* m_pcTitle;//¿Título del correo electrónico?
char*m_pcBody;//¿Texto del correo electrónico?
char*m_pcIPAddr;//¿IP del servidor?
char*m_pcIPName; //Nombre del servidor (elige uno entre IP y nombre, ¿el nombre tiene prioridad)?
sMailInfo(){memset(this,0,sizeof(sMailInfo));}?
} ;?
clase?CSendMail?
{?
público:?
CSendMail(void);?
~CSendMail(void);?
public:?
bool?SendMail(sMailInfo?&smailInfo);//Para enviar un correo electrónico, necesita inicializar la información del correo electrónico al enviar?
void?AddFilePath(char?*?pcFilePath);//¿Agregar la ruta determinada del archivo adjunto a la lista de archivos adjuntos?
void?DeleteFilePath(char*?pcFilePath );//¿Eliminar la ruta del archivo adjunto, si es así?
void?DeleteAllPath(void);//¿Eliminar la ruta de todos los archivos adjuntos
protegidos:?
void?GetFileName(char* ?fileName,char*?filePath);//¿Obtener el nombre del archivo de la ruta del archivo adjunto?
void?Char2Base64(char*?pBuff64,char*?pSrcBuff ,int?iLen);//Cambiar carácter ¿Convertir el tipo a tipo Base64?
bool?CReateSocket(SOCKET?&sock);//¿Establecer una conexión de socket?
bool?Logon (SOCKET?&sock);// Inicie sesión en el buzón, principalmente ¿Haga los preparativos antes de enviar un correo electrónico?
int?GetFileData(char*?FilePath);// ¿Obtener el contenido del archivo adjunto de la ruta del archivo?
bool?SendHead(SOCKET?&sock); //¿Enviar encabezado de correo electrónico?
bool?SendTextBody(SOCKET?&sock);//¿Enviar cuerpo de texto de correo electrónico?
bool?SendFileBody(SOCKET?&calcetín)
;//¿Enviar archivo adjunto por correo electrónico?
bool?SendEnd(SOCKET?&sock);//¿Enviar correo electrónico final?
protected:?
CList
char?m_cSendBuff[4096];//¿Enviar búfer?
char?m_cReceiveBuff[1024];? p >
char*?m_pcFileBuff;//¿Señalar el contenido del archivo adjunto?
sMailInfo?m_sMailInfo;?
};?
/*** * ************************************************* ** *******************?
*?¿Enviar módulo de correo electrónico?
*Puede enviar texto y archivos adjuntos (admite múltiples archivos adjuntos ¿Enviar juntos)?
*Fecha: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();? p>
}?
void?CSendMail::Char2Base64(char*?pBuff64,char*?pSrcBuff,int?iLen)?
{?
//11111111? p>
//?Asignado a pBuff64? ↑?Asignado a pBuff64+1?
//?¿La ubicación del punto?
static?char?Base64Encode[]? =?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//¿La tabla de caracteres asignada por base64?
int?point;//La posición donde se divide cada carácter fuente puede ser 2, 4 , o 6; el valor inicial es 2?
point=2;?
int?i;?
int?iIndex;//índice de base64 personaje?
char? n=0;//¿Valor residual del carácter fuente anterior?
for(i=0;i {? if(punto==2)? {? iIndex=((*pSrcBuff)>>punto)&0x3f;// ¿Obtuviste el punto culminante de pSrcBuff? }? else?if?(point==4)? {?
p>iIndex=((*pSrcBuff)>>point)&0xf;//¿Obtener el punto más alto de pSrcBuff?
}?
else?if(point==6)?
{?
iIndex=((*pSrcBuff)>>point)&0x3;//¿Obtener el punto más alto de pSrcBuff?
}? p >
iIndex+=n;// ¿Combinado con el punto bajo de pSrcBuff-1 para formar un índice Base64?
*pBuff64++=Base64Encode[iIndex];// ¿Obtener pBuff64 de la tabla de índice?
n=((*pSrcBuff)<<(6-point));//¿Calcular el valor residual en el carácter de origen?
n=n&0x3f;//Asegúrate de que ¿Los dos bits más altos de n son 0?
point+=2;//¿La posición de división del carácter fuente aumenta en 2?
if(point==8)//Si el La posición de división es 8, lo que significa que pSrcBuff tiene 6 bits. El residuo puede formar un carácter Base64 completo, así que ¿combinarlo nuevamente directamente?
{?
iIndex=(*pSrcBuff)&0x3f ;//Extrae los 6 bits inferiores, ¿cuál es el índice?
*pBuff64++=Base64Encode[iIndex];//?
n=0;//El valor residual es 0 ?
point=2;/ /¿Establecer la posición de división en 2?
}?
pSrcBuff++;?
}?
if(n!=0) ?
{?
*pBuff64++=Base64Encode[n];?
}? p>
if(iLen%3==2 )//Si la longitud de la cadena de origen no es múltiplo de 3, ¿usa '=' para completarla?
{?
*pBuff64='=';?
}?
else?if(iLen%3==1)?
{?
*pBuff64++='=';?
*pBuff64='=';?
}?
}
void?CSendMail::AddFilePath(char?*?pcFilePath)/ /¿Agregar ruta del archivo adjunto?
{?
if(pcFilePath==NULL)?
{?
return;? p>
}?
int?i;?
char*?temp;?
for(i=0;i {? temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex( i));? if(strcmp(pcFilePath, temp)==0)//Si ya existe, ¿no es necesario agregarlo? {? return;? }? }? m_pcFilePathList.AddTail(pcFilePath);? }? p> void?CSendMail::DeleteFilePath(char*?pcFilePath)//¿Eliminar ruta del archivo adjunto? {? int?i;? char*?temp;? for(i=0; i List.GetCount();i++)? {? temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));? if(strcmp (temp,pcFilePath)==0)//¿Buscarlo y eliminarlo, olvidarlo si no lo encuentra? {? m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i)); ? eliminar[]?temp;? regresar;? }? }? }? 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(?wVersio nRequested,?&wsaData?);? if?(?err?!=?0?) {? return?false;? p> }? if?(?LOBYTE(?wsaData.wVersion?)?!=?2?||? HIBYTE(?wsaData.wVersion?) ?=?2?)? {? WSACleanup(?);? return?false; }? /p> calcetín?=?socket(AF_INET,SOCK_STREAM,IPPROTO_IP);? if?(calcetín?==?INVALID_SOCKET)? {? p > return?false;? }? sockaddr_in?servaddr;? memset(&servaddr,0,sizeof(sockaddr_in)); servaddr.sin_family?=?AF_INET;? servaddr.sin_port?=?htons(25);//¿El envío de correos electrónicos generalmente es por el puerto 25? if(m_sMailInfo.m_pcIPName=="")? {? servaddr.sin_addr.s_addr?=?inet_addr(m_sMailInfo.m_pcIPAddr);//¿Usar la dirección IP directamente? }? else? {? struct?hostent?*hp=gethostbyname(m_sMailInfo.m_pcIPName);/ / ¿Usar nombre? servaddr.sin_addr.s_addr=*(int*)(*hp->h_addr_list);? }? int?ret ? =?connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));//¿Establecer una conexión? if?(ret?==?SOCKET_ERROR)? { ? retorno?falso;? }? retorno?verdadero;? }? 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);//¿Iniciar sesión? 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));? sprin tf_s(m_cSendBuff,"AUTH?LOGIN\r\n");? send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//¿Solicitar inicio de sesión? recv (calcetín,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);//¿Enviar nombre de usuario? 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 );//¿Enviar contraseña de usuario? recv(sock,m_cReceiveBuff,1024,0);? if(m_cReceiveBuff[0]!='2'?||?m_cReceiveBuff [1]!='3'?||?m_cReceiveBuff[2]!='5')? {? return?false;? }? return?true;//¿Iniciar sesión correctamente? }