2011-12-15 12 views
16

Credo che ieri Amazon abbia annunciato il supporto SMTP per SES (Simple Email Service).Codeigniter SMTP Email con Amazon SES

Ho provato a inviare e-mail SMTP con Codeigniter senza fortuna.

Ho un mittente verificato e tutto sembra a posto:

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

$config = array(
    'protocol' => 'smtp', 
    'smtp_host' => 'email-smtp.us-east-1.amazonaws.com', 
    'smtp_user' => 'SMTP USERNAME', 
    'smtp_pass' => 'SMTP PASSWORD', 
    'smtp_port' => 465, 
    'mailtype' => 'html' 
); 

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

$this->email->from('[email protected]', 'Test From'); 
$this->email->to('[email protected]', 'Test To'); 
$this->email->subject('Test'); 
$this->email->message('test'); 

$this->email->send(); 

ho provato lo smtp_host folowing:

  • email-smtp.us-east-1.amazonaws.com
  • TLS : //email-smtp.us-east-1.amazonaws.com
  • ssl: //email-smtp.us-east-1.amazonaws.com
.210

Quando mi associo il print_debugger() ottengo:

220 email-smtp.amazonaws.com ESMTP SimpleEmailService-194655181 
hello: 421 Timeout waiting for data from client. 

Questi test eseguiti su un Mediatemple (gs) del server.

+0

Questo è anche il caso di altri "sorelle Cornici" di CodeIgniter - FuelPHP per esempio. – antitoxic

risposta

24

che ho ricevuto un messaggio di timeout fino a quando ho aggiunto la linea: -

$this->email->set_newline("\r\n"); 

ho mio ospite impostato come ssl://email-smtp.us-east-1.amazonaws.com

+0

hi @Stephen, ho aggiunto queste righe al mio codice, ma sto ancora ricevendo un errore quando invio al mio gmail 'errore: l'indirizzo email non è verificato. Funziona solo quando invio allo stesso dominio da cui ho inviato il messaggio. Puoi dirmi quali sono i tuoi indirizzi e-mail in ogni caso? Grazie! –

+0

@Stephen, dove l'hai trovato? Questo mi ha salvato anche qui con il framework FuelPHP. – antitoxic

+3

Sfortunatamente questo comando esplicito è necessario: impostarlo tramite '$ config ['newline'] = '\ r \ n';' in 'config/email.php' non ha funzionato. – pr1001

4
public function enviar_email($para, $assunto, $mensagem, $formato='html'){ 
      $this->CI->load->library('email'); 
      $config['mailtype']  = $formato; 
      $config['useragent'] = 'Post Title'; 
      $config['protocol']  = 'smtp'; 
      $config['smtp_host'] = 'tls://email-smtp.us-east-1.amazonaws.com'; 
      $config['smtp_user'] = 'smtpuser'; 
      $config['smtp_pass'] = 'smtppass'; 
      $config['smtp_port'] = '465'; 
      $config['wordwrap']  = TRUE; 
      $config['newline']  = "\r\n"; 

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

      $this->CI->email->from('Your Verified Sender Email', 'Post Title'); 
      $this->CI->email->to($para); 
      $this->CI->email->subject($assunto); 
      $this->CI->email->message($mensagem); 


      if($this->CI->email->send()): 
        return TRUE; 
      else: 
        $this->CI->email->print_debugger(); 
      endif; 

    } 
+1

Puoi aggiungere un contesto alla tua risposta per favore. Spiega dove il codice fornito dall'OP è andato storto e perché funziona. – ChiefTwoPencils

2

La messa a punto che ha funzionato per me assomiglia a questo:

$test_config['protocol'] = 'smtp'; 
$test_config['smtp_host'] = 'ssl://email-smtp.us-east-1.amazonaws.com'; 
$test_config['smtp_port'] = '465'; 
$test_config['smtp_user'] = 'XXXXXXXXXXXXXXXXXXX'; 
$test_config['smtp_pass'] = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'; 
$test_config['newline']  = "\r\n"; 

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

$this->email->from('[email protected]', 'From at Test.com'); 
$this->email->to('[email protected]'); 

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

$this->email->send(); 

Il carattere di nuova riga deve essere impostato su "\ r \ n" e può essere impostato nel file di configurazione, se si impostare come "\ r \ n", non "\ r \ n" come indicato sopra.

3

ho anche bisogno di aggiungere la riga

$config['smtp_crypto'] = 'tls'; 

alla mia serie config

questo è supported by CI 2.1.0 and greater

+0

Questo lo ha risolto per me. Penso che Amazon SES lo richieda ora. Grazie. – AdmiralAdama

1

Hai bisogno di fare 3 cose per ottenere CI di lavorare con Amazon Simple Email servizi (SES)

  1. È necessario impostare newline = \r\n o si otterrà un timeout.
  2. È necessario impostare smtp_crypto su qualcosa. (Nuovo requisito)
  3. È necessario assicurarsi che l'indirizzo di posta elettronica "da" sia approvato in Amazon SES. Ho fatto il mio "da" indirizzo email "[email protected]"

Inoltre, si dovrebbe configurare DKIM per il vostro "da" indirizzo e-mail per evitare che le email di ottenere messo in cartelle di spam. Ciò implica entrare in Amazon SES -> Gestione identità -> Indirizzi email -> DKIM, premere il pulsante Abilita e aggiungere 3 voci DNS al DNS del tuo sito web.

Non c'è bisogno di fare nulla di speciale per impostare SPF. Il dominio della busta amazonses.com passa a SPF.

Infine, assicurarsi di utilizzare "reply-to" se si desidera che gli utenti siano in grado di rispondere a un indirizzo e-mail diverso dal proprio "da" indirizzo e-mail approvato.

esempio di codice di lavoro:

$obj = &get_instance(); 

$config['protocol'] = 'smtp'; 
$config['smtp_host'] = 'email-smtp.us-west-2.amazonaws.com'; 
$config['smtp_user'] = 'USER'; 
$config['smtp_pass'] = 'PASS'; 
$config['smtp_port'] = '587'; 
$config['newline'] = "\r\n"; 
$config['smtp_crypto'] = 'tls'; 
$obj->email->initialize($config); 

$obj->email->set_mailtype('html'); 
// don't html_escape email header variables 
$obj->email->from(MV_FROM_EMAIL, $from_name); 
$obj->email->reply_to($from_email, $from_name); 
$obj->email->to($to); 
$obj->email->subject($subject); 
$obj->email->message($obj->load->view($path, html_escape($data), true)); 
$obj->email->send(); 
+0

Ha funzionato come un incantesimo - grazie! –

Problemi correlati