it-swarm.com.de

Skript mit JMail sendet die E-Mail nicht

Ich habe eine Komponente, die ich für Berechnungen gebaut habe. Ich möchte der Person erlauben, ihre Ergebnisse per E-Mail an sich selbst zu senden. Ich habe versucht, im Controller der default.php eine Mail-Funktion für die hier gezeigte tmpl-Seite zu erstellen:

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';
}

}

Ich habe dann die Aktion in der /components/component/views/view/tmpl/default.php und codiere sie wie hier:

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

Es wird jedoch keine E-Mail gesendet. Hat jemand einen Vorschlag, was ich hier falsch mache?

2
user3597234

Sie sollten wirklich ein Controller-Ereignis für die sendMail-Funktion verwenden. Schauen Sie sich das vorhandene Kontaktformular an:

Die Formularansicht: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/views/contact/tmpl/default_form.php

Die Ansicht hat einen Submit, der die Aufgabe festlegt (contact.submit): https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/views/contact/tmpl/default_form.php

Dann erhält der Controller diese Aufgabe: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/controllers/contact.php#L2

Welche ruft dann eine private _sendMail-Funktion auf: https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/controllers/contact.php#L14

Mit dieser Funktion wird der gesamte Inhalt der E-Mail generiert und versendet.

3
Chad Windnagle

$calculatorEmailAddress scheint nicht deklariert zu sein, schlagen Sie in Mathews 'Antwort nach, um eine Lösung dafür zu finden, wenn dies das Problem ist.

Auch ein Problem, auf das ich mit der Mailer-Funktion gestoßen bin, hat mit SMTP zu tun, keine Formularkomponente oder die Basis-Joomla-API für E-Mails führt tatsächlich irgendeine Art von Protokoll für den Fehler aus.

//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();
}

Diese Technik kann die SMTP-Fehler in einem verwaltbaren Format abrufen, wobei ob_start sie bei Bedarf sogar in einem Fehlerprotokoll speichern kann, da phpmailer sie standardmäßig nur ausgibt.

Die $ body-Variable verwendet auch viele Variablen, die nicht definiert zu sein scheinen. Ich bin mir sicher, dass sie nur in einer anderen Funktion behandelt werden, aber ich würde auch jede einzelne testen, um sicherzustellen, dass sie korrekt funktioniert.

BEARBEITEN: Ich hatte eine Frage in der Nähe dieser, mehr oder der Fehlerseite, aber ich möchte Anerkennung dafür geben, dass ich zu dieser vollständigen Lösung geführt habe: SMTP kein Fehler, aber keine E-Mail senden

1
Jordan Ramstad

Stellen Sie sicher, dass Sie calculatorsEmailAddress aus der Anwendungseingabe erhalten? Ich sehe es nicht in der Funktion deklariert.

$calculatorsEmailAddress = JFactory::getApplication()->input->get('calculatorsEmailAddress', null, 'string'); 

Vielleicht möchten Sie das JMailer::isEmail Methode zum Überprüfen der Adresse vor dem Festlegen des Empfängers.

0
Mathew Lenning