1

我正在创建一个使用 Codeigniter 和 Ion Auth Library 的站点。

我已经设置了一个注册/登录/忘记密码,除了忘记密码设置的问题之外,所有这些都可以工作。

如果用户的邮箱地址使用hotmail、yahoo、gmail等,他们收到的邮件正常,可以重置密码和数据库中的数据更改。

我在 Outlook 和 Mail 中收到这封电子邮件的个人域电子邮件地址有问题,所以它看起来可能与 Exchange 有关?

我还在具有 Outlook 的计算机上启用了日志设置,并且在测试发送电子邮件时没有记录任何内容,因此它不会阻止电子邮件。

现在我有一个包含电子邮件配置设置的数组,我不确定它是否与主机、协议、标题有关?!或任何其他设置,但我将在下面提供一些我所拥有的信息。如果有人有任何信息、链接、片段或想法,这将是一个很大的帮助。

通过使用 Ion Auth,我只是将代码保留在原来的位置,并将其更改为我在配置文件中的设置:

配置

   $config['use_ci_email'] = FALSE; // Send Email using the builtin CI email class, if false it will return the code and the identity
    $config['email_config'] = array(
        'protocol'=> 'mail',
        'mailtype' => 'html',
        'charset' =>'utf-8',
        'smpt_host' =>'smpt.url.com',
        'smpt_user'=> 'ssl://smtp.live.com',
        'smtp_port' => '25',
        'validate' => TRUE,
        'priority' => 1

    );

忘记密码控制器

//forgot password
    function forgot_password() {

        $this->form_validation->set_rules('email', 'Email Address', 'required');
        if ($this->form_validation->run() == false) {

            //setup the input
            $this->data['email'] = array('name' => 'email',
                'id' => 'email',
            );

            if ( $this->config->item('identity', 'ion_auth') == 'username' ){
                $this->data['identity_label'] = 'Username';
            }else{
                $this->data['identity_label'] = 'Email';
            }

            //set any errors and display the form
            $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');
            $this->_render_page('forgot_password', $this->data);
        }else{
            // get identity for that email
            $config_tables = $this->config->item('tables', 'ion_auth');
            $identity = $this->db->where('email', $this->input->post('email'))->limit('1')->get($config_tables['users'])->row();

            //run the forgotten password method to email an activation code to the user
            $forgotten = $this->ion_auth->forgotten_password($identity->{$this->config->item('identity', 'ion_auth')});

            if ($forgotten) {
                $this->session->set_flashdata('message', $this->ion_auth->messages());
                redirect("login", 'refresh'); //we should display a confirmation page here instead of the login page
            }else{
                $this->session->set_flashdata('message', $this->ion_auth->errors());
                redirect("forgot_password", 'refresh');
            }
        }
    }


    function _get_csrf_nonce() {
        $this->load->helper('string');
        $key = random_string('alnum', 8);
        $value = random_string('alnum', 20);
        $this->session->set_flashdata('csrfkey', $key);
        $this->session->set_flashdata('csrfvalue', $value);

        return array($key => $value);
    }

忘记密码的库函数:

/**
     * forgotten password feature
     **/
    public function forgotten_password($identity)    //changed $email to $identity
{
        if ( $this->ion_auth_model->forgotten_password($identity) )   //changed
        {
            // Get user information
            $user = $this->where($this->config->item('identity', 'ion_auth'), $identity)->users()->row();  //changed to get_user_by_identity from email

            if ($user)
            {
                $data = array(
                    'identity'      => $user->{$this->config->item('identity', 'ion_auth')},
                    'forgotten_password_code' => $user->forgotten_password_code
                );

                if(!$this->config->item('email_config', 'ion_auth'))
                {
                    $this->set_message('forgot_password_successful');
                    return $data;
                }
                else
                {
                    $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password', 'ion_auth'), $data, true);
                    $this->email->clear();
                    $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth'));
                    $this->email->to($user->email);
                    $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_forgotten_password_subject'));
                    $this->email->message($message);

                    if ($this->email->send())
                    {
                        $this->set_message('forgot_password_successful');
                        return TRUE;
                    }
                    else
                    {
                        $this->set_error('forgot_password_unsuccessful');
                        return FALSE;
                    }
                }
            }
            else
            {
                $this->set_error('forgot_password_unsuccessful');
                return FALSE;
            }
        }
        else
        {
            $this->set_error('forgot_password_unsuccessful');
            return FALSE;
        }
    }
4

2 回答 2

0

此时我也遇到了同样的问题。这是我的解决方案,基于此论坛帖子,它确实帮助我理解了这个错误。

http://ellislab.com/forums/viewreply/785297/

就我而言,问题是我使用存储库中的语言文件对 IonAuth 进行多语言设置。在德语语言文件中,您会发现“email_forgotten_password_subject”语言行的特殊字符“ü”。

Codeigniter 邮件类未使用主题配置中的编码。所以 specialchar 编码错误,出现 smtp_mailer 错误。

我创建了一个文件 application/libraries/MY_Email.php 以将使用的主题设置器方法与此内容挂钩:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Email extends CI_Email
{
    /**
     * Set Email Subject
     *
     * @access    public
     * @param    string
     * @return    void
     */
    function subject($subject)
    {
        $subject = '=?'. $this->charset .'?B?'. base64_encode($subject) .'?=';
        $this->_set_header('Subject', $subject);
    }
} 

现在 Mailclass 正在以正确的方式对主题进行编码,我们都进入周末喝一些啤酒。

我希望我的解决方案与您的问题相匹配。

干杯

于 2014-02-14T18:44:12.890 回答
0

我不知道您需要的确切配置。无论这里是我自己的send_mail()函数与CI 电子邮件库一起使用。它可能会帮助你。但是我总是使用 ION AUTH,而且我在发送邮件时从未遇到过问题。

/*
 * Send an email. 
 * $info array must have following information :
 * $info = array(
 *      'to_email'      => 
 *      'to_name'       =>
 *      'from_email'    =>
 *      'from_name'     =>
 *      'subject'       =>
 *      'body'          =>
 *      'reply_to'      =>
 * )
 */
if ( ! function_exists('send_email'))
{
    function send_email($info)
    {
        $CI = & get_instance();

        // ==========================================================================================
        $CI->load->library('email');

        $config['protocol'] = 'sendmail';
        $config['charset'] = 'iso-8859-1';
        $config['wordwrap'] = TRUE;
        $config['mailtype'] = 'html';

        $CI->email->initialize($config);

        $CI->email->clear();
        $CI->email->set_newline("\r\n");
        // =========================================================================================

        $CI->email->from($info['from_email'], $info['from_name']);
        $CI->email->to($info['to_email'], $info['to_name']);
        $CI->email->cc('mahbub.kuet@gmail.com', 'MAHBUB');

        $CI->email->subject($info['subject']);
        $CI->email->message($info['body']);

        $CI->email->reply_to($info['reply_to'], "No reply");

        if($CI->email->send()) return TRUE;

        return FALSE;   
    }    
}
于 2013-03-22T05:42:32.677 回答