如何更正使用 codeigniter 发送电子邮件的方式
Posted
技术标签:
【中文标题】如何更正使用 codeigniter 发送电子邮件的方式【英文标题】:how to correct way to send email using codeigniter 【发布时间】:2011-09-05 22:42:04 【问题描述】:嘿家伙,我正在尝试使用 codeiginiter 邮件类功能发送电子邮件,但我发现 smtp 协议有问题。我使用 gmail smtp 协议。 我在本地机器上运行它。 我正在使用 Xampp 1.7.4 包,我尝试过如下设置:
function index()
$config['protocol'] = 'smtp'; // mail, sendmail, or smtp The mail sending protocol.
$config['smtp_host'] = 'smtp.gmail.com'; // SMTP Server Address.
$config['smtp_user'] = 'me@gmail.com'; // SMTP Username.
$config['smtp_pass'] = '123'; // SMTP Password.
$config['smtp_port'] = '25'; // SMTP Port.
$config['smtp_timeout'] = '5'; // SMTP Timeout (in seconds).
$config['wordwrap'] = TRUE; // TRUE or FALSE (boolean) Enable word-wrap.
$config['wrapchars'] = 76; // Character count to wrap at.
$config['mailtype'] = 'html'; // text or html Type of mail. If you send HTML email you must send it as a complete web page. Make sure you don't have any relative links or relative image paths otherwise they will not work.
$config['charset'] = 'utf-8'; // Character set (utf-8, iso-8859-1, etc.).
$config['validate'] = FALSE; // TRUE or FALSE (boolean) Whether to validate the email address.
$config['priority'] = 3; // 1, 2, 3, 4, 5 Email Priority. 1 = highest. 5 = lowest. 3 = normal.
$config['crlf'] = "\r\n"; // "\r\n" or "\n" or "\r" Newline character. (Use "\r\n" to comply with RFC 822).
$config['newline'] = "\r\n"; // "\r\n" or "\n" or "\r" Newline character. (Use "\r\n" to comply with RFC 822).
$config['bcc_batch_mode'] = FALSE; // TRUE or FALSE (boolean) Enable BCC Batch Mode.
$config['bcc_batch_size'] = 200; // Number of emails in each BCC batch.
$this->load->library('email');
$this->email->initialize($config);
$this->email->from('me@gmail.com', 'Me');
$this->email->reply_to('me@gmail.com', 'Me');
$this->email->to('you@yahoo.com');
$this->email->subject('testing my mail function with CodeIgniter');
$this->email->message('<html><body>this is the content</body></html>');
if ( ! $this->email->send())
echo 'error! <br />';
// Generate error
echo $this->email->print_debugger();
以下错误显示在我的浏览器中:
error!
220 mx.google.com ESMTP b8sm581192pbj.46
hello: 250-mx.google.com at your service, [118.96.231.25]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
Failed to send AUTH LOGIN command. Error: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
from: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
The following SMTP error was encountered: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
to: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
The following SMTP error was encountered: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
data: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
The following SMTP error was encountered: 530 5.7.0 Must issue a STARTTLS command first. b8sm581192pbj.46
502 5.5.1 Unrecognized command. b8sm581192pbj.46
The following SMTP error was encountered: 502 5.5.1 Unrecognized command. b8sm581192pbj.46
Unable to send email using php SMTP. Your server might not be configured to send mail using this method.
User-Agent: CodeIgniter
Date: Wed, 1 Jun 2011 09:27:21 +0700
From: "Me"
Return-Path:
Reply-To: "Me"
To: you@yahoo.com
Subject: =?utf-8?Q?testing_my_mail_function_with_CodeIgniter?=
X-Sender: me@gmail.com
X-Mailer: CodeIgniter
X-Priority: 3 (Normal)
Message-ID: <4de5a38938720@gmail.com>
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="B_ALT_4de5a38938733"
This is a multi-part message in MIME format.
Your email application may not support this format.
--B_ALT_4de5a38938733
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
this is the content
--B_ALT_4de5a38938733
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><body>this is the content</body></html>
--B_ALT_4de5a38938733--
【问题讨论】:
【参考方案1】:出于安全原因,Google 的电子邮件服务器require SSL or TLS 以便发送邮件。它不使用标准的未加密端口 25 方法。
你基本上有两个选择。 1) 使用 sendmail 或您自己服务器上的 mail 来传递消息,或 2) 使用方法 described here 通过 Google 的服务器使用 SSL 发送电子邮件。祝你好运,我希望这会有所帮助。
【讨论】:
如果您选择在 XAMPP 上使用 sendmail,请记住省略 smtp 主机的协议部分,以便您最终得到 smtp_server=smtp.googlemail.com【参考方案2】:您正尝试在标准 SMTP 端口 25 上通过 Gmail 发送出站邮件。Gmail 不接受该端口(或任何端口)上的未加密连接。您必须通过 SSL 使用端口 465
。
您必须将您的$config['smtp_port']
更改为465
并将您的$config['smtp_host']
更改为'ssl://smtp.googlemail.com'
More info here
【讨论】:
你的第二个数组键应该是 smtp_host【参考方案3】:你甚至可以使用 587 端口:
$config['smtp_port'] = '587';
和 smtp-host 为:
$config['smtp_host'] = 'ssl://smtp.gmail.com';
【讨论】:
只是导致fsockopen(): SSL: An existing connection was forcibly closed by the remote host.
【参考方案4】:
我通过在 smtp_host
上添加 ssl 前缀解决了这个问题:
$config['smtp_host'] = 'ssl://smtp.gmail.com';
并且一定要使用 465 端口(即 google 的 smtp 端口):
$config['smtp_port'] = '465';
否则,默认情况下 google 会阻止“低安全性连接”,因此您可以输入您的 google 帐户并配置此选项。
Allow less secure apps to access accounts
激活此选项,然后重试。希望对您有所帮助!
【讨论】:
【参考方案5】:1) 你的 smtp 端口必须是465
。
2) 您的 smtp 主机必须是 ssl://smtp.gmail.com
。
$config['smtp_host'] = 'ssl://smtp.gmail.com'; // SMTP Server Address.
$config['smtp_port'] = '465'; // SMTP Port.
【讨论】:
以上是关于如何更正使用 codeigniter 发送电子邮件的方式的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter邮件功能将邮件发送到垃圾邮件文件夹[重复]