Original Article: A set of C++ classes to support the SMTP protocol
Author: Naughter

Naughter Software Logo

smtp.gif (295 bytes)CPJNSMTPConnection v3.28 Um conjunto de classes C ++ para suportar o protocolo SMTP

Bem-vindo ao CPJNSMTPConnection, um conjunto de classes C ++ para suportar o protocolo SMTP. SMTP para aqueles que não estão familiarizados com todos os protocolos da internet é o protocolo usado para enviar e-mails via internet.

Também está incluído nas classes SMTP no download uma classe chamada "CPJNMD5Hash" que fornece o cálculo de hashes MD5 e HMAC usando a API MS Crypto, bem como uma classe chamada "CNTLMClientAuth" que fornece uma implementação do lado do cliente reutilizável para autenticação NTLM.

Importante!: Por favor, note que fui informado de que o CPJNSMTPConnection está sendo usado para desenvolver e enviar correio em massa não solicitado. Esta não foi a intenção do código e o autor proíbe explicitamente o uso do código para qualquer software desse tipo.

Observe que, a partir de v3.09, o código agora é para o Visual C ++ 2013 ou posterior. Não vou mais apoiar o VC 6 para este código, por isso não me envie um e-mail solicitando isso<gg>. Lembre-se de que o VC 6 é agora um compilador de dezenove anos. Agora é hora de atualizar para o VC 2017!

 

Referências

 

Características

  • Interface C ++ simples e limpa.
  • A interface fornecida é síncrona, o que fornece um modelo de programação mais fácil do que o uso de soquetes assíncronos.
  • O código não depende das classes de soquete MFC. Essas classes possuem uma série de falhas, uma das quais causa problemas quando são usadas em serviços NT.
  • O código pode ser usado em um aplicativo de console sem problemas.
  • Um tempo limite configurável para a conexão pode ser configurado através da API da classe.
  • As classes são totalmente compatíveis com Unicode e incluem opções Construídas Unicode no arquivo de espaço de trabalho.
  • A partir de v1.1, as classes agora são totalmente compatíveis com o envio de anexos de arquivos.
  • Multi CC, BCC & resposta ao suporte está incluída.
  • Suporte para formatos regulares de endereço de e-mail e análise de endereço de e-mail múltiplo.
  • Suporte total para MIME e MHTML (também conhecido como HTML Email).
  • Suporte total para MIME Charsets.
  • Programa de amostra abrangente incluído que exerce a maioria das funcionalidades das classes.
  • A partir da v2.61, as classes agora suportam totalmente o envio de e-mail por SSL. Isso significa que, por exemplo, você pode usar o servidor SMTP do Gmail "smtp.gmail.com" na porta 465. Observe também que todos os outros recursos, como a autenticação, são totalmente suportados por SSL. Por exemplo, para usar o Gmail, você precisará de alguma forma de autenticação, como AUTH PLAIN, porque não funciona como um relé aberto (o que facilitaria o spam).
  • Suporta numerosos protocolos de autenticação incluindo "AUTH CRAM-MD5", "AUTH LOGIN", "AUTH PLAIN", "AUTH NTLM" & "AUTH XOAUTH2". Um formulario "Auto Detection" de autenticação também é suportada. Neste modo, os protocolos de autenticação suportados pelo servidor são detectados e o protocolo mais apropriado é usado.
  • A partir da v2.65, as classes incluem suporte abrangente para DSN's (Notificações de status de entrega).
  • A partir da v2.84, as classes incluem suporte para MDN's (Message Disposition Notifications)
  • A partir da v2.86, as classes suportam STARTTLS. Este comando SMTP permite que uma conexão de texto simples SMTP padrão seja feita e, supondo que o servidor SMTP suporte STARTTLS, a conexão pode ser atualizada para um fluxo intermediário de conexão criptografada. Muitas vezes, os servidores SMTP oferecem apenas STARTTLS via porta 25 em vez de SSL / TLS em uma porta diferente.
  • Opcionalmente, aceita codificação de cabeçalho de endereço.
  • A partir do v3.09, as classes são suportadas apenas no VC 2013 ou posterior.
  • A partir da versão v3.18, as classes SMTP agora podem compilar opcionalmente sem MFC. Por padrão, as classes agora usam classes STL e idiomas, mas se você definir CWSOCKET_MFC_EXTENSIONS, as classes retornarão ao comportamento MFC.
  • A partir da versão v3.21, as classes SMTP agora suportam a resposta inicial do cliente (SASL-IR).

 

O arquivo zip fechado contém o código fonte CPJNSMTPConnection e um programa de teste simples para exercer todas as funções que as classes oferecem.

 

Direito autoral

  • Você pode incluir o código-fonte em qualquer produto (comercial, shareware, freeware ou outro) quando seu produto for lançado em forma binária.
  • Você tem permissão para modificar o código-fonte da maneira que desejar, exceto que não pode modificar os detalhes de direitos autorais na parte superior de cada módulo.
  • Se você deseja distribuir o código-fonte com seu aplicativo, você só poderá distribuir versões lançadas pelo autor. Isto é para manter um único ponto de distribuição para o código-fonte.
  • Importante!!: Por favor, note que fui informado de que o CPJNSMTPConnection está sendo usado para desenvolver e enviar correio em massa não solicitado. Esta não foi a intenção do código e o autor proíbe explicitamente o uso do código para qualquer software desse tipo sem o meu consentimento explícito por escrito.

 

Atualizações

V3.28 (18 de dezembro de 2017)

  • Atualizou o código para compilar limpa quando _ATL_NO_AUTOMATIC_NAMESPACE é definido.

V3.27 (9 de setembro de 2017)

  • Substituído CString::operator LPC*STR() chamadas em toda a base do código com chamadas CString::GetString.

V3.26 (2 de maio de 2017)

  • Corrigido um erro no método CNTLMClientAuth :: NTLMAuthenticate quando CNTLMCLIENTAUTH_MFC_EXTENSIONS é definido. Obrigado a Darron Redman por ter relatado esse problema.

V3.25 (28 de abril de 2017)

  • Atualizou o código para compilar de forma limpa usando /permissive-.

V3.24 (14 April 2017)

  • Detalhes atualizados dos direitos autorais.
  • Código atualizado para compilação limpa no VC 2017

V3.23 (14 de novembro de 2016)

  • Atualizado o caminho de código não MFC em CNTLMClientAuth :: NTLMAuthenticate para manipular um parâmetro NULL pszUsername que está sendo passado. Graças a Christopher Craft por relatar este problema.
  • Removido validação desnecessária de pszUsername & Parâmetros pszPassword em CPJNSMTPConnection :: ConnectESMTP. Graças a Christopher Craft por relatar este problema.
  • Validação adicionada de pszUsername & pszPassword parametros em CPJNSMTPConnection::AuthLogin, CPJNSMTPConnection::AuthPlain & CPJNSMTPConnection::AuthCramMD5 metodos. Graças a Christopher Craft por relatar este problema.
  • Melhorou as anotações SAL no método CPJNSMTPConnection :: ConnectESMTP
  • CPWNSMTPBodyPart reformulado: ConvertToUTF8 para usar ATL :: CW2A

V3.22 (13 de outubro de 2016)

  • Corrigido um erro na declaração da classe CPJNSMTPConnection quando o valor do préprocessador CPJNSMTP_NONTLM é definido. Graças a Chris Korda por relatar este problema.
  • Forneceu uma nova sobrecarga do método CPJNSMTPBodyPart :: AddChildBodyPart para permitir que um corpo já atribuído ao heap fosse adicionado.
  • Fornecido uma nova sobrecarga do método CPJNSMTPBodyPart :: InsertChildBodyPart para permitir que um corpo já atribuído ao heap fosse adicionado.
  • Fez a maioria dos métodos do CPJ SMTP BodyPart virtual para permitir a personalização mais fácil do usuário final de sua funcionalidade.
  • Forneceu uma nova sobrecarga do método CPJNSMTPMessage :: AddChildBodyPart para permitir que um corpo já atribuído ao heap fosse adicionado.
  • Forneceu uma nova sobrecarga do método CPJNSMTPMessage :: InsertChildBodyPart para permitir que um corpo já atribuído ao heap fosse adicionado.
  • Fez a maioria dos métodos de CPJ SMTPMessage virtual para permitir a personalização mais fácil do usuário final de sua funcionalidade.

V3.21 (19 de setembro de 2016)

  • Adicionado suporte para autenticação XOAUTH2. Para obter mais informações sobre este mecanismo de autenticação SMTP, consulte https://developers.google.com/gmail/xoauth2_protocol.
  • Reabasteceu o CPJNSMTPConnection :: AuthPlain para fornecer o ID do usuário no valor da identidade de autorização. Esta é uma forma mais compatível da solicitação de autenticação e evita problemas usando AuthPlain contra os servidores SMTP do Gmail.
  • Suporte de resposta inicial ao cliente inicial (SASL-IR) ao AuthLogin, AuthPlain & AuthXOAUTH2 métodos. Para mais informações sobre SASL-IR, consulte https://tools.ietf.org/html/rfc4959.

V3.20 (19 de agosto de 2016)

  • Reabasteceu o CPJNSMTPException :: GetErrorMessage para não incomodar colocar a última resposta no texto da mensagem de erro de retorno.
  • CPJNSMTP A classe de conexão agora está protegida herdada de SSLWrappers :: CSocket.

V3.19 (17 de agosto de 2016)

  • Classe de CPJNSMTPConnection reformulada a ser herdada de SSLWrappers :: CSocket. Isso permite uma sobrecarga mais fácil das várias funções virtuais da estrutura de classes do SSLWrappers

V3.18 (11 de agosto de 2016)

  • Reworked as classes SMTP para compilar opcionalmente sem MFC. Por padrão, as classes agora usam classes STL e idiomas, mas se você definir CWSOCKET_MFC_EXTENSIONS as classes retornarão ao comportamento MFC.
  • Reabasteceu a classe CPJNSMPTBase64Encode para usar ATL :: CHeapPtr.
  • Reabasteceu a classe CPJNSMPTQPEncode para usar ATL :: CHeapPtr.
  • Reabasteceu a classe CPJNSMPTQEncode para usar ATL :: CHeapPtr.
  • Adicionou anotações de SAL a todo o código.
  • CPJNSMTPBodyPart :: ConvertToUTF8 agora usa internamente ATL :: CHeapPtr.
  • A variável de membro CPJNSMTPMessage :: m_CustomHeaders é agora pública. Como tal, o AddCustomHeader, GetCustomHeader, GetNumberOfCustomHeaders & Os métodos RemoveCustomHeader foram removidos.
  • Código desnecessário removido que captura e recomeça uma exceção CPJNSMTPException da versão de CPJNSMTPConnection :: SendMessage que envia uma mensagem de um buffer de memória.
  • Reworked o método CPJNSMTPMessage :: ParseMultipleRecipients para evitar o uso do novo alocador C ++.
  • Reabasteceu o método CPJNSMTPMessage :: AddMultipleAttachments para evitar o uso do novo alocador C ++.
  • Reabasteceu o aplicativo de exemplo para exercer o método SendMessage que envia de um buffer de memória.
  • Removido comentários difundidos sobre o VC 6 na classe CPJNMD5.
  • Reabasteceu a classe CPJNMD5 para compilar opcionalmente sem MFC. Por padrão, a classe agora usa classes STL e idiomas, mas se você definir CPJNMD5_MFC_EXTENSIONS as classes retornarão ao comportamento MFC.
  • Reabasteceu a classe CNTLMClientAuth para opcionalmente compilar sem MFC. Por padrão, a classe agora usa classes STL e idiomas, mas se você definir CNTLMCLIENTAUTH_MFC_EXTENSIONS a classe retornará ao comportamento MFC.

V3.17 (12 de maio de 2016)

  • Detalhes atualizados dos direitos autorais.
  • Atualização menor para o aplicativo de exemplo para se referir a "SSL / TLS" na caixa de diálogo de configuração.
  • Verificado o código compila limpa usando VC 2015.

5 de dezembro de 2015

V3.16 (1 de junho de 2015)

  • Método CPJNSMTPMessage removido não utilizado :: ConvertHTMLToPlainText.
  • Removido a ligação no diálogo de configuração do aplicativo de teste entre enviar uma mensagem com um corpo HTML e exigir que a mensagem seja codificada em MIME.
  • Removido o código do aplicativo de teste que adicionou um anexo de texto simples à mensagem em compilações de depuração.
  • Atualizado CPJNSMTPMessage :: AddHTMLBody para lidar com o caso em que a mensagem não está codificada MIME. Neste caso, a parte do corpo raiz da mensagem é simplesmente definida como HTML. Graças a Thane Hubbell por relatar este problema.

V3.15 (29 de março de 2015)

  • Atualizado CPJNSMTPConnection :: AuthLogin para lidar com mais variantes de "username:" e "password:" respostas do servidor SMTP. Obrigado a Wang Le por relatar este problema.

V3.14 (1 de março de 2015)

  • O método DoEHLO foi atualizado para verificar os requisitos do DSN. Esta alteração significa que o código irá se conectar a um EHLO em vez de HELO quando um DSN for solicitado. O código agora também verificará se os DSN são suportados pelo servidor ao tentar enviar o DSN. Se o servidor não suportar DSN neste cenário, uma nova exceção personalizada será lançada pelo código no método CPJNSMTPConnection :: FormMailFromCommand. Isso garante que o código se comporte mais consistentemente em relação ao DSN RFC. Graças a Philip Mitchell por solicitar esta atualização.
  • Altere o valor de enum para CPJNSMTPMessage :: DSN_NOT_SPECIFIED para 0 de 0xFFFFFFFF.

10 de fevereiro de 2015

V3.13 (31 de janeiro de 2015)

  • Corrigido um erro no CPJNSMTPException :: GetErrorMessage onde não usaria o valor HRESULT completo ao chamar FormatMessage. Obrigado a Bostjan Erzen por ter relatado este problema.
  • Melhorou o tratamento de erros no CPJNSMTPConnection :: Connect quando ocorrem erros de conexão SSL. Obrigado a Bostjan Erzen por ter relatado este problema.
  • Melhorou o tratamento de erros no CPJNSMTPConnection :: DoSTARTTLS quando ocorrem erros de conexão SSL. Obrigado a Bostjan Erzen por ter relatado este problema.

V3.12 (25 de janeiro de 2015)

  • Adição de métodos CPJNSMTPBodyPart :: InsertChildBodyPart e CPJNSMTPMessage :: InsertBodyPart. Esses novos métodos inserem uma parte do corpo como o primeiro elemento na hierarquia das partes do corpo infantil em vez do fim. Além disso, os métodos CPJNSMTPMessage :: AddTextBody e CPJNSMTPMessage :: AddHTMLBody agora chamam CPJNSMTPBodyPart :: InsertChildBodyPart em vez de CPJNSMTPBodyPart :: AddChildBodyPart para garantir que a parte do texto do corpo da mensagem SMTP apareça como a primeira parte do corpo infantil. Isso ajuda a evitar problemas em que o Microsoft Exchange modifica mensagens de várias partes onde o texto do corpo é movido para um anexo chamado ATT00001: para mais informações, consulte http://kb.mit.edu/confluence/pages/viewpage.action?pageId=4981187 e http://support2.microsoft.com/kb/969854. Graças a Marco Veldman por relatar este problema.
  • Suporte removido para o protocolo SSL DTLSv1, pois isso não é aplicável ao SMTP, pois DTLS foi projetado para UDP e não TCP. Esta remoção ajuda a resolver um problema em que o código não compila no VC 2013 se você usou o "Visual Studio 2013 - Windows XP (v120_xp)" Conjunto de ferramentas da plataforma. Obrigado a Bostjan Erzen por ter relatado este problema.

V3.11 (16 de janeiro de 2015)

  • Detalhes atualizados dos direitos autorais
  • CPJNSMTPMessage :: m_ReplyTo é agora uma matriz em vez de um único endereço. Obrigado a Bostjan Erzen por sugerir esta atualização.

V3.10 (16 de dezembro de 2014)

  • Atualizou o código para usar a versão mais recente do SSLWrappers v1.03

16 de dezembro de 2014

V3.09 (14 de dezembro de 2014)

  • Atualizou o código para usar as classes SSLWrappers do autor (http://www.naughter.com/sslwrappers.html) para fornecer a funcionalidade SSL para PJNSMTP em vez de OpenSSL. Por favor, note que as próprias classes SSLWrappers dependem das classes CryptoWrappers do autor (http://www.naughter.com/cryptowrappers.html) Além disso. Você precisará baixar essas duas bibliotecas e copiar seus módulos para o diretório PJNSMTP. Observe também que as classes SSLWrappers e CryptoWrapper são suportadas apenas no VC 2013 ou posterior, o que significa que o suporte SSL PJNSMTP só é suportado quando você compila com o VC 2013 ou posterior. Os arquivos de solução incluídos no download agora são para VC 2013.
  • Com a alteração ao uso de SSLWrappers, o código agora pode suportar sabores adicionais do protocolo SSL. Eles são: SSL v2 por conta própria, SSL v3 por conta própria, o OS SChannel SSL padrão e AnyTLS. Consulte o CPJNSMTPConnection :: SSLProtocol enum para obter mais detalhes. O aplicativo de amostra foi atualizado para permitir que esses valores sejam usados e o valor de enumínio padrão agora é "OSDefault".

V3.08 (18 de novembro de 2014)

  • Corrigido um erro no CPJNSMTPBodyPart :: GetBody onde os anexos de arquivos sempre foram tratados como 0 em tamanho. Obrigado a Oliver Pfister por ter relatado este problema.

V3.07 (15 de novembro de 2014)

  • CNTLMClientAuth agora usa uma dependência estática em Secure32.dll em vez de usar GetProcAddress.
  • O CNTLMClientAuth agora chama QuerySecurityPackageInfo para determinar o tamanho do buffer para usar.
  • A macro SEC_SUCCESS já foi feita um método chamado "SEC_SUCCESS".
  • Limpeza geral do método CNTLMClientAuth :: GenClientContext
  • Transformou o destruidor CNTLMClientAuth virtual.
  • Removido o método extinto CPJNSMTPBodyPart :: HexDigit.
  • Reabasteceu o método CPJNSMTPBodyPart :: GetBody para usar ATL :: CAtlFile e ATL :: CHeapPtr
  • CPJNSMTPConnection agora usa uma dependência estática do Wininet.dll em vez de usar GetProcAddress.
  • CPJNSMTPConnection agora usa uma dependência estática em Dnsapi.dll em vez de usar GetProcAddress.
  • O tempo limite padrão definido no construtor CPJNSMTPConnection é agora 60 segundos para ambas as compilações de depuração e lançamento
  • Removido o método defacto CPJNSMTPConnection :: MXLookupAvailable
  • Removido o valor do préprocessador CPJNSMTP_NOMXLOOKUP já extinto
  • Removido o agora extinto módulo PJNLoadLibraryFromSystem32.h da distribuição
  • CPJNSMTPConnection :: SendMessage foi reformulado para usar ATL :: CAtlFile e ATL :: CHeapPtr
  • CPJNSMTPConnection :: SendMessage agora faz uma conversão UTF-8 no corpo do e-mail ao enviar um e-mail simples, ou seja, sem HTML ou mime se o charset for UTF-8. Obrigado a Oliver Pfister por ter relatado este problema.
  • O aplicativo de exemplo foi atualizado para compilar de forma limpa na VS 2013 Update 3 e superior
  • O aplicativo de exemplo fornecido com o código-fonte agora é Visual Studio 2008 e, a partir desta versão, o código só é suportado no Visual Studio 2008 e posterior
  • O aplicativo de exemplo agora está vinculado contra as dlls mais recentes do OpenSSL v1.0.1j

V3.06 (13 de abril de 2014)

V3.05 (9 de fevereiro de 2014)

  • Corrigido um problema de compilação no método CreateSSLSocket quando a macro do pré-processador CPJNSMTP_NOSSL é definida.
  • Reworked a lógica que faz SecureZeroMemory em dados de string sensíveis 

V3.04 (26 de janeiro de 2014)

  • Lógica ASSERT atualizada na parte superior do método ConnectESMTP. Obrigado a Jean-Christophe Voogden por ter relatado este problema.

V3.03 (5 de janeiro de 2014)

  • O método ConvertToUTF8 agora também lida com conversão de dados ASCII para UTF8. Obrigado a Jean-Christophe Voogden por esta atualização.
  • A classe CPJNSMTPConnection agora fornece métodos Set / GetSSLProtocol. Isso permite que o código do cliente especifique o sabor exato do SSL que o código deve falar. Os protocolos suportados são SSL v2 / v3, TLS v1.0, TLS v1.1, TLS v1.2 e DTLS v1.0. Isso é necessário para alguns servidores SMTP que usam o protocolo SSLv2 ou v3 em vez do protocolo TLS v1 mais moderno. O padrão é usar TLS v1.0. Talvez seja necessário usar esta configuração de compatibilidade para pessoas que gostam de servidores SMTP IBM Domino, que apenas oferecem suporte à configuração SSLv2 / v3 anterior. Obrigado a Jean Christophe Voogden por esta atualização.
  • Removido todos os métodos de conexão de proxy, pois eles não podem ser facilmente suportados / testados pelo autor.
  • Reworked o código em CPJNSMTPConnection :: ConnectESMTP para lidar com todas as variantes da resposta 250, bem como operar caso insensivelmente, o que é exigido pelo RFC ESMTP.
  • Fez mais métodos virtuais para facilitar a personalização do cliente
  • Corrigido um problema no método DoSTARTTLS onde o soquete seria deixado em um estado conectado se a negociação SSL falhar. Isso resultaria em código posterior que enviou o soquete durante a suspensão da fase de corte. Obrigado a Jean-Christophe Voogden por ter relatado este problema.
  • O aplicativo de exemplo agora está vinculado às dlls mais recentes do OpenSSL v1.0.1f.

V3.02 (5 de janeiro de 2014)

  • Detalhes atualizados dos direitos autorais.
  • Atualizou o código para limpar a compilação no VC 2013
  • Corrigido um problema com NTLM auth onde o código não configurou corretamente o"m_nSize" valor do parâmetro corretamente no CPJNSMPTBase64Encode :: Encode & Decodificar. Obrigado a John Pendleton por relatar este erro.

7 de junho de 2013

  • Atualização menor para o aplicativo de exemplo para corrigir um erro de ortografia na string de tipo de conexão na caixa de diálogo de configuração. Graças a "don" por relatar este problema.

V3.01 (3 de junho de 2013)

  • O aplicativo de demonstração agora desativa a caixa de seleção MIME depois de verificar se o e-mail deve ser enviado como HTML.
  • Corrigido um erro no aplicativo de exemplo onde o tipo mime da parte do corpo raiz seria incorretamente configurado para uma string vazia quando ele deveria usar o padrão que é "multipart/mixed". Obrigado a Ting L por relatar este erro. 

V3.00 (12 de março de 2013)

  • Detalhes atualizados dos direitos autorais.
  • CPJNSMTPAddressArray typedef agora está definido na classe CPJNSMTPMessage em vez de no namespace global. Além disso, esta classe typedef é agora conhecida comoCPJNSMTPAddressArray typedef agora está definido na classe CPJNSMTPMessage em vez de no namespace global. Além disso, esta classe typedef é agora conhecida como "CAddressArray"
  • O projeto de exemplo incluído no download agora vincula as várias bibliotecas OpenSSL via define em stdafx.h em vez de através das configurações do projeto. Graças a Ed Nafziger por sugerir esta boa adição.
  • O aplicativo de exemplo não adiciona mais o endereço hotmail do autor à lista de MDNs. Obrigado a Ed Nafziger por ter observado isso.
  • O aplicativo de exemplo agora está vinculado às dlls mais recentes do OpenSSL v1.0.1e.
  • Exemplo de aplicativo agora estáticamente vinculado ao MFC

V2.99 (25 de novembro de 2012)

  • Corrigido alguns problemas no código quando CPJNSMTP_NOSSL foi definido. Parece suporte para a compilação sem suporte SSL, foi interrompido por algumas versões. Obrigado a Bostjan Erzen por ter relatado este problema.

V2.98 (30 de setembro de 2012)

  • Atualizou o código para evitar problemas de segurança de plantação de DLL ao chamar LoadLibrary. Obrigado a Mat Berchtold por ter relatado esse problema.
  • Um arquivo de cabeçalho chamado "PJNLoadLibraryFromSystem32.h" agora está incluído, que fornece uma versão do LoadLibrary que carrega uma DLL sem qualquer informação do caminho do diretório do sistema Windows. Isso ajuda a evitar problemas de segurança de plantio de DLL em seu aplicativo quando você chama LoadLibrary com um nome de módulo sem qualquer informação de caminho.

V2.97 (24 de setembro de 2012)

  • Removido uma linha desnecessária de código de CPJNSMTPConnection :: SendRCPTForRecipient. Obrigado a Mat Berchtold por ter relatado esse problema. 

V2.96 (23 de setembro de 2012)

  • Os métodos de SetContentBase e GetContentBase removidos como cabeçalho Content-Base são obsoletos do MHTML. Para detalhes, veja http://www.ietf.org/mail-archive/web/apps-discuss/current/msg03220.html. Obrigado a Mat Berchtold por ter relatado esse problema.
  • Removido o parâmetro agora extinto do método AddHTMLBody.
  • Removido o método FoldHeader como foi usado apenas pelo cabeçalho m_sXMailer.
  • Atualizou a lógica no método FolderSubjectHeader para lidar corretamente com a última linha de texto para dobrar.

14 de setembro de 2012

V2.95 (12 August 2012)

  • O código de suporte do STARTTLS agora usa TLSv1_client_method função OpenSSL em vez de SSLv23_client_method. Isso corrige um problema no qual o envio de emails usando o Hotmail / Windows Live estava falhando.
  • CPJNSMTPConnection :: _ Close agora fornece um parâmetro bGracefully
  • Atualizou o código para limpar a compilação no VC 2012
  • O aplicativo de exemplo agora está vinculado contra o OpenSTLL v1.0.1c dlls.
  • SendMessage agora lança uma CPJNSMTPException se OnSendProgress retornar FALSE.
  • Adição de um novo tipo de conexão chamado "AutoUpgradeToSTARTTLS" que atualizará automaticamente uma conexão de texto simples para STARTTLS se o código detectar que o servidor SMTP suporte STARTTLS. Se o servidor não suportar STARTTLS, a conexão permanecerá como se você especificasse "PlainText"
  • Reworked o código para determinar se deve se conectar usando EHLO em vez de HELO em um novo método virtual chamado DoEHLO.
  • Reworked o interno do método ConnectESMTP.

2 de fevereiro de 2012

V2.94 (4 de dezembro de 2011)

  • Atualizado CPJNSMTPBodyPart :: GetHeader para codificar o título de um nome de arquivo se contiver caracteres não-ASCII. Obrigado a Anders Gustafsson por ter relatado este problema.
  • O aplicativo de exemplo agora está vinculado às dlls OpenSTL v1.0.0e.  

V2.93 (1 de abril de 2011)

  • Reintroduziu o conceito de codificação do cabeçalho de endereço. Por padrão, esta configuração está desativada, mas pode ser ativada através de um novo valor booleano CPJNSMPTMessage :: m_bAddressHeaderEncoding. Obrigado a Bostjan Erzen por ter relatado este problema.
  • O aplicativo de exemplo agora está vinculado às últimas dlls OpenSSL v1.0.0d

V2.92 (13 de fevereiro de 2011)

  • Remova o parâmetro de endereço de ligação IP do método Connect, já que já havia suporte para ligação através dos métodos Set / GetBoundAddress.
  • Set / GetBoundAddress foi renomeado Set / GetBindAddress para obter consistência com a classe sockets

V2.91 (8 de fevereiro de 2011)

  • Detalhes atualizados dos direitos autorais
  • Código atualizado para suportar a última classe SSL e Sockets do autor. Isso significa que o código agora suporta servidores IPv6 SMTP
  • O método Connect agora permite a ligação a um endereço IP específico

V2.90 (18 de dezembro de 2010)

  • Removido os métodos Set / GetQuotedPrintable e Set / GetBase64 de CPJNSMTPBodyPart e os substituiu por novos métodos Set / GetContentTransferEncoding que funcionam com um enum simples.
  • CPJNSMTPBodyPart :: SetAttachment e CPJNSMTPBodyPart :: SetFilename agora define automaticamente o Content-Transfer-Encoding para base64 para anexos. Obrigado a Christian Egging por ter relatado este problema.
  • O aplicativo de exemplo agora está vinculado contra as dlls mais recentes do OpenSSL v1.0.0c

V2.89 (28 de novembro de 2010)

  • AddTextBody e AddHTMLBody agora permitem que o tipo MIME da parte do corpo raiz seja alterado. Graças a Thane Hubbell por solicitar esta atualização.
  • Adicionado um método CPJNSMTPBodyPart :: GetBoundary.
  • Adicionado algum código de exemplo ao construtor CPJNSMTPAppDlg do aplicativo exemplo para mostrar como criar uma mensagem usada partes do corpo SMTP. Graças a Thane Hubbell por solicitar esta atualização.
  • CPJNSMTPBodyPart :: GetHeader agora permite que os anexos citados e imprimíveis sejam usados
  • O aplicativo de exemplo agora está vinculado às dlls mais recentes do OpenSSL v1.0.0b

V2.88 (10 de julho de 2010)

  • Após comentários de vários usuários do PJNSMTP, incluindo Chris Bamford e "loggerlogger", a mudança de "multipart/mixed" para "multipart/alternative" agora foi revertido. Usando "multipart/mixed" é um valor mais apropriado para usar. Testes por vários clientes mostraram que esta configuração funciona corretamente ao enviar e-mails baseados em HTML no GMail, Thunderbird e Outlook. Infelizmente, este é o preço que devo pagar quando aceito contribuições de usuários finais para minha base de código que não posso testar facilmente. Indo para a frente, pretendo ser muito mais discernidor sobre as modificações que vou aceitar para evitar esses problemas.
  • O CPJNSMTPBodyPart agora tem o conceito de se ou não o corpo é considerado um anexo. Anteriormente, o código assumiu que se você definir o parâmetro m_sFilename que a parte do corpo era um anexo. Em vez disso, o código usa o "m_bAttachment" variável de membro. Isso permite que uma representação em memória de um anexo seja adicionada a uma mensagem sem a necessidade de gravá-la primeiro em um arquivo intermediário. Por exemplo, aqui seria a série de etapas que você precisaria passar para adicionar uma imagem jpeg na memória a um e-mail e que ele apareça como um anexo:

    const BYTE* pInMemoryImage = pointer para a sua imagem;
    DWORD dwMemoryImageSize = tamanho em bytes de pInMemoryImage;
    CPJNSMPTBase64Encode encode;
    encode.Encode(pInMemoryImage, dwMemoryImageSize, ATL_BASE64_FLAG_NONE);
    CPJNSMTPBodyPart imageBodyPart;
    imageBodyPart.SetRawBody(encode.Result());
    imageBodyPart.SetBase64(TRUE);
    imageBodyPart.SetAttachment(TRUE);
    imageBodyPart.SetContentType(_T("image/jpg"));
    imageBodyPart.SetTitle(_T("the name of the image"));
    CPJNSMTPMessage message;
    message.AddBodyPart(imageBodyPart);

    Graças a Stephan Eizinga por sugerir esta boa adição. 

V2.87 (4 de junho de 2010)

  • Atualizou o aplicativo de código e exemplo para compilar de forma limpa quando CPJNSMTP_NOSSL é definido. Graças a "loggerlogger" por relatar este problema.

V2.86 (23 de maio de 2010)

  • Detalhes atualizados dos direitos autorais
  • Aplicativo de exemplo atualizado para compilar de forma limpa no Visual Studio 2010
  • O aplicativo de exemplo agora está vinculado contra as dlls mais recentes do OpenSSL v1.0.0
  • Removido um não utilizado "sRet" variável em CPJNSMTPConnection :: AuthCramMD5. Graças a Alain Danteny por relatar este problema
  • Substituiu todas as chamadas para memcpy com memcpy_s
  • O código agora suporta criptografia STARTTLS conforme definido no RFC 3207
  • Se a chamada para DnsQuery falhar, o valor do erro agora é preservado usando SetLastError
  • AddTextBody agora define o tipo mime da parte do corpo raiz multipart / alternative. Este é um valor mais apropriado para usar, que é melhor suportado por mais clientes de e-mail. Graças a Thane Hubbell por relatar este problema.

V2.85 (17 de dezembro de 2009)

  • O aplicativo de exemplo agora está vinculado com as dlls mais recentes do OpenSSL v0.9.8l
  • Atualizou o código de exemplo na documentação para melhor descrever como usar as várias classes. Obrigado a Dionisis Kofos por ter relatado este problema.

V2.84 (13 de novembro de 2009)

  • Agora inclui suporte abrangente para MDN's (Message Disposition Notifications) conforme especificado no RFC 3798. Graças a Ron Brunton por solicitar esta atualização.
  • Reescreveu o método CPJNSMTPMessage :: SaveToDisk para usar o CAtlFile

V2.83 (28 de junho de 2009)

  • Detalhes atualizados dos direitos autorais
  • Corrigido um erro onde o endereço de e-mail Responder-Para não foi adicionado corretamente à mensagem. Graças a Dmitriy Maksimov por relatar este problema.
  • Atualizou as configurações do projeto do aplicativo de amostra para valores padrão mais modernos.
  • Atualizou a amostra exe para enviar com o OpenSSL v0.98k
  • Corrigido um bug no CPJNSMTPConnection :: SendBodyPart onde isso causaria erros do OpenSSL ao tentar enviar um corpo de 0 bytes de tamanho. Isso pode ocorrer quando os e-mails baseados em MHTML são enviados e você está usando um "multipart/related" parte do corpo. Graças a "atota" por relatar este problema

V2.82 (6 de novembro de 2008)

  • Para melhores propósitos de compatibilidade com servidores de correio SMTP existentes, todos os cabeçalhos de mensagens que incluem endereços de e-mail agora não são codificados em Q. Obrigado a Christian Egging por ter relatado este problema.
  • Uso otimizado da classe CT2A em todo o código

V2.81 (2 de novembro de 2008)

  • Melhorias para CPJNSMTPAddress construtor que usa uma única string. O código agora remove citações redundantes.
  • CPJNSMTPAddress :: GetRegularFormat agora forma a forma regular do endereço de e-mail antes que ele o codifique.
  • O aplicativo de exemplo agora usa DPAPI para criptografar o nome de usuário & configurações de senha.
  • O aplicativo de exemplo agora está vinculado às últimas dlls do OpenSSL v0.9.8i.
  • Referências de codificação atualizadas na documentação html. Além disso, o arquivo zip agora inclui as dll OpenSSL. Graças a Michael Grove por relatar esses problemas.

V2.80 (16 de agosto de 2008)

  • Updated the AUTH_AUTO login support to fall back to no authentication if no authentication scheme is supported by the SMTP server. Thanks to Mat Berchtold for this update.

V2.79 (27 July 2008)

  • O código atualizado para compilar corretamente usando _ATL_CSTRING_EXPLICIT_CONSTRUCTORS define
  • CPJNSMTPMessage :: GetHeader agora corretamente garante que todos os cabeçalhos longos sejam corretamente dobrados. Além disso, esta função foi retrabalhada para criar o cabeçalho internamente como uma seqüência ASCII em vez de como um estilo TCHAR CString.

V2.78 (20 de julho de 2008)

  • Corrigido um erro na ReadResponse onde o código está determinando se recebeu o terminador. Graças a Tony Cool por relatar este erro.

V2.77 (31 de maio de 2008)

  • Código agora compila limpa usando Análise de Código (/analyze)
  • Removido o uso da função QuotedPrintableEncode e substituído por ATL :: QPEncode
  • Removed the use of the function QEncode and replaced with ATL::QEncode
  • ReadResponse Reworked para usar CStringA de acordo com a implementação na classe POP3 do autor.

V2.76 (1 de março de 2008)

  • Os valores de enumeração de prioridade CPJNSMTP, especificamente NO_PRIORITY, foram renomeados para evitar conflitos com um #define do mesmo nome no arquivo de cabeçalho SDK do Windows WinSpool.h. Os valores de enum para DSN_RETURN_TYPE também foram renomeados para manter a consistência. Obrigado a Zoran Buntic por ter relatado este problema.
  • Problemas de compilação corrigidos relacionados às mudanças recentes na classe Base64. Obrigado a Mat Berchtold por ter relatado esse problema.
  • Como o código agora é para o VC 2005 ou posterior, o código agora usa o suporte de codificação Base64 do arquivo de cabeçalho ATL atlenc.h. Graças a Mat Berchtold por relatar esta otimização. Isso significa que os projetos de clientes não precisam mais incluir o Base64.cpp / h em seus projetos.

V2.75 (2 de fevereiro de 2008)

  • Detalhes atualizados dos direitos autorais.
  • Corrigido um erro no CPJNSMTPMessage :: FormDateHeader onde às vezes um inválido "Date:" o cabeçalho é criado. O bug irá manifestar-se para qualquer lugar que esteja à frente do GMT, onde a diferença não é um múltiplo de uma hora. De acordo com o miniaplicativo do fuso horário do Windows, este erro ocorreria em: Teerã, Kabul, Chennai, Kolkata, Mumbai, Nova Deli, Sri Jayawardenepura, Catmandu, Yangon, Adelaide e Darwin. Graças a Selwyn Stevens por relatar esse bug e fornecer a correção.

V2.74 (31 de dezembro de 2007)

  • Atualizou o aplicativo de exemplo para limpar a compilação no VC 2008
  • Corrigido um x64 compilar problemas em RemoveCustomHeader & AddMultipleAttachments.
  • Corrigido um problema de compilação x64 em CPJNSMTPAppConfigurationDlg :: CBAddStringAndData
  • CPJNSMTPException :: GetErrorMessage agora usa Checked :: tcsncpy_s
  • Outras atualizações de codificação menores para CPJNSMTPException :: GetErrorMessage

V2.73 (24 de dezembro de 2007)

  • CPJNSMTPEception :: GetErrorMessage agora usa o sinalizador FORMAT_MESSAGE_IGNORE_INSERTS. Para mais informações, consulte o blog de Raymond Chen em http://blogs.msdn.com/oldnewthing/archive/2007/11/28/6564257.aspx. Obrigado a Alexey Kuznetsov por relatar este problema.
  • Todas as seqüências de caracteres de senha de nome de usuário e senha agora são destruídas de forma segura usando o SecureZeroMemory.

V2.72 (23 de dezembro de 2007)

  • Após o feedback de Selwyn Stevens que o mecanismo AUTH PLAIN estava falhando para ele ao tentar enviar correio usando o servidor SMTP do Gmail, eu decidi voltar e pesquisar de novo a área de autenticação SMTP<g>. Acontece que a forma como eu estava implementando o suporte AUTH PLAIN não era o mesmo que o especificado nos RFCs relevantes. O código agora foi atualizado para ser compatível com o especificado no RFC. Eu confirmei a correção como funcionando corretamente usando o servidor de correio SMTP do Gmail em "smtp.gmail.com" na porta SMTP / SSL de 465. Aproveitei também a oportunidade de atualizar a documentação para incluir uma seção com links para vários RFCs e páginas da Web para material de referência de fundo

V2.71 (19 de novembro de 2007)

  • A "Date:" o cabeçalho agora é formado usando matrizes de pesquisa estática para o dia da semana e mês em vez de usar CTime :: Format. Isso ajuda a evitar gerar cabeçalhos de Data inválidos na versão não inglesa do Windows, onde as versões de idioma local dessas seqüências terminariam sendo usadas. Graças aos comentários na página do códigoprojeto para o código (especificamente http://www.codeproject.com/internet/csmtpconn.asp?df=100&forumid=472&mpp=50&select=2054493#xx2054493xx por relatar este problema).

V2.70 (13 de novembro de 2007)

  • Atualização importante para o código para usar os recursos específicos do VC2005. Esta versão do código e as versões seguintes serão suportadas somente no VC 2005 ou posterior. Obrigado a Andrey Babushkin por solicitar esta atualização. Observe que houve alterações de quebra nos nomes e layout de vários métodos e variáveis de membros. Você deve analisar cuidadosamente o aplicativo de exemplo incluído no download, bem como o código do seu cliente para as atualizações necessárias que você precisará fazer.
  • O aplicativo de exemplo incluído no download agora é compilado para o Unicode e liga dinamicamente ao MFC. Ele também liga dinamicamente às últimas dlls OpenSSL 0.9.8g.

V2.67 (1 de agosto de 2007)

  • Os métodos AuthCramMD5, ConnectESMTP, ConnectSMTP, AuthLogin e AuthPlain já foram feitos virtuais..
  • Agora inclui suporte para um protocolo de autenticação automática. Isso irá detectar quais métodos de autenticação o servidor SMTP suporta e usa o "mais seguro" método disponível. Se você não concorda com a ordem em que o protocolo é escolhido, uma função virtual chamada "ChooseAuthenticationMethod" tem sido fornecido. Graças a "zhangbo" por fornecer esta adição muito boa ao código.
  • Removido a definição para o extinto método "AuthNTLM".

V2.66 (30 de março de 2007)

  • Corrigido um erro na conexão do CPJNSMTP :: Defina o nome do host do Helo onde uma variável de pilha não inicializada poderia potencialmente ser usada. Obrigado a Anthony Kowalski por ter relatado esse erro.
  • Detalhes atualizados dos direitos autorais.

V2.65 (11 November 2006)

  • Reverted CPJNSMTPException :: GetErrorMessage para usar a localidade padrão do sistema. Isso é consistente com o modo como o MFC faz o próprio tratamento de erros.
  • Agora inclui suporte abrangente para DSN's (Notificações de status de entrega) conforme especificado na RFC 3461. Graças a Riccardo Raccuglia por solicitar esta atualização.
  • CPJNSMTPBodyPart :: GetBody e CPJNSMTPConnection :: SendMessage (const CString& sMessageOnFile ... agora não abre o arquivo de disco para acesso de leitura exclusivo, o que significa que outros aplicativos podem ler do arquivo. Graças a Wouter Demuynck por relatar este problema.
  • Corrigido um problema no CPJNSMTPConnection :: SendMessage (const CString& sMessageOnFile... onde, em certas circunstâncias, poderíamos acabar excluindo o local "pSendBuf" buffer duas vezes. Obrigado a Izidor Rozman por ter relatado esse problema.

V2.64 (13 de outubro de 2006)

  • O código agora inicializa o valor do nome de domínio em CNTLMClientAuth :: NTLMAuthenticate para uma seqüência vazia em vez de uma string NULL. Isso evita problemas de autenticação NTLM ao autenticar como um usuário não-domínio com determinados servidores de email. Obrigado ao Wouter Demuynck por ter relatado este problema.
  • Corrigido um problema em Desconectar onde, se a chamada para ReadCommandResponse derrubasse uma exceção, não fechávamos o soquete ou configuramos m_bConnected para FALSE. O código foi atualizado para garantir que estes sejam feitos agora. Isso apenas fornece uma experiência de depuração mais consistente. Obrigado a Alexey Kuznetsov por ter relatado este problema.
  • CPJNSMTPException :: GetErrorMessage agora usa a localidade padrão do usuário para formatar cadeias de erros.
  • Corrigido alguns problemas com a limpeza do cabeçalho e partes do corpo em CPJNSMTPConnection :: SendBodyPart e CPJNSMTPMessage :: WriteToDisk. Obrigado a Xiao-li Ling por ter relatado este problema.

17 de julho de 2006

  • Atualizou o código no aplicativo de amostra para permitir > 30000 caracteres a serem inseridos na caixa de edição que contém o corpo do e-mail. Isso é conseguido ao fazer uma chamada para CEdit :: SetLimitText no método OnInitDialog da caixa de diálogo. Obrigado a Thomas Noone por ter relatado este problema.

V2.63 (14 de julho de 2006)

  • Corrigido um erro no CPJNSMTPConnection onde, quando compilado no modo UNICODE, a autenticação NTLM falharia. Obrigado ao Wouter Demuynck por fornecer a correção para esse bug.
  • Reworked os métodos CPJNSMTPConnection :: NTLMAuthPhase (*) para lançar exceções de CPJNSMTPException padrão se houver algum problema detectado. Isso pode ser feito agora que a classe CNTLMClientAuth é resiliente às exceções sendo   jogado.
  • Atualizado CNTLM ClientAuth para usar novos moldes de estilo C ++.
  • Realizou a função CNTLMClientAuth :: NTLMAuthenticate " exception " seguro, as classes derivadas são livres para lançar exceções em suas implementações de NTLMAuthPhase1, NTLMAuthPhase2 ou NTLMAuthPhase3 e a classe CNTLMClientAuth irá limpar corretamente seus recursos. Isso é conseguido ao fazer as variáveis de membros de valores CredHandle e SecHandle da classe.
  • Substituiu todas as chamadas para o ZeroMemory com memset.
  • Agora, a função pública NTLMAuthenticate permite que você passe um nome de usuário e um par de senhas para fazer autenticação NTLM usando uma conta específica em vez das credenciais do usuário atual. Se você deixar esses valores como NULL, então você obterá o comportamento antigo que é usar as credenciais atuais do usuário. Obrigado ao Wouter Demuynck por esta ótima adição.

V2.62 (29 de junho de 2006)

  • Atualizou a documentação para usar o mesmo estilo do site.
  • Combinou a funcionalidade da classe _PJNNTLMCLIENTAUTH_DATA na classe CNTLMClientAuth principal.
  • O código agora usa novos moldes de estilo C ++ em vez de moldes C de estilo antigo, quando necessário.
  • Função integrada ThrowPJNSMTPException na classe CPJNSMTPConnection e renomeada para ThrowPJNSMTPException
  • Combinou a funcionalidade da classe _PJNSMTP_DATA na classe CPJNSMTPConnection principal.
  • Atualizou o código para limpar a compilação no VC 2005
  • Detalhes atualizados dos direitos autorais.
  • Removido verificações desnecessárias de falha ao alocar por novo, pois no MFC estes lançarão CMemoryExceptions!.
  • Código do construtor otimizado CPJNSMTPException

9 de dezembro de 2005

  • Atualizou a seção de uso da documentação sobre como excluir corretamente a funcionalidade SSL da classe. Obrigado a Berni Slootbeek por solicitar esta atualização.
  • Atualizou a seção de uso da documentação na forma preferida de formatação de tags CID para e-mails MHTML. Obrigado a Asle Rokstad por solicitar esta atualização.

V2.61 (16 de novembro de 2005)

  • Agora, inclui suporte total para conexão via SSL. Por exemplo, enviando mensagens no Gmail usando o servidor "smtp.gmail.com" na porta 465. Graças a Vladimir Sukhoy por fornecer esta adição muito boa (usando, claro, os próprios wrappers OpenSSL do autor!).

V2.60 (7 de outubro de 2005)

  • Fixed an issue where file attachments were incorrectly including a charset value in their headers. Thanks to Asle Rokstad for reporting this issue.

V2.59 (2 October 2005)

  • A funcionalidade MXLookup da classe agora pode ser excluída através do pré-processador definir "CPJNSMTP_NOMXLOOKUP". Graças a Thiago Luiz por solicitar esta atualização. 
  • O aplicativo de exemplo agora não incomoda perguntar por nome de usuário e senha se o tipo de autenticação for NTLM. Graças a Emir Kapic por detectar este problema.
  • A documentação foi atualizada para se referir a problemas com Autenticação NTLM e SSPI. Graças ao Emir Kapic por solicitar esta atualização.
  • Corrigido um erro de atualização feito para a versão anterior que suportava incorretamente o comando adicional 251 para o comando "MAIL" em vez de mais corretamente o comando "RCPT". Obrigado a Jian Peng por ter relatado este problema.

V2.58 (29 de setembro de 2005)

  • Ligação removida para secur32.lib como todas as funções SSPI agora são construídas em tempo de execução usando GetProcAddress. Graças a Emir Kapic por esta atualização.
  • O método MD5 Format agora permite especificar uma string maiúscula ou minúscula para o hash. Isso é necessário porque o mecanismo de autenticação CRAM-MD5 requer um hash MD5 minúsculo. Obrigado a Jian Peng por ter relatado esse problema.
  • 250 ou 251 agora é considerado uma resposta bem-sucedida ao comando RCPT. Obrigado a Jian Peng por ter relatado esse problema.
  • Corrigido vazamentos de memória potenciais na implementação da autenticação NTLM, pois o código estava lançando exceções que o código de autenticação não era esperado.

V2.57 (7 de setembro de 2005)

  • Corrigido outro problema de ponto único, desta vez onde o corpo é composto de apenas um único ponto. Obrigado a Raimund Mettendorf por relatar este problema.
  • Corrigido um erro de digitação na função de acessório CPJNSMTPConnection :: GetBoundAddress que incorretamente era chamado CPJNSMTPConnection :: SetBoundAddress. Obrigado a Pavel Kolar por ter relatado isso.

V2.56 (5 de setembro de 2005)

  • Corrigido um problema no método MXLookup onde a memória não estava sendo liberada corretamente na chamada para o DnsRecordListFree. Graças a Raimund Mettendorf por relatar este erro.
  • Corrigido um problema em que linhas que tinham um único ponto, ou seja, "." não foi enviado corretamente. Graças a Raimund Mettendorf por relatar este problema.
  • Removido a chamada para FixSingleDot do método SetText como é feito em tempo de execução como o email como sendo enviado. Isso estava causando problemas para corrigir o problema do ponto quando as mensagens codificadas MIME estavam sendo enviadas.
  • O ponteiro de função para CompleteAuthToken agora é construído em tempo de execução. Isso significa que a autenticação do cliente NTLM funcionará corretamente no Win9x, conforme usado pela classe CPJNSMTPConnection e qualquer outra classe em vez de exibir uma mensagem "Falha ao carregar devido à exportação em falta ..." do carregador do Windows. Se você deseja remover o suporte NTLM da CPJNSMTPConnection, então você pode continuar a usar o pré-processador CPJNSMTP_NONTLM. Graças a "Lior" por relatar este problema.
  • Corrigido um problema em que a função FixSingleDot estava sendo chamada ao salvar uma mensagem no disco. Isso estava incorreto e só deveria ser feito quando realmente enviar um email SMTP.

V2.55 (14 de agosto de 2005)

  • Atualização menor para incluir comentários ao lado de vários locais no código para informar os usuários sobre o que fazer se eles compilarem erros como resultado da compilação do código sem o Platform SDK estar instalado. Graças a Gudjon Adalsteinsson por solicitar esta atualização.
  • Corrigido um problema quando o código chama a função DnsQuery quando o código é compilado para UNICODE. Este foi o resultado de um erro de documentação no Platform SDK que incorretamente diz que DnsQuery_W leva uma seqüência ASCII quando na verdade ele leva uma cadeia UNICODE. Obrigado a John Oustalet III por ter relatado esse problema.

V2.54 (24 de julho de 2005)

  • Agora inclui suporte para analisar "(...)" comentários nos endereços. Obrigado a Alexey Kuznetsov por esta ótima adição.
  • Corrigido um problema em que o cabeçalho do correio poderia conter um cabeçalho "Content-Transfer Encoding". Este cabeçalho só deve ser aplicado aos cabeçalhos das partes do corpo MIME em vez do cabeçalho do correio propriamente dito. Graças a Jeroen van der Laarse, Terence Dwyer e Bostjan Erzen por relatar este problema e a correção necessária.
  • Agora, chamando ambos AddTextBody e AddHTMLBody, definem o tipo MIME da parte do corpo raiz para multipart / mixed. Anteriormente, os comentários do código diziam uma coisa e faziam outra (configurá-la para "multipart / related"). Obrigado a Bostjan Erzen por ter relatado este problema.

18 de maio de 2005

  • Corrigido um aviso de compilação na classe CPJNMD5Hash quando compilado usando o Visual Studio .NET 2003. Obrigado a Alexey Kuznetsov por ter relatado esse problema.

V2.53 (3 de maio de 2005)

  • Atualizou a seção de uso para descrever a necessidade de ter o Platform SDK instalado e configurado.
  • Corrigido uma série de avisos quando o código é compilado no Visual Studio .NET 2003. Graças a Nigel Delaforce por relatar esses problemas.

V2.52 (1 May 20051 de maio de 2005)

  • Agora, usa a classe wrapper CWSocket do autor.
  • Adicionado suporte para conexão via Socks4, Socks5 e HTTP proxies 
  • O último parâmetro para conectar agora foi removido e está configurado através de um par de acesso / mutador Get / SetBoundAddress.
  • A classe CSMTPException agora é chamada de CPJNSMTPException.
  • Classe agora usa a classe Base64 conforme fornecido com CWSocket. Isso significa que os módulos Base64Coder.cpp / h não são mais distribuídos ou necessários e devem ser removidos de qualquer projeto que use as classes SMTP atualizadas.
  • Corrigido um erro no método SaveToDisk pelo qual os arquivos existentes não estavam sendo truncados antes de salvar a mensagem de e-mail.
  • Todas as chamadas para alocar memória heap agora geram uma CPJNSMTPException se a alocação falhar.
  • Adição de uma função MXLookupAvailable () para que o código do cliente possa saber a priori se as pesquisas DNS MX forem suportadas.
  • O aplicativo de exemplo agora permite que você use o método MXLookup para determinar o servidor de correio a ser usado com base no primeiro endereço de e-mail que você fornece no campo Para.

V2.51 (23 de abril de 2005)

  • O código agora usa uma implementação MS Crypto API do algoritmo MD5 HMAC em vez de código personalizado com base no código RSA MD5. Isso significa que não é necessário que o RSA MD5.cpp, MD5.h e glob-md5.h sejam incluídos nos aplicativos do cliente. Além disso, as configurações de compilação para excluir o código RSA MD5 foram removidas do aplicativo de exemplo. As novas classes para executar o hash MD5 estão contidas em PJNMD5.h e são genéricas o suficiente para serem incluídas em aplicativos clientes por direito próprio.

V2.50 (18 de abril de 2005)

  • Adição de uma função IsConnected () simples em linha com a classe CPop3Connection do autor. Obrigado a Alexey Kuznetsov por solicitar esta adição.
  • Adição de uma função MXLookup que fornece consultas de DNS convenientes de registros MX (os endereços IP de servidores de correio SMTP para um domínio host específico). Internamente, esta nova função usa as novas funções DNS que são fornecidas com o Windows 2000 ou posterior. Para garantir que o código continue funcionando corretamente em versões anteriores do Windows, os ponteiros de função para as funções necessárias são construídos em tempo de execução usando GetProcAddress. Você pode usar esta função para descobrir o endereço IP dos servidores de correio responsáveis por um domínio específico. Isso permite que você envie e-mails diretamente para um domínio e não através de um servidor de correio de terceiros. Graças a Hans Dietrich por sugerir esta boa adição.

V2.49 (26 de março de 2005)

  • Problemas de compilação corrigidos com o código quando a configuração de compilação Force Conformance In For Loop Scope é usada no Visual Studio .NET 2003. Agradecimentos a Alexey Kuznetsov por relatar esse problema.
  • Problemas de compilação corrigidos quando o código é compilado usando a configuração Detectar Problemas de Portabilidade de 64 bits no Visual Studio .NET 2003.

V2.48 (7 de março de 2005)

  • A adição de PJNSMTP_EXT_CLASS define as classes para permitir que as classes sejam facilmente incorporadas nas DLLs de extensão. Obrigado a Arnaud Faucher por sugerir esta adição.
  • Agora, suporte a autenticação NTLM. Obrigado a Arnaud Faucher por esta ótima adição. A autenticação NTLM é fornecida por uma nova classe reutilizável chamada "CNTLMClientAuth" em PJNNTLMAuth.cpp / h ".
  • Corrigido um erro no aplicativo de exemplo na persistência da configuração de autenticação. Graças a Arnaud Faucher por relatar este problema.

19 de fevereiro de 2005

  • Atualizou a seção de uso da documentação para descrever o que é necessário para integrar o código em seus aplicativos. Obrigado a Matthew Tompkins por solicitar esta atualização.

V2.47 (24 de janeiro de 2005)

  • Todas as classes agora usam exceções para indicar erros. Isso significa que toda a área de erros de manipulação no código é muito mais simples. Por exemplo, o mecanismo OnError desapareceu junto com todos os literais de string no código. O próprio código em si é bastante simples também. Você deve revisar cuidadosamente seu código, já que muitos dos valores de retorno dos métodos (especialmente CPJNSMTPConnection) são anulados e lançar CSMTPException's. Obrigado a Mark Smith por solicitar esta atualização.
  • Arranque geral do código após o teste do novo código baseado em exceção.

V2.46 (23 de dezembro de 2004)

  • "Name" o campo em cabeçalhos Content-Type agora é citado como o campo do nome do arquivo. Graças a Mark Smith por relatar este problema em conjunto com o cliente de e-mail Eudora.

V2.45 (30 de setembro de 2004)

  • Corrigido um problema de análise na CPJNSMTPConnection :: ReadResponse quando as respostas de várias linhas são lidas como vários pacotes. Graças a Mark Smith por relatar este problema.
  • Reabasteceu o código que suporta os vários mecanismos de autenticação para suportar os termos corretos. O que foi chamado de suporte "AUTH LOGIN PLAIN" agora mais corretamente usa o termo "AUTH PLAIN". Os nomes das funções e enums agora também foram retrabalhados.
  • Uma revisão do código do aplicativo de exemplo fornecido com a classe para que o nome dos módulos, projetos, exe etc. seja agora "PJNSMTPApp". Também retrabalhou o nome de algumas classes auxiliares, bem como o nome do módulo que aceita a classe principal.
  • Reencaminhado CPJNSMTPConnection :: AuthLoginPlain (agora chamado AuthPlain) para lidar corretamente com o caso em que uma resposta inválida é recebida ao esperar o nome de usuário: resposta. Graças a Mark Smith por relatar esse problema.

V2.44 (7 de junho de 2004)

  • Corrigido um potencial problema de transbordamento de buffer no CSMTPConnection :: ReadResponse quando certas respostas de várias linhas são recebidas

V2.43 (5 de junho de 2004)

  • Corrigido um erro no CSMTPConnection :: ReadResponse, onde os parâmetros errados estavam sendo encerrados nulos. Graças a "caowen" para esta atualização.
  • Atualizou a função CSMTPConnection :: ReadResponse para lidar com respostas multilinha em todos os casos. Obrigado a Thomas Liebethal por relatar este problema.

V2.42 (13 de março de 2004)

  • Corrigido um problema no qual o valor CSMTPBodyPart :: m_dwMaxAttachmentSize não estava sendo copiado no método CSMTPBodyPart :: operator =. Graças a Gerald Egert por relatar esse problema e corrigir.

V2.41 (4 de março de 2004)

  • Para evitar conflitos com a classe ATL Server do mesmo nome, nomeadamente "CSMTPConnection", a classe agora é chamada "CPJNSMTPConnection". Proporcionar fácil atualização de código, "CSMTPConnection" agora é definido como sendo "CPJSMTPConnection" se o código detectar que a classe SMTP do ATL Server não está incluída. Obrigado a Ken Jones por ter relatado este problema.

V2.40 (18 de fevereiro de 2004)

  • Agora você pode, opcionalmente, definir a prioridade de um e-mail para a variável CSMTPMessage :: m_Priority. Obrigado a Edward Livingston por sugerir esta adição.

V2.39 (7 de fevereiro de 2004)

  • Corrigido um erro no CSMTPBodyPart :: SetText onde o código entraria em um loop infinito na função Substituir. Agora foi substituído pelo CString :: Replace. Isso agora significa que a classe não compilará no VC 5. Graças a Johannes Philipp Grohs por relatar esse problema.
  • Corrigido uma série de avisos quando o código é compilado com o VC.Net 2003. Obrigado a Edward Livingston por relatar este problema.

V2.38 (31 de janeiro de 2004)

  • Corrigido um erro no CSMTPBodyPart :: GetBody onde o tamanho da parte do corpo estava calculando incorretamente o tamanho se o tamanho codificado fosse um múltiplo exato de 76. Obrigado a Kurt Emanuelson e Enea Mansutti por ter relatado esse problema.

V2.37 (11 de dezembro de 2003)

  • Corrigido uma variável não segregada no CPJNSMTPConnection :: OnError conforme relatado pelo VC.Net 2003
  • A macro DEBUG_NEW agora é usada somente em VC 6 e não em VC 7 ou VC 7.1. Isso evita um problema nesses compiladores onde existe um conflito entre ele e os arquivos de cabeçalho STL. Obrigado a Alex Evans por relatar este problema.

V2.36 (3 de dezembro de 2003)

  • Código feito que verifica as respostas de login que contêm "Username" e "Password" caso insensível. Graças a Zhang xiao Pan por relatar este problema.

V2.35 (3 de novembro de 2003)

  • Simplificou o código em CPJNSMTPConnection :: ReadResponse. Graças a Clarke Brunt por relatar este problema.

V2.34 (15 de outubro de 2003)

  • Reabasteceu o método CPJNSMTPConnection :: ReadResponse para usar o tempo limite fornecido pelo IsReadable em vez de chamar o sleep. Obrigado a Clarke Brunt por ter relatado este problema.

19 de agosto de 2003

  • Atualizou o aplicativo de exemplo para evitar um vazamento de memória. Acontece que estava relacionado com o pedido de <string> no cabeçalho pré compilado. Nunca mais gostava de STL e isso confirmou meus preconceitos.  Graças a Damian Willis por relatar esse problema.

V2.33 (18 de agosto de 2003)

  • Modificou o valor de retorno do método ConnectToInternet. Em vez de ser um booleano, agora é um enum. Isso permite que o código do cliente diferencie entre duas condições que não poderia anteriormente, ou seja, quando uma conexão à Internet já existia ou se uma nova conexão (presumivelmente uma conexão dial-up foi feita). Isso permite que o código do cliente se desconecte se uma nova conexão fosse necessária. Graças a Pete Arends por esta ótima adição.

18 de agosto de 2003

  • Christian Andersen tomou a classe CPJNSMTPConnection e desenvolveu uma versão executada no Windows CE. O código pode ser baixado aqui. Eu pediria que você encaminhe todas as consultas relativas a este código para Christian, pois só estou hospedando o código como um favor para ele.

V2.32 (12 de maio de 2003)

  • Corrigido um erro onde o cabeçalho X-Mailer estava sendo enviado incorretamente. Obrigado a Paolo Vernazza por ter relatado esse problema.
  • A adição do cabeçalho do X-Mailer agora é opcional. Além disso, o aplicativo de exemplo agora não envia o cabeçalho do X-Mailer.
  • O aplicativo de exemplo agora não envia o cabeçalho Reply-To.

V2.31 (5 de maio de 2003)

  • Reworked a forma como a codificação UTF8 está agora concluída. O que você deve fazer se quiser usar a codificação UTF-8 é configurado o charset  "UTF-8" e use codificação QP ou base 64.
  • Reworked a codificação automática da linha de assunto para usar as configurações como tomadas da parte do corpo SMTP raiz
  • Somente os cabeçalhos corretos de acordo com o MIME RFC estão agora codificados.
  • A codificação QP é o mecanismo de codificação agora usado sempre para cabeçalhos.
  • Os cabeçalhos agora são codificados apenas se necessário para serem codificados.

V2.30 (4 de maio de 2003)

  • Corrigido um problema em que a classe não converte o corpo do correio e sujeita à codificação desejada, mas sim altera a codificação do e-mail no cabeçalho do e-mail. Uma vez que a questão do suporte a várias línguas é complicada, eu decidi que podemos nos contentar em enviar todos os e-mails de CPJNSMTPConnection na UTF-8. Eu adicionei algumas funções de conversão para a classe que - neste momento - sempre converte o corpo e o assunto do e-mail para UTF-8. Um grande agradecimento ao Itamar Kerbel por esta ótima adição.
  • Código movido e aplicativo de exemplo para VC 6.

V2.29 (19 de abril de 2003)

  • Fixed a bug in the CSMTPAddress constructor where I was mixing up the friendly name in the "<>" separators, when it should have been the email address.

V2.28 (17 de abril de 2003)

  • Melhorou o construtor CSMTPAddress para analisar o endereço de e-mail e o nome amigável em vez de assumir que é um endereço de e-mail.
  • Reworked a sintaxe do método CSMTPMessage :: ParseMultipleRecipients. Também agora internamente, esta função usa o novo construtor CSMTPAddress.

V2.27 (13 de abril de 2003)

  • Corrigido um erro no tratamento das respostas EHLO. Graças a "Senior" para o relatório de erros e a correção.

V2.26 (19 de março de 2003)

  • Adição de construtores de cópia e operador = para CSMTPMessage class. Obrigado a Alexey Vasilyev por essa sugestão.

9 de fevereiro de 2003

  • Atualizou o aplicativo de exemplo para exibir uma caixa de diálogo de progresso simples quando você envia uma mensagem do disco (não usando o "Send Direct") opção. Isso fornece uma amostra de como você pode implementar um envio cancelável de uma mensagem com suporte de progresso. Graças a "nabocorp" por sugerir esta adição à amostra.

V2.25 (7 de fevereiro de 2003)

  • Adição de um "BOOL bGracefully" argumento para desconectar para que, quando um aplicativo cancele o envio de uma mensagem, você pode passar FALSO e fechar o soquete sem terminar corretamente a conversação SMTP. Graças a "nabocorp" para esta boa adição.
  • Fez uma verificação ortográfica da documentação <g>.

V2.24 (11 de dezembro de 2002)

  • Revise todas as instruções TRACE para verificar a correção
  • Fornecido um método OnError virtual que é chamado com informações de erro.

V2.23 (4 de outubro de 2002)

  • Corrigido um problema em que o separador cabeçalho / corpo não estava sendo enviado corretamente para correios com anexos ou quando a mensagem é codificada MIME. Graças a Serhiy Pavlov por relatar este problema.
  • Corrigido um erro no QuotedPrintableEncode e HeaderEncode que estava causando os erros. Obrigado a Antonio Maiorano por relatar este problema.
  • Corrigido um problema com um separador de linha adicional sendo enviado entre o cabeçalho e o corpo de e-mails. Isso só foi evidente nos clientes de e-mail se um e-mail não mime sem anexos fosse enviado.

V2.22 (3 de outubro de 2002)

  • A codificação imprimível citada não funcionou corretamente no UNICODE. (conversão inválida de TCHAR para BYTE). Graças a Serhiy Pavlov por relatar este problema.
  • A codificação do assunto não funcionou corretamente no UNICODE. (conversão inválida de TCHAR para BYTE). Graças a Serhiy Pavlov por relatar este problema.
  • Não inseriu a tag "charset" no cabeçalho da raiz para mensagens de texto simples (agora inclui "charset" em mensagens de texto simples). Graças a Serhiy Pavlov por relatar este problema.

V2.21 (20 de setembro de 2002)

  • Corrigido um problema em que o código "Coder.EncodedMessage" não estava sendo convertido de uma seqüência ASCII para uma seqüência UNICODE em chamadas para CString :: Format. Isso ocorreu ao enviar o nome de usuário e a senha para o suporte "AUTH LOGIN", além de enviar o "digestão do nome de usuário" para o suporte "AUTH CRAM-MD5". Graças a Serhiy Pavlov por relatar este problema.
  • Removido um número de chamadas para CString :: Format e, em vez disso, substituído por construtores literais CSC em vez disso.

V2.20 (10 de agosto de 2002)

  • Corrigido uma série de exceções de arquivo não detectadas no CSMTPBodyPart :: GetBody, CSMTPMessage :: SaveToDisk e CPJNSMTPConnection :: SendMessage. Obrigado a John Allan Miller por ter relatado esse problema.
  • A versão CPJNSMTPConnection :: SendMessage do método que envia um arquivo diretamente do disco, agora falha se o arquivo estiver vazio.
  • Melhorou o aplicativo de exemplo exibindo um cursor de espera enquanto uma mensagem do arquivo está sendo enviada.
  • Melhorou o aplicativo de exemplo, avisando o usuário se as configurações de email estiverem faltando e, em seguida, levantar a caixa de diálogo de configuração.

V2.19 (29 de julho de 2002)

  • Corrigido uma violação de acesso no CSMTPBodyPart :: QuotedPrintableEncode. Obrigado a Fergus Gallagher por detectar este problema.
  • Corrigido um problema em casos muito raros, a função QuotedPrintableEncode produz um único ponto em uma linha, ao inserir o "=" para evitar o limite máximo do servidor de correio. Eu insirai uma chamada para FixSingleDot depois de chamar a função QuotedPrintableEncode no GetBody. Obrigado a Andreas Kappler por detectar este problema.
  • Corrigido um problema no CSMTPBodyPart :: GetHeader que garante que todos os clientes de email possam lidar corretamente com partes do corpo e anexos que tenham um nome de arquivo com espaços nele. Obrigado a Andreas Kappler por detectar este problema.
  • A codificação QP agora é usada somente quando você especifica MIME. Isso corrige um bug como relatado por David Terracino.
  • Removido agora não utilizado "API Reference" link no arquivo HTML que suporta o código.

13 de janeiro de 2002

  • Atualização menor para o aplicativo de exemplo para corrigir um erro na busca de anexos, classes básicas não alteradas.

V2.18 (11 de janeiro de 2002)

  • Agora, inclui um método para enviar uma mensagem diretamente da memória. Graças a Tom Allebrandi por essa sugestão.
  • Altere o nome da função "IsReadible" para ser "IsReadable". Nunca fui muito bom em inglês!.
  • Corrigido um erro no CSMTPBodyPart :: QuotedPrintableEncode. Se uma linha tivesse exatamente 76 caracteres de duração mais \ r \ n, ele produziu uma falha de linha suave inválida de "\r=\r\n\n". Obrigado a Gerald Egert por detectar este problema.

3 de dezembro de 2001

  • Item incluído em direitos autorais sobre o uso da classe em correspondentes em massa.

V2.17 (12 de outubro de 2001)

  • Corrigido um problema em que o GetBody relatava o tamanho como 1 maior do que deveria ter sido. Obrigado a "c f" por detectar esse problema.
  • Corrigido um erro nas instruções TRACE quando uma conexão de soquete não pode ser feita.
  • O aplicativo de exemplo agora exibe um filtro de "Todos os arquivos" ao selecionar anexos para enviar.
  • Corrigido um problema ao enviar anexos de 0 bytes. Obrigado a Deng Tao por detectar este problema.

V2.16 (29 de setembro de 2001)

Eric Fontana tomou a classe CPJNSMTPConnection e desenvolveu uma versão COM que possui os seguintes recursos, o código pode ser baixado aqui. Eu pediria que você encaminhe todas as consultas relativas a este código para Eric, pois só estou hospedando o código como um favor para ele

  • Corrigido um erro na ReadResponse que ocorreu quando você desconectou via rede dial-up enquanto uma conexão estava ativa. Isso foi originalmente detectado na minha classe POP3.
  • Corrigido um problema no CSMTPBodyPart :: GetHeader, que sempre incluiu o "quoted-printable" mesmo quando 
    m_bQuotedPrintable pois essa parte do corpo era FALSA. Graças a "jason" por detectar isso.
  • In proc dll COM interface
  • O IDispatch de suporte pode ser chamado de ASP, VBScript, JScript, etc.

V2.15 (13 de agosto de 2001)

  • Corrigido um bug no QuotedPrintableEncode que estava envolvendo caracteres de codificação em várias linhas. Obrigado a Roy He por detectar isso.
  • Fornecido um método "SendMessage" que envia um email diretamente do disco. Isso permite que você construa seus próprios e-mails e use a classe apenas para enviar o envio. Esta função também tem a vantagem de usar eficientemente memória e relatórios de progresso.
  • Fornecido suporte para notificação de progresso e cancelamento através do método virtual "OnSendProgress".

V2.14 (15 de julho de 2001)

  • Melhorou o tratamento de erros na função CSMTPMessage :: AddMultipleAttachments. Além disso, o valor de retorno foi alterado de BOOL para int.

V2.13 (1 de julho de 2001)

  • Modificado QuotedPrintableEncode para evitar que o código entre em um loop infinito devido a uma palavra longa, ou seja, maior do que SMTP_MAXLINE, neste caso, a palavra está quebrada. Obrigado a Manuel Gustavo Saraiva por esta solução.
  • Fornecido uma nova variável protegida no CSMTPBodyPart chamado m_bQuotedPrintable para ignorar a função QuotedPrintableEncode nos casos em que não queremos esse tipo de correção. Mais uma vez graças a Manuel Gustavo Saraiva por esta correção.

V2.12 (25 de junho de 2001)

  • Código agora links em Winsock e RPCRT40 automaticamente. Isso evita que o código do cliente precise especificá-lo em suas configurações de vinculador. Graças a Malte e Phillip por terem observado este problema.
  • Código de exemplo atualizado na documentação. Graças a Phillip por detectar isso.
  • Melhorou o código no CSMTPBodyPart :: SetText para garantir que as linhas estejam corretamente envolvidas. Obrigado a Thomas Moser por essa correção.

V2.11 (17 de junho de 2001)

  • Corrigido um erro no CSMTPMessage :: HeaderEncode onde os espaços não estavam sendo interpretados corretamente. Graças a Jim Alberico por ter observado isso.
  • Corrigido 2 problemas com ReadResponse, ambos com respostas multilíneas. Obrigado a Chris Hanson por esta atualização.

V2.1 (14 de maio de 2001)

  • Charset agora padrão para ISO 8859-1 em vez de nós-ascii
  • Removido uma série de variáveis não referenciadas do aplicativo de exemplo.
  • Os cabeçalhos agora são codificados se eles contêm caracteres não-ascii.
  • Corrigido um erro no getLine, obrigado a Lev Evert por detectar este.
  • Fez o valor charset um membro da classe de mensagem em vez da classe de conexão
  • O aplicativo de exemplo agora é totalmente compatível com a especificação do charset da mensagem
  • Adicionado um método AddMultipleAttachments para CSMTPMessage
  • Os anexos agora podem ser copiados um para o outro através de novos métodos no CSMTPAttachment
  • A classe de mensagens agora contém cópias dos anexos em vez de dicas para eles
  • O aplicativo de exemplo agora permite adicionar múltiplos anexos
  • Removido um afirmar desnecessário no QuotedPrintableEncode
  • Adicionou uma bandeira Mime à classe CSMTPMessage, que permite que você decida se uma mensagem deve ou não ser enviada como MIME. Observe que, se você tiver anexos, então mime é assumido.
  • A classe CSMTPAttachment tornou-se CSMTPBodyPart em antecipação ao suporte total para suporte de e-mail MIME e MHTML
  • Mensagem de direitos autorais atualizada no código-fonte e na documentação
  • Corrigido um erro no GetHeader relacionado ao uso _setlocale. Obrigado a Sean McKinnon por detectar este problema.
  • Corrigido um erro em SendLines ao enviar pequenos anexos. Graças a Deng Tao por detectar esse problema.
  • Removido a necessidade de função SendLines inteiramente.
  • Agora, é totalmente compatível com o email HTML (também conhecido como MHTML)

V2.04 (28 de dezembro de 2000)

  • Removido uma variável não utilizada do ConnectESMTP.
  • Permitiu o nome do host como enviado no comando HELO para ser especificado no tempo de execução, além de usar o nome do host da máquina cliente
  • Corrigido um problema em que os caracteres ASCII altos não estavam sendo codificados corretamente na versão imprimível citada do corpo enviada.
  • Suporte adicionado para conjuntos de caracteres definíveis pelo usuário para o corpo da mensagem.
  • Os limites de Mime agora são sempre enviados, independentemente de os anexos estarem incluídos ou não. Isso é necessário, pois o corpo está usando quoted-printable.
  • Corrigido um erro no sendLines que estava causando que pequenos corpos de mensagens fossem enviados incorretamente
  • Agora suporta totalmente cabeçalhos personalizados na mensagem SMTP
  • Corrigido um erro de cópia e colar onde a porta padrão para a classe de soquete SMTP era 110.
  • Agora você pode especificar o endereço no qual o soquete está vinculado. Isso permite ao programador decidir sobre quais dados NIC devem ser enviados. Isso é especialmente útil em uma máquina com múltiplos endereços IP.
  • Adição de funções na classe de conexão SMTP para discagem automática e desconexão automática para a Internet se desejar.
  • O aplicativo de exemplo foi aprimorado para permitir que o Discagem automática e a ligação aos endereços IP sejam configurados.
  • Obrigado, vá para Yaroslav Liapkov, Josef Hampl, Duncan Strand, Fritz Roland "Nick" Bjorklund, Lev Elbert e Perry Rapp por encontrar esses problemas e / ou sugerir as melhorias.

V2.03 (5 de setembro de 2000)

  • Adicionado uma macro de préprocessador CSMTP_NORSA para permitir que o CPJNSMTPConnecção de código seja compilado sem a dependência do código RSA.

V2.02 (30 de julho de 2000)

  • Corrigido um erro no AuthLogin que estava transmitindo o nome de usuário e a senha com um extra "=" que estava causando o login para falhar. Obrigado a Victor Vogelpoel por achar isso.

V2.01 (10 de julho de 2000)

  • Corrigido um problema com o envio de anexos > 1K de tamanho.
  • Alterou os parâmetros para CPJNSMTPConnection :: Connect

V2.0 (21 de junho de 2000)

  • Agora, inclui uma série de arquivos perdidos no arquivo zip.
  • Atualizou o número da versão para v2 para refletir as principais mudanças ocorridas na v1.41

V1.41 (20 de junho de 2000)

  • Removed the base64 encoder from this file
  • Added the base64 encoder/decoder implementation in a separate file. This was done because base64 decoding was not part of the previous implementation
  • Added support for ESMTP connection. The class now attempts to authenticate the user on the ESMTP server using the username and passwords supplied. For this connect now takes the username and passwords as parameters. These can be null in which case ESMTP authentication is not attempted
  • This class can now handle AUTH LOGIN and AUTH LOGIN PLAIN authentication schemes 
  • Added the files md5.* containing the MD5 digest generation code after modifications so that it compiles with VC++ 6
  • Added the CRAM-MD5 login procedure.
  • Please note that all the support for SMTP authentication was added by Puneet Pawaia to which I am gratefully appreciated for all the hard work put in.

V1.40 (7 May 2000)

  • Adição de alguns ASSERT's no CSMTPSocket :: Connect.

V1.39 (28 de março de 2000)

  • Defina o tempo limite do modo de liberação para 10 segundos. 2 segundos estava causando problemas para conexões de rede de discagem lenta.

V1.38 (26 de março de 2000)

  • Atualizou o aplicativo de exemplo fornecido com o código para ser um cliente de correio mini. Isso agora também deve dar uma melhor idéia do que o código pode ser usado.

V1.37 (19 de março de 2000)

  • Corrigido um problema no GetHeader em máquinas Windows não inglesas
  • Agora é fornecido com um espaço de trabalho VC 5. Eu enviei acidentalmente uma versão do VC 6 em uma das versões anteriores do código.
  • Corrigido vários problemas UNICODE
  • Atualizou o aplicativo de exemplo para afirmar deliberadamente antes de se conectar ao servidor SMTP do autor.

V1.36 (16 de fevereiro de 2000)

  • Corrigido outro problema de compilação quando compilado com VC 6.

V1.35 (5 de outubro de 1999)

  • Corrigido 2 avisos de nível 4 quando compilados usando o VC 6.

V1.34 (10 de setembro de 1999)

  • Melhoração do CSMTPMessage :: GetHeader para incluir o campo mime mesmo quando não estão incluídos anexos.

V1.33 (14 de maio de 1999)

  • Documentação atualizada para se referir à RFC 822.
  • Corrigido um erro com a forma como o código gera campos de fuso horário nos cabeçalhos de data. Graças a Randy A. Scott por relatar este erro. 

V1.32 (25 de março de 1999)

  • Agora dorme por 250 ms em vez de render a fatia de tempo. Isso ajuda a reduzir o uso da CPU ao aguardar a chegada de dados no soquete.

V1.31 (22 de fevereiro de 1999)

  • Adicionado um método Get e SetTitle que permite que um título de anexo de arquivos seja diferente que o nome do arquivo original.
  • Aplicativo de amostra atualizado para incluir uma linha de assunto mais descritiva.
  • O tempo limite padrão para o código quando uma compilação de depuração foi criada foi configurado para 60 segundos.
  • Melhorou a leitura das respostas de volta do servidor, implementando um buffer de recebimento agregado.
  • Instruções atualizadas sobre como os documentos RFC relevantes podem ser recuperados.

8 de novembro de 1998

Philip K Chung tomou a classe CPJNSMTPConnection e desenvolveu uma versão que possui os seguintes recursos, o código pode ser baixado aqui. Eu pediria que você encaminhe todas as consultas relativas a este código para Philip, pois só estou hospedando o código como um favor para ele, pois ele não mantém um site próprio

  • mais MFC
  • todas as classes de coleção e classes de string de STL
  • tentou torná-lo seguro, tornando-o essencialmente enraizado (isto é, ele deve ser capaz de lidar com vários segmentos digitando seu código ao mesmo tempo
  • partiu para módulos separados e adicionou um cabeçalho pré-compilado para acelerar a compilação
  • transformou tudo em uma DLL com um ponto de entrada SINGLE, ou seja, veja o arquivo de cabeçalho público
  • mudou a estrutura do diretório ao redor. O arquivo de cabeçalho público está em ... / comum / inclusão e a DLL resultante é copiada para .../common/bin
  • Suporte adicional para CC e BCC

V1.21 (12 de setembro de 1998)

  • Removido um par de avisos de compilação variável não referenciados descobertos quando a classe foi compilada no Visual C ++ 6.0.12 setembro de 1998
  • Corrigido um grande erro que estava causando um ASSERT quando o destruidor CSMTPAttachment estava sendo chamado no InitInstance do aplicativo de exemplo. Isto foi inadvertidamente introduzido para a versão 1.2. A correção é reverter a correção 2) como feito para v1.2. Esta nova correção também ajudará a reduzir o número de imagens de anexo mantidas na memória ao mesmo tempo.
  • Corrigido alguns erros no arquivo de ajuda.

V1.2 (11 de agosto de 1998)

  • O arquivo de projeto do VC 5 agora está disponível
  • O conjunto de anexos que a classe de mensagem contém agora usa referências em vez de ponteiros.
  • Agora, usa Sleep (0) para produzir nossa fatia de tempo em vez de Sleep (100), essa é a maneira preferida de escrever o código de estilo de polling no Win32 sem afetar severamente o desempenho.
  • Todas as instruções Trace agora exibem o valor retornado do GetLastError
  • Uma série de afirmações adicionais foram adicionadas
  • Foi adicionada uma função AddMultipleRecipients que suporta uma série de destinatários de uma só vez. Obrigado, vá para Bob Yang por sugerir a função e fornecer código.
  • Demonstrações de rastreamento extra foram adicionadas para ajudar na depuração

V1.12 (27 de junho de 1998)

  • O caso em que uma linha começa com um "." mas contém outro texto agora também é servido. Consulte RFC821, seção 4.5.2 para mais detalhes.
  • m_sBody no CSMTPMessage já foi protegido. Os aplicativos cliente agora devem chamar AddBody. Isso garante que FixSingleDot seja chamado apenas uma vez, mesmo que a mesma mensagem seja enviada várias vezes.
  • Corrigido uma série de problemas com a forma como os limites MIME foram definidos e enviados.
  • Livrado de um aviso de compilador de parâmetros formal não referenciado ao fazer uma compilação de versão.
  • Obrigado a Chris Davidson por todas as sugestões e correções de bugs.

V1.11 (18 de junho de 1998)

  • Corrigido um problema de substituição de memória que estava ocorrendo com o buffer usado para codificar anexos base64.

V1.1 (17 de junho de 1998)

  • Corrigido o caso em que um único ponto ocorre por conta própria no corpo de uma mensagem
  • Classes agora suporta um opcional "Reply-To" Campo de cabeçalho
  • Classes agora suporta totalmente anexos de arquivos
  • Alguma retrabalho no conteúdo do arquivo de ajuda

V1.0 (26 de maio de 1998)

  • Lançamento público inicial.

V1.3 (18 de janeiro de 1998)

  • O suporte total já foi adicionado para CC (Carbon Copy) & BCC (Blind Carbon Copy).