Wysyłanie wiadomości e-mail za pomocą Gmaila SMTP z biblioteką e-mail 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']    = '[email protected]';
        $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('[email protected]', 'myname');
        $this->email->to('[email protected]'); 

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

Otrzymuję ten błąd:

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

Za pomocą PORT 25/587

Mam ten błąd:

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

Nie chcę teraz używać phpmailera. (Właściwie próbowałem użyć phpmailer, ale nie udało mi się).

Jak rozwiązać ten problem, chłopaki?

Shiv
źródło
$config['validation'] = TRUEjest błędny, klucz indeksu jest sprawdzany, więc użyj$config['validate'] = TRUE
Delmo

Odpowiedzi:

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

Z forów CodeIgniter

Teej
źródło
10
+1, Zauważ, że wszystkie elementy tablicy są ujęte w pojedyncze cudzysłowy, a tylko parametry $this->email->set_newlinew cudzysłowach. jest to bardzo ważne, bo inaczej nie działa.
Naveen Kumar
11
to dlatego, że w PHP (i kilku innych językach) \noznacza nową linię tylko wtedy, gdy jest w cudzysłowie. W pojedynczych cudzysłowach oznacza to dosłowne znaki \ n.
DMin
1
Rozwiązaniem było, thnx: dla $ this-> email-> set_newline ("\ r \ n")
TooCooL,
1
@NaveenKumar nadal nie może wysłać e-maila. brak odpowiedzi w$result = $this->email->send();
Pathik Vejani
1
@ThorpeObazee Sir Czy możemy dodać więcej konfiguracji w pliku konfiguracyjnym poczty. na przykład $ config ['subjectEnquiry'] => "E-mail z zapytaniem"; lub $ config ['subjectSuccess'] => "pomyślnie dodano dane";
ankit suthar
19

Musisz włączyć SSL w swojej konfiguracji PHP. Załaduj php.inii znajdź linię zawierającą:

;extension=php_openssl.dll

Odkomentuj to. :RE

(usuwając średnik z instrukcji)

extension=php_openssl.dll

Cerebro
źródło
1
Dotyczy to tylko serwerów Windows. Użyj phpinfo (), aby sprawdzić, czy masz dostępne odpowiednie gniazda i czy openssl znajduje się na twoim serwerze.
jjwdesign
17

Według dokumentów CI ( CodeIgniter Email Library ) ...

Jeśli wolisz nie ustawiać preferencji przy użyciu powyższej metody, możesz zamiast tego umieścić je w pliku konfiguracyjnym. Po prostu utwórz nowy plik o nazwie email.php, dodaj tablicę $ config w tym pliku. Następnie zapisz plik w config / email.php, a zostanie użyty automatycznie. NIE będziesz musiał używać funkcji $ this-> email-> initialize (), jeśli zapiszesz swoje preferencje w pliku konfiguracyjnym.

Udało mi się to uruchomić, umieszczając wszystkie ustawienia w 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'] = '[email protected]';
$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;

Następnie w jednej z metod kontrolera mam coś takiego:

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

Ponadto, jak napisał Cerebro, musiałem odkomentować tę linię w moim pliku php.ini i ponownie uruchomić PHP:

extension=php_openssl.dll
Łukasz
źródło
czy podasz mi kod biblioteki e-mail, za każdym razem, gdy widzę $ this-> load-> library ('email'), ale nie mam biblioteki e-mail, co mogę zrobić? proszę pana, daj mi sposób, w jaki jestem nowszy w CI i kodowaniu. dzięki :)
prakash pokhrel
7

Zmień to na następujące:

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

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

$ci->email->from('[email protected]', 'Blabla');
$list = array('[email protected]');
$ci->email->to($list);
$this->email->reply_to('[email protected]', 'Explendid Videos');
$ci->email->subject('This is an email test');
$ci->email->message('It is working. Great!');
$ci->email->send();
RobinCominotto
źródło
5

wyślij e-mail w formacie html za pośrednictwem 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 protected]', 'Website');
    $list = array('[email protected]', '[email protected]');
    $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());
    }
Chamil Sanjeewa
źródło
1

Inna opcja, którą mam działającą, na serwerze linux z Postfixem:

Najpierw skonfiguruj e-mail CI do korzystania z systemu poczty serwera: np. W email.php, na przykład

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

Następnie skonfiguruj swój postfix, aby przekazywał pocztę do Google (być może w zależności od adresu nadawcy). Prawdopodobnie będziesz musiał wprowadzić ustawienia hasła użytkownika w /etc/postfix/sasl_passwd (dokumentach)

Jest to znacznie prostsze (i mniej fragmentaryczne), jeśli masz Linuksa, już skonfigurowanego do wysyłania niektórych / wszystkich wychodzących e-maili do Google.

leonbloy
źródło
1

Być może Twój serwer hostingowy i serwer poczty e-mail znajdują się w tym samym miejscu i nie musisz przechodzić do uwierzytelniania SMTP. Po prostu zachowaj domyślne ustawienia, takie jak:

$config = array(        
    'protocol' => '',
    'smtp_host' => '',
    'smtp_port' => '',
    'smtp_user' => '[email protected]',
    'smtp_pass' => '**********'
    );

lub

$config['protocol'] = '';
$config['smtp_host'] = '';
$config['smtp_port'] = ;
$config['smtp_user'] = '[email protected]';
$config['smtp_pass'] = 'password';

mi to pasuje.

Shiplu
źródło
Nie pracuj dla mnie bez $ config ['crlf'] = "\ r \ n"; $ config ['newline'] = "\ r \ n";
BoCyrill