Newsletter, Enviando conteúdo por email

Objetivo: Fazer um simples módulo implementado para enviar conteúdos (nodes) já cadastrados no site para o email dos usuários cadastrados na newsletter, sem precisar refazer o post manualmente.

O drupal possui o módulo chamado simplenews (http://drupal.org/project/simplenews) que é utilizado para que você possa postar um conteúdo e este é enviado por email para os assinantes da newsletter, no meu projeto pessoal (http://www.skatistaonline.com) eu queria enviar os posts de eventos para os assinantes um determinado tempo antes da data real do evento, fazendo com que os usuários se lembrem do evento e aproveitando fazendo um gancho para o usuário "clique e dê uma passadinha no site".

Para isso eu utilizei o módulo simplenews, um tipo de conteúdo próprio criado com cck chamado evento (title, body, imagefield, date field), então criei o módulo. :)

Como tudo funciona: O módulo implementa o hook cron, que é responsável por chamar todas as funções que estão implementando esse hook no momento da execução do cron, para controlar e garantir que os emails sejam enviados uma única vez eu criei uma variável que armazena a data (ano, mes e dia) e que fica responsável por fazer executar o script apenas 1 única vez.

bom, é difícil explicar escrevendo, então vou postar a lógica do código aqui, o código está disponível para download mais abaixo. :)

# função responsável por fazer a chamada do meu script de cron
function newsletterEvento_cron() {
  _newsletterEvento_procurar();
}

# função que monsta o html do email, com base no objeto node.
function _montaEmail( $n ){}

# função que implementa o envio de email para determinado usuário.
function _sendEmailToUser($user, $subject, $body){}

function _newsletterEvento_procurar( ) {

  #ultimo dia em que a news foi enviada.
  $lastDay = variable_get('newsletterEventoLastDay', null);

  $qtdeDias = 3;

  # se nao existir a data entao criamos uma pra ontem e continuamos a rodar.
  if( is_null($lastDay) ){
    variable_set('newsletterEventoLastDay', date('Y-m-d', time()-3600*24));
    $lastDay = variable_get('newsletterEventoLastDay');
  }

  # verifica que ainda nao enviamos a newsletter.
  if( $lastDay != date('Y-m-d') ) {

	# busca os dados a serem enviados ( table nodes )
	# chama função para preparar o html do email
	_montaEmail( );
	# busca os usuários que devem receber os emails ( table users JOIN tabela simplenews )
	# para cada usuário faz o envio do email
	_sendEmailToUser();

  }else{
    watchdog('newsletterEvento', t('Nenhum evento a ser enviado hoje'));
  }
      # seta que já foi rodado o cron hoje
      variable_set('newsletterEventoLastDay', date('Y-m-d'));
    }
}

Obs. utilizando o Drupal 6.3.

AttachmentSize
newsletterEvento.tar2.02 KB