Eu tenho um componente que eu criei para fazer cálculos. Gostaria de permitir que a pessoa envie por e-mail seus resultados. Eu tentei criar uma função de correio no controlador do default.php para a página tmpl, mostrada aqui:
public function sendMail () {
$mailer = JFactory::getMailer();
$config = JFactory::getConfig();
$sender = array(
$config->get( 'config.mailfrom' ),
$config->get( 'config.fromname' ) );
$mailer->setSender($sender);
$recipient = $calculatorEmailAddress;
$mailer->addRecipient($recipient);
$body = '<div id="emtresults">'
. '<table border="0" width="75%" max-width="750px" cellpadding="1" cellspacing="1" class="table">'
. '<tr class="calcresultslabels">'
. ' <th> </th>'
. ' <th>10foot</th>'
. ' <th>20foot</th>'
. ' <th>Savings</th>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Materials</th>'
. ' <td align="center"> $ <?php echo round($tenmat1)?></td>'
. ' <td align="center"> $ <?php echo round($twentymat1)?></td>'
. ' <td align="center"> $ <?php echo round($matsavings1)?></td>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Tax</th>'
. ' <td align="center"><div> $ <?php echo round($tentax1)?></td>'
. ' <td align="center"> $ <?php echo round($twentytax1)?></td>'
. ' <td align="center"> $ <?php echo round($taxsavings1)?></td>'
. ' <tr>'
. ' <tr class="calcresults">'
. ' <th>Hours</th>'
. ' <td align="center"> $ <?php echo round($tenhours1)?></td>'
. ' <td align="center"> $ <?php echo round($twentyhours1)?></td>'
. ' <td align="center"> $ <?php echo round($hourssavings1)?></td>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Total</th>'
. ' <td align="center"> $ <?php echo round($tentotal1)?></td>'
. ' <td align="center"> $ <?php echo round($twentytotal1)?></td>'
. ' <td align="center"> $ <?php echo round($totalsavings1)?></td>'
. ' </tr>'
. ' </table>'
. ' </div>';
$mailer->isHTML(true);
$mailer->Encoding = 'base64';
$mailer->setSubject('EMT Calculator App Results');
$mailer->setBody($body);
$send = $mailer->Send();
if ( $send !== true ) {
echo 'Error sending email: ' . $send->__toString();
} else {
echo 'Mail sent';
}
}
Em seguida, tenho a ação em /components/component/views/view/tmpl/default.php e codifico-a como aqui:
<form method='post' action='/index.php?option=com_emtapp&view=calculators&task=sendMail'>
<tr class="calcrow"><td>Email your Results:</td><td align="center"><div> <input type="email" name="calculatorEmailAddress" value=""/></div></td></tr>
<input type="hidden" name="tenmat1" value="<?php echo round($tenmat)?>">
<input type="hidden" name="twentymat1" value="<?php echo round($twentymat)?>">
<input type="hidden" name="matsavings1" value="<?php echo round($matsavings)?>">
<input type="hidden" name="tentax1" value="<?php echo round($matsavings)?>">
<input type="hidden" name="twentytax1" value="<?php echo round($twentytax)?>">
<input type="hidden" name="taxsavings1" value="<?php echo round($taxsavings)?>">
<input type="hidden" name="tenhours1" value="<?php echo round($tenhours)?>">
<input type="hidden" name="twentyhours1" value="<?php echo round($twentyhours)?>">
<input type="hidden" name="hourssavings1" value="<?php echo round($hourssavings)?>">
<input type="hidden" name="tentotal1" value="<?php echo round($tentotal)?>">
<input type="hidden" name="twentytotal1" value="<?php echo round($twentytotal)?>">
<input type="hidden" name="totalsavings1" value="<?php echo round($totalsavings)?>">
<input type='submit' value='Email Your Results'/>
</form>
No entanto, ele não enviará nenhum email. Alguém tem alguma sugestão sobre o que estou fazendo de errado aqui?
Você realmente deveria estar usando um evento do controlador para a função sendMail. Dê uma olhada no material do formulário de contato existente:
A exibição do formulário: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/views/contact/tmpl/default_form.php
A exibição possui um envio que define a tarefa (contact.submit): https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/views/contact/tmpl/default_form.php
Em seguida, o controlador obtém essa tarefa: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/controllers/contact.php#L2
Que então chama uma função _sendMail privada: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/controllers/contact.php#L14
Essa função faz todo o trabalho de gerar o conteúdo do email e enviá-lo.
$calculatorEmailAddress
parece não ter sido declarado, consulte a resposta de Mathews para uma solução para isso, se esse for o problema.
Além disso, um problema que eu deparei com a função mailer tem a ver com SMTP, nenhum componente de formulário ou a API básica do Joomla para email realmente faz qualquer tipo de log para o erro.
//all variables in here need to be defined
$body = '<div id="emtresults">'
. '<table border="0" width="75%" max-width="750px" cellpadding="1" cellspacing="1" class="table">'
. '<tr class="calcresultslabels">'
. ' <th> </th>'
. ' <th>10foot</th>'
. ' <th>20foot</th>'
. ' <th>Savings</th>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Materials</th>'
. ' <td align="center"> $ <?php echo round($tenmat1)?></td>'
. ' <td align="center"> $ <?php echo round($twentymat1)?></td>'
. ' <td align="center"> $ <?php echo round($matsavings1)?></td>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Tax</th>'
. ' <td align="center"><div> $ <?php echo round($tentax1)?></td>'
. ' <td align="center"> $ <?php echo round($twentytax1)?></td>'
. ' <td align="center"> $ <?php echo round($taxsavings1)?></td>'
. ' <tr>'
. ' <tr class="calcresults">'
. ' <th>Hours</th>'
. ' <td align="center"> $ <?php echo round($tenhours1)?></td>'
. ' <td align="center"> $ <?php echo round($twentyhours1)?></td>'
. ' <td align="center"> $ <?php echo round($hourssavings1)?></td>'
. ' </tr>'
. ' <tr class="calcresults">'
. ' <th>Total</th>'
. ' <td align="center"> $ <?php echo round($tentotal1)?></td>'
. ' <td align="center"> $ <?php echo round($twentytotal1)?></td>'
. ' <td align="center"> $ <?php echo round($totalsavings1)?></td>'
. ' </tr>'
. ' </table>'
. ' </div>';
$config = JFactory::getConfig();
//taken form Mathew Lennings answer
$calculatorsEmailAddress = JFactory::getApplication()->input->get('calculatorsEmailAddress', null, 'string');
try{
ob_start();
$mailer = JFactory::getMailer();
$sender = array(
$config->get( 'config.mailfrom' ),
$config->get( 'config.fromname' ) );
$mailer->setSender($sender);
$recipient = $calculatorEmailAddress;
$mailer->addRecipient($recipient);
$mailer->Encoding = 'base64';
$mailer->setSubject('EMT Calculator App Results');
$mailer->isHTML(true);
$mailer->setBody($body);
$mailer->SMTPDebug = 1;
$send = $mailer->Send();
if ( $send !== true ) {
echo 'Error sending email: ' . $send->__toString();
} else {
echo 'Mail sent';
}
echo ob_get_clean();
}catch(phpmailerException $e){
echo $e->errorMessage();
}catch(Exception $e){
echo $e->getMessage();
}
Essa técnica pode obter os erros SMTP em um formato gerenciável, com o ob_start até mesmo salvá-lo em um log de erros, se necessário, já que o phpmailer apenas repete isso por padrão.
A variável $ body também usa muitas variáveis que parecem não estar definidas, mas tenho certeza de que isso é tratado apenas em outra função, mas também testaria cada uma delas para garantir que ela esteja funcionando corretamente.
EDIT: Eu tinha uma pergunta perto desta, mais ou do lado do erro, mas quero dar crédito por me levar a esta solução completa: SMTP sem erro, mas não enviando email
Você está certificando-se de obter o calculatorsEmailAddress
da entrada do aplicativo? Não o vejo declarado na função.
$calculatorsEmailAddress = JFactory::getApplication()->input->get('calculatorsEmailAddress', null, 'string');
Você pode querer usar o JMailer::isEmail
método para validar o endereço antes de definir o destinatário.