PHP:电子邮件仅适用于某些电子邮件客户端

时间:2013-02-15 11:50:41

标签: php codeigniter email ion-auth

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

我已经设置了注册/登录/忘记密码,除忘记密码设置的问题外,所有这些都有效。

如果用户的电子邮件地址是使用hotmail,yahoo,gmail等,他们收到的电子邮件很好,可以重置密码和数据库中的数据更改。

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

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

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

使用Ion Auth我只保留了代码,并将其更改为配置文件中的设置:

CONFIG

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

2 个答案:

答案 0 :(得分: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;   
    }    
}

答案 1 :(得分:0)

此刻我也有同样的问题。以下是基于此论坛帖子的解决方案,它真正帮助我理解了这个错误。

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

在我的案例中,问题是我使用来自存储库的语言文件的IonAuth多语言设置。在德语语言文件中,您将找到'email_forgotten_password_subject'语言行的特殊字符'ü'。

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

我已经创建了一个文件application / libraries / MY_Email.php来将使用过的主题setter方法与这个内容挂钩:

<?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以正确的方式对主题进行编码,我们都会去周末喝一些啤酒。

我希望我的解决方案符合您的问题。

干杯