quinta-feira, 12 de março de 2009

Conexões TCP/IP com PostgreSQL 8.3

Pessoal, quando queremos utilizar o banco de dados como um servidor para ser conectado por outras pessoas da rede, precisamos mudar algumas configurações que por padrão vem desativadas por questões de segurança.
Por isso traduzi um post sobre o assunto e vou publicá-lo aqui.

Siga os passos a seguir:


1.-Editar o arquivo postgresql.conf para aceitar conexões TCP/IP.

a) Botão Iniciar –> PostgreSQL 8.3 –> Configuration files –> Edit postgresql.conf



b) No arquivo postgresql.conf buscamos a linha:

# - Connection Settings -

Retire a tralha(jogo da velha) da linha abaixo:

#listen_addresses = ‘localhost’

Substituiremos localhost por *(asterisco), para que o postgresql possa receber conexões, ficando da seguinte forma:

listen_addresses = ‘*’



Salve o arquivo e feche-o. Agora vamos configurar para receber conexões Ip de outras máquinas.

Para dar autorização aos usuários através de conexão remota:

a) Botão Iniciar –> PostgreSQL 8.3 –> Configuration files –> Edit pg_hba.conf



b) No arquivo pg_hba.conf

Buscamos a linha:

# IPv4 local connections:


———-

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# IPv4 local connections:
host all all 127.0.0.1/32 md5

———–

Adicionaremos os IPs dos usuários que se conectarão ao servidor, ficando da seguinte forma:

———-

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 192.168.0.3/32 md5

———–

O último passo agora é reiniciar o serviço do PostgreSql no servidor para que as alterações tenham efeito e os clientes possam se conectar.

*Fazemos isto no Painel de controle-> Ferramentas Administrativas –> Serviços-> PostgreSQL Database Server 8.3



Paramos o servidor e iniciamos novamente

Assim o cliente poderá se conectar através de seu pgAdmin III

*Obs: Se estiver com firewall, desative-o ou coloque exceções ao postgreSQL.

Material retirado de: http://darkchicles.wordpress.com/2009/02/18/conexiones-tcpip-con-postgresql-83/

quarta-feira, 11 de março de 2009

Javascript: Operadores


Operadores para efetuar mudança do conteúdo de uma variável

= Atribui valor a uma variável
++ Incrementa valor de uma variável, x++ é o mesmo que x=x+1
-- Decrementa valor de uma variável, x-- é o mesmo que x=x-1


Operadores para comparação de valores

== Igual
!= Diferente
=== Estritamente igual(verifica conteúdo e tipo da variável)
!== Estritamente diferente(verifica conteúdo e tipo da variável)
< Menor que
<= Menor ou igual a
> Maior que
>= Maior ou igual a


Operadores aritiméticos

% Módulo
+ Soma
- Subtração
* Multiplicação
/ Divisão


Operadores lógicos

&& Módulo
|| Ou
! Não


Operadores de bits

& Operação E
| Operação Ou
^ Operação Ou Exclusivo
~ Operação Não
>> Rotação de bits para direita
<< Rotação de bits para esquerda
>>> Rotação de bits para direita sem levar em consideração o sinal


Operadores especiais

?: Efetua operação condicionada, exemplo x = a > 1 ? 3 : 4; ou seja se o valor da variável a for maior que 1, será atribuído a x o valor 3 caso contrario 4

, A vírgula efetua operação da esquerda para a direita sendo que o último elemento é retornado. Ex: x=1, y=2;

delete variavel Elimina um objeto que esteja sendo referenciada pela variável, se a variavel for uma propriedade de um objeto, limpa esta referência do objeto.

propriedade in objeto Retorna true caso a propriedade esteja contida no objeto

objeto instanceof TipoDoObjeto Retorna true caso o objeto seja de determinado tipo

typeof(objeto) Retorna string contendo o tipo do objeto

new TipoDoObjeto(p1, ...) Cria uma instância do objeto

this Representa a instância do objeto corrente

void (expressao) Resolve expressão, porém ignora valor retornado



Short Circuit
Operações lógicas utilizam short circuit da seguinte forma :


true || qualquer coisa = true
false && qualquer coisa = false


assim é possível por exemplo fazer a seguinte operação:


if (a != 0 && 1/a > 0.5) {
....
}


assim evita erros de divisão por zero.

Outro exemplo da utilização, é para contornar a diferença dos eventos do explorer e do mozilla/firefox.


function listener(event) {
event = event || window.event;
...
}


Assim se esta função estiver rodando no IE ou num navegador utilizando Gecko irá rodar da mesma forma.

Retirado de Wikibooks

Funções úteis para PostgreSql


Funções Diversas

SELECT CURRENT_DATABASE();

SELECT CURRENT_SCHEMA();

SELECT CURRENT_SCHEMA(boolean);

SELECT CURRENT_USER;

SELECT SESSION_USER;

SELECT VERSION();


SELECT CURRENT_SETTING('DATESTYLE');

SELECT HAS_TABLE_PRIVILEGE('usuario','tabela','privilegio');

SELECT HAS_TABLE_PRIVILEGE('postgres','nulos','insert'); - - Retorna: t

SELECT HAS_DATABASE_PRIVILEGE('postgres','testes','create'); - - Retorna: t

SELECT HAS_SCHEMA_PRIVILEGE('postgres','public','create'); - - Retorna: t


SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);


Arrays

SELECT ARRAY[1.1,2.2,3.3]::INT[] = ARRAY[1,2,3];

SELECT ARRAY[1,2,3] = ARRAY[1,2,8];

SELECT ARRAY[1,3,5] || ARRAY[2,4,6];

SELECT 0 || ARRAY[2,4,6];


Array de char com 48 posições e cada uma com 2:

campo char(2) [48]


Funções Geométricas

area(objeto) - - area(box '((0,0), (1,1))');

center(objeto) - - center(box '((0,0), (1,2))');

diameter(circulo double) - - diameter(circle '((0,0), 2.0)');

height(box) - - height(box '((0,0), (1,1))');

length(objeto) - - length(path '((-1,0), (1,0))');

radius(circle) - - radius(circle '((0,0), 2.0)');

width(box) - - width(box '((0,0), (1,1))');


Funções para Redes

Funções cidr e inet

host(inet) - - host('192.168.1.5/24') - - 192.168.1.5

masklen(inet) - - masklen('192.168.1.5/24') - - 24

netmask(inet) - - netmask('192.168.1.5/24') - - 255.255.255.0

network(inet) - - network('192.168.1.5/24') - - 192.168.1.0/24


Função macaddr

trunt(macaddr) - - trunc(maraddr '12:34:34:56:78:90:ab') - - 12:34:56:00:00:00


Funções de Informação do Sistema

current_database()

current_schema()

current_schemas(boolean)

current_user()

inet_client_addr()

inet_client_port()

inet_server_addr()

inet_server_port()

pg_postmaster_start_time()

version()

has_table_privilege(user, table, privilege) - dá privilégio ao user na tabela

has_table_privilege(table, privilege) - dá privilégio ao usuário atual na tabela

has_database_privilege(user, database, privilege) - dá privilégio ao user no banco

has_function_privilege(user, function, privilege) - dá privilégio ao user na função

has_language_privilege(user, language, privilege) - dá privilégio ao user na linguagem

has_schema_privilege(user, schema, privilege) - dá privilégio ao user no esquema

has_tablespace_privilege(user, tablespace, privilege) - dá privilégio ao user no tablespace


current_setting(nome) - valor atual da configuração

set_config(nome, novovalor, is_local) - seta parâmetro de retorna novo valor

pg_start_backup(label text)

pg_stop_backup()

pg_column_size(qualquer)

pg_tablespace_size(nome)

pg_database_size(nome)

pg_relation_size(nome)

pg_total_relation_size(nome)

pg_size_pretty(bigint)

pg_ls_dir(diretorio)

pg_read_file(arquivo text, offset bigint, tamanho bigint)

pg_stat_file(arquivo text)

Retirado do site: http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Internas/Convers%C3%A3o_de_Tipos

terça-feira, 10 de março de 2009

Introdução a Engenharia de Softwares - Parte 3 - Automatizar ou não?



Tem outros pontos que acho importante ressaltar na Engenharia de Softwares. Por isso sempre que lembrar de algum detalhe que ache importante vou publicar aqui, porque por mais que sejam muito simples pra nós que somos dá área, pode ser útil as pessoas que estão ingressando.

Automatizar ou não?

Qual é o Analista que nunca se deparou com a situação de dizer a um cliente que não será viável o que ele quer?

Ou será que nenhum de vocês já ouviu. O software vai ter que ficar pra depois, temos que aguardar recursos.

Ou será que você se deparou com aquele velho amigo seu, dono de um boteco que vende muita cerveja e que vive dizendo que quer informatizar o bar, pra melhor controle das contas, clientes, vendas. Você explica a ele que se ele quiser informatizar seu bar terá que comprar um computador, um ar-condicionado, porque o ambiente é quente e pode superaquecer seu processador. De repente terá que comprar também uma impressora fiscal pra emitir os cupons e contratar um técnico para fazer a manutenção do computador já que ele não sabe mexer em nada. Não esquecendo que ele terá que pagar pelo software que você vao fazer que não deve ser nada barato.

Bom depois disso, acho que por mais que eu o explicasse os benefícios que um software bem planejado traria a médio e longo prazo, acho que talvez não seria viável para ele naquele momento. De uma forma bem sucinta o que nós fizemos foi um estudo de viabilidade que nem sempre é feito pelos empresários, causando na maioria das vezes a parada do desenvolvimento de software que é sempre o que os empresários mais conservadores pensam que deve ficar em último plano.

Por essas e outras razões existem vários problemas que devem ser observados antes de começarmos a automatizar um processo. Vou citar os mais comuns para que vocês reflitam a respeito lembrando do exemplo do boteco do seu amigo.

Custo – Nem sempre é verdade que os computadores sejam mais rápidos e mais baratos do que o modo “antigo”.

As vezes o custo benefício não compensa como foi no caso do boteco.

Conforto – Espaço em demasia, excessivo ruído, gerar muito calor ou consumir energia demais.

Como no boteco de repente só o computador com o ar-condicionado iria consumir tanta energia que não compensaria.
Poderia não existir espaço para o computador.


Segurança – dados confidenciais podem ficar vulneráveis.

As vezes o dono fica com um certo medo de te passar informações confidenciais mas imprescindíveis para o desenvolvimento do sistema.

Manutenibilidade – pode não existir pessoal capacitado.

No caso do boteco o dono não teria condições de pagar um técnico para operar o software e fazer manutenção no computador.

Política – os computadores podem ser uma ameaça aos funcionários.

Os funcionários podem te atrapalhar na implantação e outras ocasiões por achar que perderão seus empregos para os computadores.


Pessaol, então é isso ai... Espero que tenha ajudado.

Se interessar estou colocando um link interessante sobre o assunto:
http://www.hitecnet.com.br/prospectos/31/pqdevo1.htm

Introdução a Engenharia de Softwares - Parte 2


Continuando o post anterior que expliquei uma diferença básica mas que confunde muita gente. Software X Sistema

Vamos tirar outras dúvidas que são básicas mas que muita gente não sabe.

Por que dizemos Engenharia de Softwares e não Engenharia de Sistemas?

E Por que dizemos Analista de Sistemas e não Analista de Softwares?

De acordo com a diferença mostrada pode-se concluir que Engenharia de sistemas trata da organização dos sistemas. Como funcionam, como são os processos em um ramo qualquer de atividade. Lembrando que sistemas não são programas de computador.

Quando falamos em Engenharia de softwares estamos nos referindo na construção, projeto, validação, testes e outras coisas relacionadas a programas de computador.

Um Engenheiro de Sistemas é capaz de conhecer como modelar sistemas e processos de um fábrica por exemplo. Já um Engenheiro de Software será capaz de modelar um software para atender as necessidades do Engenheiro de sistemas.

Já quando falamos de Analista de Sistemas e Analista de Softwares é um pouco diferente. O Analista de Sistemas tem a função de entender como funciona um sistema para que ele possa modelá-lo, projetá-lo e construir um software que atenda essas necessidades. Seria quase a junção de um Engenheiro de Sistemas com um Engenheiro de Software.

O Analista de Softwares tem a função de fazer auditoria no software, avaliar, ver as funcionalidades, etc. Em resumo é um estudo do software pronto.

quarta-feira, 4 de março de 2009

Introdução a Engenharia de Softwares - Parte 1


Introdução a Engenharia de Softwares

SOFTWARE X SISTEMA

Sistema

Segundo o WIKIPÉDIA, a palavra "sistema" vem do grego e significa "combinar", "ajustar",
"formar um conjunto". Ou seja, muito genérica a explicação.

Na verdade, em resumo, um sistema é uma ligação entre componentes comuns, com objetivos comuns.

Esses componentes também podem ser sub-sistemas.

Os sistemas tem características em comum:

Eles sempre podem ser divididos em sistemas menores.

Eles sempre farão parte de um sistema maior.


De acordo com essa definição, tudo o que está a nossa volta pode ser encarado como um sistema. Vamos pegar como exemplo o corpo humano.

Quando respiramos utilizamos o sistema respiratório.

Quando comemos utilizamos o sistema digestivo.

Temos o sistema cardíaco, nervoso, etc. Esses sistemas possuem componentes que funcionam com um objetivo em comum. Por exemplo:

O sistema digestivo tem a função de retirar os nutrientes dos alimentos necessários a diferentes funções. E cada órgão terá uma função diferente, mas que no final o objetivo do conjunto é o mesmo.

Exemplos:

Sistemas Feitos pelo Homem:

Sistemas Sociais: organizações de leis, doutrinas, costumes...
Sistemas de Transporte: redes ferroviárias, linhas aéreas...
Sistemas de Comunicação: telefone, telex...
Sistemas Financeiros: contabilidade, controle de estoque...

Sistemas Automatizados:

“São sistemas feitos pelo homem, que interagem com, ou são controlados por um ou mais computadores.”

Sistemas Automatizados:

Componentes:
Hardware – Dispositivos eletrônicos (CPU, memória) que fornecem capacidade ao computador, e dispositivos eletromecânicos (sensores, impressoras, motores) que oferecem funções ao mundo externo.

Software – Programas de computador, estruturas de dados e documentação correlata que servem para efetivar o método, processo ou controle lógico necessário.

Peopleware – Aquelas que operam o sistema, que fornecem as entradas e utilizam as saídas, e as que desempenham atividades de processamento manual em um sistema.

Dataware – As informações que o sistema armazena por um período de tempo.

Procedimentos – Os passos que definem o uso específico de cada elemento do sistema.


Muitos sistemas feitos pelo homem interagem com os sistemas vivos - por exemplo, os marca-passos computadorizados que interagem com o coração humano.

Bom, mas isso está virando uma aula de Biologia? Não é isso que queremos. Estou apenas conceituando Sistema.

Mas e na Informática, o que seria um sistema?

Como na vida real podemos ter um sistema financeiro, sistema escolar, político, etc.

E como funciona?

De acordo com o conceito passado anteriormente esses sistemas possuem componentes que possuem os mesmos objetivos.

Em um sistema de comércio cada componente trabalhará realizando sua função, mas que no final todos terão o mesmo objetivo.

Um sistema comercial pode ser divido em outros sistemas menores como Vendas, Compras, Estoque, etc, comprovando as características citadas.

Mas aí surge a pergunta: Mas onde está a informática nessa história?

Agora que vamos entrar no software

O Software entra em um sistema para auxiliar, agilizar um processo por vários motivos. Aumentar velocidade, diminuir custos, otimizar recursos, etc.

Os softwares nada mais são do que programas de computador, junto com manuais, especificações, planos de teste, etc.

Então está claro a diferença? Software X Sistema

Em um sistema podemos ter vários softwares ou não ter nenhum.

Então por que Engenharia de Softwares e não Sistemas?

Por que da formação Analista de Sistemas e não Softwares?

Assunto para o próximo post. http://duvidasdeprogramacao.blogspot.com/2009/03/introducao-engenharia-de-softwares_10.html

Espero que tenham gostado.

quinta-feira, 26 de fevereiro de 2009

Saiu Ranking das linguagens de programação de fevereiro de 2009

Bom dia pessoal,


Estava dando uma olhada no ranking das linguagens de programação que saiu em fevereiro desse ano e vale a pena dar uma analisada. Linguagens como a Brasileira Lua criada pela PUC-Rio apesar de ter caído duas posições está entre as 20 linguagens de programação mais utilizadas de acordo com o índice da TIOBE Software. Java e C continuam liderando e C++ subiu duas posições. Acho interessante C++ estar em terceiro porque acredito que C++ tem muito do que o Java pode oferecer e tem a base em C. Na minha opnião é uma linguagem completa apesar dos problemas é claro.


Depois do sucesso e do incrível crescimento, Python e Ruby deram uma estagnada no ranking. Só não entendi como ABAP e Logo subiram tanto. Vou dar uma pesquisada, porque são linguagens que nunca utilizei.


Clique na imagem para ampliar.


Abaixo segue as outras 30 posições do ranking.


Clique na imagem para ampliar.


Agora uma comparação dos últimos 5 anos


Clique na imagem para ampliar.


Quem quiser ver o ranking do ano de 2008 que postei aqui no blog segue o link.

sexta-feira, 13 de fevereiro de 2009

Organized Eclipse Shortcuts (Resumido)

Organized Eclipse Shortcuts


Navigational Shortcuts
F10 Main menu
Shift F10 Context menu
Ctrl F10 View menu

Workspace navigation
F12 Activate editor
Ctrl+Shift+W Switch editor
Ctrl F6 Next editor
Ctrl Shift F6 Prev editor
Ctrl F7 Next workspace
Ctrl Shift F7 Prev workspace
Ctrl F8 Next perspective
Ctrl Shift F8 Prev perspective
Alt Left Back
Alt Right Forward

Files
Alt Shift S Show in…
Ctrl Shift R Jump to file
Ctrl N New file
Ctrl S Save file
Ctrl Shift S Save all files
Ctrl F4 Close file
Ctrl Shift F4 Close all files

Find
Ctrl L Goto line
Ctrl F Find
Ctrl J Incremental find
Ctrl Shift J Incremental find prev
Ctrl K Find next
Ctrl Shift K Find prev
Ctrl H Search workspace
Ctrl (dot) Navigate next
Ctrl (comma) Navigate prev

Java navigation
F3 Goto declaration
Ctrl Shift U Find references in file
Ctrl Shift G Find references in workspace
Ctrl G Find declarations in workspace
Ctrl Shift P Navigate to matching bracket/brace
Ctrl T Popup type hierarchy
Ctrl Shift T Open Type
Ctrl O Outline of current source
Ctrl F3 Outline of current cursor position
Ctrl Shift Arrow Jump beetween methods up or down
F2 Show Javadoc
F4 Show hierarchy
Ctrl Alt H Open call hierarchy


General editing
Alt Arrow Move line(s) up or down
Alt Shift Up Expand selection to enclosing element
Alt Shift Right Expand selection to next element
Alt Shift Left Expand selection to previous element
Alt Shift Down Restore previous selection
Ctrl Alt Arrow Duplicate line(s) up or down
Shift Enter Insert line below
Ctrl Shift Enter Insert line above
Ctrl D Delete line
Ctrl Shift Q Toggle Quick Diff
Ctrl Shift Y Convert to lowercase
Ctrl Shift X Convert to uppercase

Java editing
Alt Shift U Remove occurrence annotations
Ctrl 1 Quick fix (works even when there are no errors
Ctrl Shift M Add import
Ctrl Shift F Reformat
Ctrl Shift O Organize Imports
Ctrl / Comment
Ctrl \ UnComment
Ctrl Shift Space Parameter hints
Ctrl Hyperlink identifier
Ctrl I Correct indentation
Shift Space Incremental content assist

Debugger
F5 Step into
F6 Step over
F7 Run to return
F8 Resume
F9 Relaunch last
F11 Run/debug last
Ctrl F11 Run
Ctrl Shift B Toggle breakpoint
Ctrl D Display
Ctrl Q Inspect
Ctrl R Run to line
Ctrl U Run snippet

Refactoring
Alt T Refactoring menu
Ctrl Shift Z Undo refactor
Ctrl Shift Y Redo refactor
Alt Shift R Rename
Alt Shift V Move
Alt Shift I Inline
Alt Shift M Extract method
Alt Shift L Extract local
Alt Shift C Change method signature

Misc
F5 Refresh
F1 Infopop
F2 Show resizeable hover

http://www.allapplabs.com/eclipse/eclipse_shortcuts.htm

Atalhos do Eclipse / Eclipse shortcuts


Olá a todos.

Resolvi juntar algumas dicas de atalhos do eclipse que acho importante. Serve como guia de consulta pra mim e pra todos que utilizam o eclipse.

O post foi montado baseado em vários blogs e os atalhos que eu mais utilizo também. Espero que seja útil a todos.

Esses atalhos adiantam muito a vida dos desenvolvedores, afinal você pode em vez de digitar public static void main(String[] args), digitar somente main em seguida pressionar Ctrl+espaço, apertar Enter e o método é escrito pra você. Muitas outras dicas faladas aqui facilitarão muito seu dia-a-dia com eclipse.


Boa sorte!

Antes de qualquer coisa é importante que todos saibam o uso do Ctrl+espaço que é essencial para você desenvolvedor. Ele abre o assistente de código que vai ser útil para completar nome de classes, métodos, atributos e etc em todas as partes do código.



Busca

• Ctrl+Shift+R
Busca e abre rapidamente qualquer item do projeto, seja ele uma classe, arquivo XML, arquivo de properties, bytecode etc.
• Ctrl+T
Mostra a hierarquia da classe atual, permitindo abrir rapidamente qualquer classe da hierarquia.
• Ctrl+H
Abre a janela de pesquisa nos arquivos do workspace. Nela é possível procurar tanto por trechos textuais nos arquivos, quanto por referências a elementos da linguagem como tipos, métodos, pacotes, atributos etc.
• Ctrl+J
Busca incremental no arquivo aberto. O cursor é posicionado no trecho de código correspondente à medida que você digita.
• Ctrl+Alt+G
Pesquisa no workspace por todas as ocorrências do elemento sobre o qual o cursor está posicionado.

Navegação no código

• Alt+Left
Volta para a última posição editada.
• Alt+Right
Avança para a próxima posição editada.
• Ctrl+O
Mostra a estrutura (outline) do arquivo que está sendo editado e permite navegar até declaração selecionada.
• Ctrl+D
Apaga a linha corrente.
• Ctrl+G
Localiza a declaração da classe, interface, atributo ou método selecionado.
• Crtl+Shift+G
Localiza todas as referências à classe, interface, atributo ou método selecionado existentes no workspace.
• Ctrl+3
Navegação rápida. Navega entre todos os itens abertos em todas as views e perspectivas abertas no momento.

Organização do código

• Crtl+Shift+F
Formata automaticamente o trecho de código selecionado de acordo com as configurações definidas em Window -> Preferences -> Java -> Code Style -> Formatter
• Crtl+Shift+O
Organiza os imports do arquivo aberto, removendo as declarações desnecessárias.
• Crtl+Shift+C
Adiciona comentário ao trecho selecionado. Serve também para remover o comentário se já houver.

Depuração

• Ctrl+1
Invoca a funcionalidade de reparo rápido (quick fix) quando o compilador acusa algum erro. O reparo rápido consiste em um pop-up com uma lista de sugestões de modificação que são aplicadas automaticamente ao selecionar.
• Ctrl+Shift+I
Inspeciona o valor das variáveis enquanto ocorre a depuração. Disponível apenas na perspectiva Debug.
• Ctrl+3
Navega entre todos os arquivos abertos, e todas as views abertas de todas as perspectivas. Basta digitar o nome.

Refactoring

• Alt+Shift+R
Renomeia o elemento.
• Alt+Shift+L
Extrair para variável local. Atribui a expressão selecionada a uma váriavel.
• Alt+Shift+M
Extrair método. Cria um novo método contendo o trecho de código selecionado.
• Alt+Shift+S
Abre o menu igual ao que aparece ao clicar com o botão direito no código fonte.
• Alt+Shift+T
Abre o menu de refatoração.
• Alt+Shift+X
Executa sua classe java que tem um “public static void main”.


Configuração

• Ctrl+Shift+L
Mostra a lista de atalhos de teclado.
• Ctrl+Shift+L duas vezes
Abre a tela de personalização de atalhos de teclado.

sexta-feira, 6 de fevereiro de 2009

Código de como enviar e-mail pelo c++

Olá pessoal,

Demorei, mas postei o código de uma função de como enviar e-mail utilizando o c++.

Nesta função deixei o remetente como constante e a passagem da mensagem e do destinatário como parâmetro. A função pode ser mudada para passagem de parâmetro do remetente também. Não tive essa necessidade, mas pode ser que alguém tenha.

Espero que tenha ajudado vocês.

Até a próxima dica.


void CSIOAVISODlg::email(CString StrAvisoProblema, LPCTSTR to)
//Primeiro parâmetro é a mensagem a ser enviada e o segundo é o destinatário
{

int iProtocolPort = 0;
char szSmtpServerName[64] = "";
char szToAddr[64] = "";
char szFromAddr[64] = "";
char szBuffer[8192] = "";
char szLine[255] = "";
char szMsgLine[8192] = "";
char szSubject[255] = "";
char szMsg[16384] = "";

SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
LPSERVENT lpServEntry;
SOCKADDR_IN SockAddr;

// Convert to a char*
const size_t newsize = 16384;
char nstring[newsize];
strcpy(nstring, StrAvisoProblema);
// strcat(nstring, " (char *)");

lstrcpy(szSmtpServerName, "10.153.205.21"); //Servidor SMTP
lstrcpy(szToAddr, to); //Destinatário
lstrcpy(szFromAddr, "teste@teste.com.br"); //Remetente
lstrcpy(szSubject, "código fonte email - Carlos Augusto"); //Assunto

// Attempt to intialize WinSock (1.1 or later)
if(WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData))
{
//cout << "Cannot find Winsock v" << VERSION_MAJOR << "." << VERSION_MINOR << " or later!" << endl;

// return 1;
}

// Lookup email server's IP address.
lpHostEntry = gethostbyname(szSmtpServerName);
if(!lpHostEntry)
{
// cout << "Cannot find SMTP mail server " << szSmtpServerName << endl;
// return 1;
}

// Create a TCP/IP socket, no specific protocol
hServer = socket(PF_INET, SOCK_STREAM, 0);
if(hServer == INVALID_SOCKET)
{
// cout << "Cannot open mail server socket" << endl;
// return 1;
}

// Get the mail service port
lpServEntry = getservbyname("mail", 0);

// Use the SMTP default port if no other port is specified
if(!lpServEntry)
iProtocolPort = htons(IPPORT_SMTP);
else
iProtocolPort = lpServEntry->s_port;

// Setup a Socket Address structure
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = iProtocolPort;
SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

// Connect the Socket
if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
{
// cout << "Error connecting to Server socket" << endl;

// return 1;
}

// Receive initial response from SMTP server
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");

//Aqui já entra o código baseado no post anterior sobre como enviar email usando telnet

// Send HELO server.com
sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO");

// Send MAIL FROM:
sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM");

// Send RCPT TO:
sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO");

// Send DATA
sprintf(szMsgLine, "DATA%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA");

sprintf(szMsgLine, "FROM: %s%sSUBJECT: %s%s%s%s%s", szFromAddr, CRLF, szSubject, CRLF, CRLF, nstring, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");

// Send blank line and a period
sprintf(szMsgLine, "%s.%s", CRLF, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message");

// Send QUIT
sprintf(szMsgLine, "QUIT%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT");

// Close server socket and prepare to exit.
closesocket(hServer);

WSACleanup();

}

//fim da função de enviar email

//para executar basta chamá-la dessa forma
// email(Str, "augustoffilho@gmail.com");
//Primeiro a variável contendo a mensagem que deve ser do tipo CString
// e depois o destinatário

// quando copiarem o código cuidado com as quebras de linhas que não
// ficou muito bom aqui no blog

Links

Related Posts with Thumbnails