it-swarm-vi.com

Tập lệnh sử dụng JMail không gửi email

Tôi có một thành phần mà tôi xây dựng để tính toán. Tôi muốn cho phép người đó gửi email kết quả của họ cho chính họ. Tôi đã cố gắng tạo một chức năng thư trong bộ điều khiển của default.php cho trang tmpl, được hiển thị ở đây:

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

}

Sau đó, tôi có hành động trong /components/component/view/view/tmpl/default.php và mã hóa nó như ở đây:

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

Tuy nhiên, nó sẽ không gửi bất kỳ email nào. Có ai có bất cứ đề nghị nào về những gì tôi đang làm sai ở đây không?

2
user3597234

Bạn thực sự nên sử dụng một sự kiện điều khiển cho chức năng sendMail. Hãy xem các công cụ biểu mẫu liên hệ hiện có:

Chế độ xem biểu mẫu: https://github.com/j Joomla/j Joomla-cms/blob/staging/components/com_contact/view/contact/tmpl/default_form.php

Chế độ xem có một trình gửi đặt nhiệm vụ (contact.submit): https://github.com/j Joomla/j Joomla-cms/blog/staging /compents/com_contact/view/contact/tmpl/default_form.php

Sau đó, bộ điều khiển nhận nhiệm vụ đó: https://github.com/j Joomla/j Joomla-cms/blob/staging/components/com_contact/controllers/contact.php#L2

Sau đó gọi hàm _sendMail riêng tư: https://github.com/j Joomla/j Joomla-cms/blob/staging/component/com_contact/control/control.php # L14

Chức năng đó thực hiện tất cả công việc tạo nội dung email và gửi đi.

3
Chad Windnagle

$calculatorEmailAddress dường như không được khai báo, hãy tham khảo câu trả lời của Mathews để biết giải pháp cho vấn đề đó nếu đó là vấn đề.

Ngoài ra, một vấn đề tôi gặp phải với chức năng gửi thư phải thực hiện với SMTP, không có thành phần biểu mẫu hoặc API Joomla cơ bản cho thư thực sự có bất kỳ loại nhật ký nào cho lỗi.

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

Kỹ thuật này có thể nhận được các lỗi SMTP ở định dạng có thể quản lý được, với ob_start thậm chí có thể lưu nó vào nhật ký lỗi nếu cần vì phpmailer chỉ lặp lại theo mặc định.

Biến $ body cũng sử dụng nhiều biến dường như không được xác định, tôi chắc chắn rằng nó chỉ được xử lý trong một hàm khác, nhưng tôi cũng sẽ kiểm tra từng biến để đảm bảo nó hoạt động chính xác.

EDIT: Tôi đã có một câu hỏi gần với câu hỏi này, nhiều hơn hoặc về phía lỗi nhưng tôi muốn cung cấp tín dụng để dẫn tôi đến giải pháp đầy đủ này: SMTP không có lỗi nhưng không gửi email

1
Jordan Ramstad

Bạn có chắc chắn nhận được calculatorsEmailAddress từ đầu vào ứng dụng không? Tôi không thấy nó được khai báo trong hàm.

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

Bạn có thể muốn sử dụng JMailer::isEmail phương thức xác thực địa chỉ trước khi đặt người nhận.

0
Mathew Lenning