Red de conocimiento informático - Computadora portátil - Cómo enviar correos electrónicos en C++

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?

*¿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?m_pcFilePathList;//¿Registrar ruta del archivo adjunto?

char?m_cSendBuff[4096];//¿Enviar búfer?

char?m_cReceiveBuff[1024];?

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();?

}?

void?CSendMail::Char2Base64(char*?pBuff64,char*?pSrcBuff,int?iLen)?

{?

//11111111?

//?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?

}?

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];?

}?

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;?

}?

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;?

}?

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)?

{?

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?

}