使用CodeIgniter通过Gmail发送电子邮件的问题?

时间:2011-08-17 09:18:31

标签: php email codeigniter gmail

我正在尝试通过我的Gmail帐户在codeigniter中发送电子邮件。我目前的代码如下:

$config = Array(
     'protocol' => 'smtp',
     'smtp_host' => 'ssl://smtp.googlemail.com',
     'smtp_port' => 465,
     'smtp_user' => 'me@gmail.com',
     'smtp_pass' => 'my_gmail_password',
     'mailtype'  => 'html',
     'charset'   => 'iso-8859-1'
);

$this->load->library('email', $config);
$this->email->set_newline("\r\n");
$this->email->from('me@gmail.com', 'Me');
$this->email->to("me@gmail.com");
$this->email->subject('A test email from CodeIgniter using Gmail');
$this->email->message("A test email from CodeIgniter using Gmail");

$this->email->send();

然而,这给了我以下错误:

Message: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.googlemail.com:465 (Connection timed out)
Filename: libraries/Email.php

Message: fwrite(): supplied argument is not a valid stream resource

Message: fgets(): supplied argument is not a valid stream resource

我们非常感谢您解决此问题的任何帮助!谢谢!

注意:我可以向您保证我的Gmail电子邮件&密码正确

2 个答案:

答案 0 :(得分:1)

错误表示您无法连接您输入的SMTP地址。

你应该使用:smtp.gmail.com

检查以下链接以供参考: http://mail.google.com/support/bin/answer.py?answer=13287

答案 1 :(得分:0)

你可以下载“Shawn McCool”使用“Swift-Mailer”的漂亮的小火花包。 查看他的网站以获取安装说明

以下是我使用DRY方法发送电子邮件的配置(需要PHP 5.3.0!)。

配置 | --mailer [点]的PHP

$config['swift_email_server'] = 'ssl://smtp.googlemail.com';
$config['swift_email_port'] = 465;
$config['swift_email_username'] = '######';
$config['swift_email_password'] = '######';

Libarary | --MY_Email

    class MY_Email extends CI_Email {


    public function __construct(){
        parent::__construct();

    }
    /**
     * =========================================================================
     * Parse's html email templates - initalised via swift-mailer
     * 
     * @param mixed $data
     * @param string $template
     * @return html
     * 
     * ========================================================================= 
     */
    public function send_mail($data, $template){

        //Anonymous functions are available since PHP 5.3.0
        $callback = function ($matches) use ($data){
            return ( isset($data[$matches[1]]) ) 
               ? $data[$matches[1]] 
               : $matches[0];
        };

        //Finds any matches in brackets [] and replaces them with data passed via callback
        return preg_replace_callback(
                '/\[(.*?)\]/', 
                $callback, 
                read_file(EMAIL_TEMPLATES . $template));

    }


}

Email templates location defined in index.php
define('EMAIL_TEMPLATES', 'emailtemplates');

控制器 | --MY_Controller

    class MY_Controller extends MX_Controller{

        protected $user;

        protected $swiftMailer = NULL;


        public function __construct(){

            parent::__construct();


            $this->user =   ($this->session->userdata('uid'))
                        ?    Member::find($this->session->userdata('uid')) : array();

            $this->setup_profile();


           $this->form_validation->set_error_delimiters('<p class="form-error">', '</p>');


        }

        public function setup_profile(){
            $sections = array(
            'config'  => FALSE,
            'http_headers' => FALSE,
            'queries'  =>  FALSE,
            'memory_usage'  =>  FALSE
            );

            $this->output->set_profiler_sections($sections);

            if(ENVIRONMENT === 'development'){
                $this->output->enable_profiler(TRUE);
            }
        }

    protected function prep_email($data, $template){


            $message = 
            Swift_Message::newInstance('Type your heading here...')
              ->setFrom($data['email_address'])
              ->setTo(array($this->config->item('primary_email'), $data['email_address']))
              ->setBody( $this->email->send_mail($data, $template))
              ->setContentType('text/html');

            return ( $this->swiftMailer->send($message) );


     }


}

模块 | --services //简单测试模块

public function arrange(){         $ config = array(             array('field'=&gt;'service','label'=&gt;'Service','rules'=&gt;'trim | required | max_lenght [128]'),             array('field'=&gt;'num','label'=&gt;'会话的数量','规则'=&gt;'trim | required | numeric'),             array('field'=&gt;'request_date','label'=&gt;'Request_date','rules'=&gt;'trim | required'),             array('field'=&gt;'note','label'=&gt;'Note','rules'=&gt;'trim | max_lenght [500]')         );

    $this->form_validation->CI =& $this; 
    $this->form_validation->set_rules($config); 

    if($this->form_validation->run($this)){

        $service = Service::find($this->input->post('service'));

        if((int)$this->input->post('num') > 1){
            $potential = ( $this->input->post('num') * $service->price );
        }else{
            $potential =    $this->input->post('num');
        }

        $insert = array(
            'service_id'    =>  $this->input->post('service'),
            'num'   =>  $this->input->post('num'),
            'request_date'  =>  $this->input->post('request_date'),
            'note'  =>  serialize( $this->input->post('note') ),
            'potential_income'  =>  $potential,
            'member_id' =>  $this->user->id,
            'status'    =>  'pending'
        );

        $emaildata = array(
            'service'   =>  $service->slug,
            'num'   =>  $insert['num'],
            'request_date'  =>  $insert['request_date'],
            'note'  =>  $insert['note'],
            'potential_income'  =>  $potential,
            'email_address' =>  $this->user->email_address,
            'status'    =>  'pending',
            'fullname'  =>  $this->user->firstname . '&nbsp;' . $this->user->surname,
            'message_sent'  =>  date('M d h:iA'),
          'site_link'  =>  ''
        );

        if(Meeting::create($insert)){

            if(parent::prep_email($emaildata, 'request_meeting[dot]html')){
                $this->session->set_flashdata('success' ,'Request has been sent! You will recieve an email shortly from Paul');
                //redirect('/');
            }else{
                $this->session->set_flashdata('error', 'Email service seems to be down at the moment');
                //redirect('/');
            }

        }else{
            $this->session->set_flashdata('error', 'Unable to request meeting at this time');
            //redirect('/');
        }


    }else{
        $this->meetings_form();
    }

希望这有帮助!