2011-12-15 3 views
16

Я думаю, что вчера Amazon объявила о поддержке SMTP для SES (Simple Email Service).Codeigniter SMTP Email с Amazon SES

Я пытался отправить электронную почту SMTP с помощью Codeigniter без везения.

У меня есть проверенный отправитель и все выглядит хорошо:

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

Я попробовал на следующие smtp_host:

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

Когда я эхо print_debugger() я получаю:

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

Эти тесты работают на MediaTemple (GS) сервера.

+0

Это также случай с другими "родственными-фреймворков" в CodeIgniter - FuelPHP, например. – antitoxic

ответ

24

Я получил это сообщение тайм-аут, пока я не добавил строку: -

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

Я хозяин установлен как ssl://email-smtp.us-east-1.amazonaws.com

+0

hi @Stephen, я добавил эти строки в свой код, но я все равно получаю сообщение об ошибке при отправке моей ошибки gmail: адрес электронной почты не проверен. Он работает только при отправке в тот же домен, из которого я отправил сообщение. Можете ли вы рассказать мне, что ваши адреса от «и» до «?» В каждом случае? благодаря! –

+0

@ Stephen, где вы это узнали? Это спасло меня здесь и с инфраструктурой FuelPHP. – antitoxic

+3

К сожалению, эта явная команда обязательна: установка ее через '$ config ['newline'] = '\ r \ n';' в 'config/email.php' не работала. – 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

Не могли бы вы добавить какой-то контекст для вашего ответа, пожалуйста. Объясните, где код, предоставленный OP, ошибочно и почему это работает. – ChiefTwoPencils

2

Устройством, работал для меня выглядит следующим образом:

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

Символ новой строки должен быть установлен в "\ r \ n" и может быть установлен в конфигурационном файле, если пропе rly, установленный как «\ r \ n», а не «\ r \ n», как указано выше.

3

Я также необходимо добавить строку

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

моей конфигурации массива

это supported by CI 2.1.0 and greater

+0

Это исправлено для меня. Я думаю, что Amazon SES требует этого сейчас. Спасибо. – AdmiralAdama

1

Вам нужно сделать 3 вещи, чтобы получить CI работать с Amazon Simple Email Service (SES)

  1. Необходимо установить newline = \r\n или вы получите тайм-аут.
  2. Необходимо установить smtp_crypto что-то. (Новое требование)
  3. Необходимо убедиться, что адрес электронной почты «от» одобрен в SAS Амазонки. Я сделал свой адрес «с» по электронной почте «[email protected]»

Кроме того, вы должны настроить DKIM для своего «адресата», чтобы предотвратить попадание почтовых сообщений в папки спама. Это предполагает переход на Амазонскую SES -> Управление идентификацией -> Адреса электронной почты -> DKIM, нажатие кнопки включения и добавление 3 DNS-записей в DNS вашего сайта.

Не нужно ничего делать, чтобы настроить SPF. Область конверта amazonses.com передает SPF.

Наконец, убедитесь, что вы используете «ответ на», если хотите, чтобы пользователи могли отвечать на адрес электронной почты, отличный от вашего одобренного «с» адреса электронной почты.

Пример рабочий код:

$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

Работал как очарование - спасибо! –

Смежные вопросы