Надсилання електронної пошти за допомогою gmail smtp з бібліотекою електронної пошти codeigniter


79
<?php
class Email extends Controller {

    function Email()
    {
        parent::Controller();   
        $this->load->library('email');
    }

    function index()
    {
        $config['protocol']    = 'smtp';
        $config['smtp_host']    = 'ssl://smtp.gmail.com';
        $config['smtp_port']    = '465';
        $config['smtp_timeout'] = '7';
        $config['smtp_user']    = 'mygmail@gmail.com';
        $config['smtp_pass']    = '*******';
        $config['charset']    = 'utf-8';
        $config['newline']    = "\r\n";
        $config['mailtype'] = 'text'; // or html
        $config['validation'] = TRUE; // bool whether to validate email or not      

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

        $this->email->from('mygmail@gmail.com', 'myname');
        $this->email->to('target@gmail.com'); 

        $this->email->subject('Email Test');
        $this->email->message('Testing the email class.');  

        $this->email->send();

        echo $this->email->print_debugger();

        $this->load->view('email_view');
    }
}

Я отримую цю помилку:

A PHP Error was encountered
Severity: Warning
Message: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:465 (Connection timed out)
Filename: libraries/Email.php
Line Number: 1641

Використовуючи PORT 25/587

Я отримав цю помилку:

A PHP Error was encountered
Severity: Warning
Message: fsockopen() [function.fsockopen]: SSL operation failed with code 1. OpenSSL Error messages: error:140770FC:SSL routines:func(119):reason(252)
Filename: libraries/Email.php
Line Number: 1641

Я не хочу користуватися phpmailer зараз. (Насправді я намагався використовувати phpmailer, але мені не вдалося).

Як мені вирішити цю проблему, хлопці?


$config['validation'] = TRUEнеправильно, ключ індексу перевіряється, тому використовуйте$config['validate'] = TRUE
Delmo

Відповіді:


122
$config = Array(
    'protocol' => 'smtp',
    'smtp_host' => 'ssl://smtp.googlemail.com',
    'smtp_port' => 465,
    'smtp_user' => 'xxx',
    'smtp_pass' => 'xxx',
    'mailtype'  => 'html', 
    'charset'   => 'iso-8859-1'
);
$this->load->library('email', $config);
$this->email->set_newline("\r\n");

// Set to, from, message, etc.

$result = $this->email->send();

З форумів CodeIgniter


10
+1, Зверніть увагу, що всі елементи масиву містяться в одинарних лапках, а лише параметри $this->email->set_newline- у подвійних лапках. це дуже важливо, інакше це не працює.
Naveen Kumar

11
це тому, що в PHP (та деяких інших мовах) \nновий рядок означає лише у подвійних лапках. В одинарних лапках це означає буквальні символи \ n.
DM,

1
Рішення було, thnx: для $ this-> email-> set_newline ("\ r \ n")
TooCooL

1
@NaveenKumar все ще не може надіслати електронне повідомлення. не отримав жодної відповіді$result = $this->email->send();
Pathik Vejani

1
@ThorpeObazee Сер. Чи можемо ми додати ще кілька конфігурацій у файл конфігурації пошти. наприклад, $ config ['subjectEnquiry'] => "Запит електронної пошти"; або $ config ['subjectSuccess'] => "успішно додано дані";
ankit suthar

19

Вам потрібно ввімкнути SSL у вашій конфігурації PHP. Завантажте php.iniта знайдіть рядок із наступним:

;extension=php_openssl.dll

Розкоментуйте це. : D

(видаливши крапку з комою з твердження)

extension=php_openssl.dll


1
Це лише для серверів Windows. Використовуйте phpinfo (), щоб перевірити, чи є у вас належні сокети і чи є openssl на вашому сервері.
jjwdesign

17

Згідно з документами CI ( бібліотека електронної пошти CodeIgniter ) ...

Якщо ви вважаєте за краще не встановлювати налаштування за допомогою вищезазначеного методу, ви можете замість цього помістити їх у файл конфігурації. Просто створіть новий файл, який називається email.php, додайте в нього масив $ config. Потім збережіть файл за адресою config / email.php, і він буде використаний автоматично. Вам НЕ потрібно буде використовувати функцію $ this-> email-> initialize (), якщо ви збережете свої налаштування у конфігураційному файлі.

Я зміг змусити це працювати, помістивши всі налаштування в application / config / email.php .

$config['useragent'] = 'CodeIgniter';
$config['protocol'] = 'smtp';
//$config['mailpath'] = '/usr/sbin/sendmail';
$config['smtp_host'] = 'ssl://smtp.googlemail.com';
$config['smtp_user'] = 'YOUREMAILHERE@gmail.com';
$config['smtp_pass'] = 'YOURPASSWORDHERE';
$config['smtp_port'] = 465; 
$config['smtp_timeout'] = 5;
$config['wordwrap'] = TRUE;
$config['wrapchars'] = 76;
$config['mailtype'] = 'html';
$config['charset'] = 'utf-8';
$config['validate'] = FALSE;
$config['priority'] = 3;
$config['crlf'] = "\r\n";
$config['newline'] = "\r\n";
$config['bcc_batch_mode'] = FALSE;
$config['bcc_batch_size'] = 200;

Тоді в одному з методів контролера у мене є щось на зразок:

$this->load->library('email'); // Note: no $config param needed
$this->email->from('YOUREMAILHERE@gmail.com', 'YOUREMAILHERE@gmail.com');
$this->email->to('SOMEEMAILHERE@gmail.com');
$this->email->subject('Test email from CI and Gmail');
$this->email->message('This is a test.');
$this->email->send();

Крім того, як писав Cerebro, мені довелося прокоментувати цей рядок у своєму файлі php.ini та перезапустити PHP:

extension=php_openssl.dll

Ви надасте мені код бібліотеки електронної пошти кожного разу, коли я бачив $ this-> load-> library ('email'), але я не маю бібліотеки електронної пошти, що я можу зробити ?? будь ласка, сер, дайте мені спосіб я новіший у CI та кодуванні. дякую :)
prakash pokhrel

7

Змініть його на таке:

$ci = get_instance();
$ci->load->library('email');
$config['protocol'] = "smtp";
$config['smtp_host'] = "ssl://smtp.gmail.com";
$config['smtp_port'] = "465";
$config['smtp_user'] = "blablabla@gmail.com"; 
$config['smtp_pass'] = "yourpassword";
$config['charset'] = "utf-8";
$config['mailtype'] = "html";
$config['newline'] = "\r\n";

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

$ci->email->from('blablabla@gmail.com', 'Blabla');
$list = array('xxx@gmail.com');
$ci->email->to($list);
$this->email->reply_to('my-email@gmail.com', 'Explendid Videos');
$ci->email->subject('This is an email test');
$ci->email->message('It is working. Great!');
$ci->email->send();

5

відправити html електронну пошту через codeiginater - -

    $this->load->library('email');
    $this->load->library('parser');



    $this->email->clear();
    $config['mailtype'] = "html";
    $this->email->initialize($config);
    $this->email->set_newline("\r\n");
    $this->email->from('email@example.com', 'Website');
    $list = array('xxxxxxxx@archmage.lk', 'xxxxx@gmail.com');
    $this->email->to($list);
    $data = array();
    $htmlMessage = $this->parser->parse('messages/email', $data, true);
    $this->email->subject('This is an email test');
    $this->email->message($htmlMessage);



    if ($this->email->send()) {
        echo 'Your email was sent, thanks chamil.';
    } else {
        show_error($this->email->print_debugger());
    }

1

Ще один варіант, який я працюю, на сервері Linux з Postfix:

По-перше, налаштуйте електронну пошту CI для використання електронної пошти вашого сервера: наприклад, в email.php, наприклад,

# alias to postfix in a typical Postfix server
$config['protocol'] = 'sendmail'; 
$config['mailpath'] = '/usr/sbin/sendmail'; 

Потім налаштуйте свій постфікс для пересилання пошти в Google (можливо, залежно від адреси відправника). Ймовірно, вам потрібно буде ввести налаштування пароля користувача/etc/postfix/sasl_passwd (docs)

Це набагато простіше (і менш фрагментарно), якщо у вас є вікно Linux, уже налаштоване на надсилання деяких / усіх вихідних листів до Google.


1

Можливо, ваш хостинговий сервер та поштовий сервер знаходяться в одному місці, і вам не потрібно йти на аутентифікацію smtp. Просто зберігайте кожну річ за замовчуванням, наприклад:

$config = array(        
    'protocol' => '',
    'smtp_host' => '',
    'smtp_port' => '',
    'smtp_user' => 'yourname@gmail.com',
    'smtp_pass' => '**********'
    );

або

$config['protocol'] = '';
$config['smtp_host'] = '';
$config['smtp_port'] = ;
$config['smtp_user'] = 'yourname@gmail.com';
$config['smtp_pass'] = 'password';

це працює для мене.


Не працювати мені без $ config ['crlf'] = "\ r \ n"; $ config ['newline'] = "\ r \ n";
BoCyrill

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.