我正在尝试设置一个php页面来自动发送验证邮件。我想使用gmail smtp服务器,我看过的任何地方都建议使用PHPMailer。我安装它并使用以下示例代码:
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once ("incl\PHPMailer\PHPMailerAutoload.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->Username = "myemail@gmail.com";
$mail->Password = "mypassword";
$mail->SetFrom('myemail@gmail.com','Me');
$mail->AddAddress("ToAddress@gmail.com");
$mail->Subject = "Verify your email";
$mail->Body = "Thank you for signing up. Please verify your email using the link below:";
$mail->IsHTML (true);
if($mail->Send()){
echo "Success";
}else{
echo "Error";
}
尝试通过Firefox访问该页面时,页面将加载几分钟,然后出现此错误:
500 - 内部服务器错误。
您正在查找的资源存在问题,无法显示。
服务器 Windows Server 2008 R2标准版运行 IIS 7.5 和 PHP版本5.5.8 。我可以毫无问题地访问所有其他页面,但尝试调用$mail->Send()
似乎是超时或其他东西。我知道这一点,因为我评论了每一行,然后慢慢地添加了一些内容,$mail->Send()
是导致行为的行。
我的谷歌能力让我失望,因为我根本无法弄清楚如何使这项工作。关于可能出错的任何想法?
更新
我打开服务器日志然后再次尝试加载页面,但没有新的错误添加到日志中。但是,我注意到今天System32\LogFiles\httperr1.log
2014-10-27 06:29:21 1.161.23.122 3148 212.83.145.123 80 HTTP/1.0 CONNECT mx2.mail2000.com.tw:25 400 - URL -
2014-10-27 10:10:12 95.183.244.244 33553 212.83.145.123 80 HTTP/1.1 GET / 400 - Hostname -
2014-10-27 11:25:25 207.38.185.197 51157 212.83.145.123 80 HTTP/1.1 GET /tmUnblock.cgi 400 - Hostname -
2014-10-27 12:46:21 1.168.221.158 7952 212.83.145.123 80 - - - - - Timer_ConnectionIdle -
更新2
我很肯定我的gmail帐户详细信息是正确的,并已测试使用服务器上的Thunderbird从中发送。尝试在没有安全方法的情况下发送时,如this comment中所述,我收到此错误:
MAIL FROM命令失败,550,5.7.3请求的操作中止;用户未经过身份验证
我的PHP Mailer版本是5.2.9,我现在也尝试了以下内容:
\\
而不是\
class.phpmailer.php
代替PHPMailerAutoload.php
Fatal error: Class 'SMTP' not found in C:\inetpub\wwwroot\incl\PHPMailer\class.phpmailer.php on line 1195
SMTP connect() failed
$mail->SMTPAuth = false;
通过端口25发送Hotmail地址
MAIL FROM command failed,550,5.7.3 Requested action aborted; user not authenticated
更新3
重新加载问题页面后,我检查了事件查看器,并在Windows日志中看到了一个新条目 - >系统:
PHP错误:语法错误,第101行的C:\ PHP \ php.ini中的意外BOOL_TRUE
该行是:
php_flag display_errors on
答案 0 :(得分:2)
您似乎正在处理大量问题,这是一份清单:您遇到了ssl,实际邮件软件和凭据等问题。它从一个主要问题变成了3个问题,我猜你没有正确输入你的凭据,或者你没有设置你的开放ssl并且你也遇到了问题邮件软件。
535 535 5.7.3身份验证失败表示身份验证失败,请检查您的凭据用户名和密码。
550错误代码,这意味着接收系统无法将您的电子邮件发送给收件人,因为邮箱不可用。
还有很多其他解决方案可以解决您的问题。为什么不尝试更简单的东西,而不是使用自动加载 PHPMailerAutoload.php 。创建一个新文件并将代码放在下面,创建一个消息体(test_message.html)并从浏览器调用它以使用gmail凭据测试gmail smtp。这是PHPMailer关于如何将它与gmail smtp一起使用的片段,如果你把所有内容都填写正确就不应该出错。
<?php
require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
$mail = new PHPMailer();
$body = file_get_contents('test_message.html');
$body = eregi_replace("[\]",'',$body);
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "mail.yourdomain.com"; // SMTP server
$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)
// 1 = errors and messages
// 2 = messages only
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->SMTPSecure = "tls"; // sets the prefix to the servier
$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server
$mail->Port = 587; // set the SMTP port for the GMAIL server
$mail->Username = "yourusername@gmail.com"; // GMAIL username
$mail->Password = "yourpassword"; // GMAIL password
$mail->SetFrom('name@yourdomain.com', 'First Last');
$mail->AddReplyTo("name@yourdomain.com","First Last");
$mail->Subject = "PHPMailer Test Subject via smtp (Gmail), basic";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$address = "whoto@otherdomain.com";
$mail->AddAddress($address, "John Doe");
$mail->AddAttachment("images/phpmailer.gif"); // attachment
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
?>
如果您收到用户身份验证错误,则表示您的凭据未输入 正确。如果这不是问题,如果您没有使用正确的端口,则会收到ssl错误。
如果包含软件问题,您应该尝试更好的方法。
我今天上午辩论,如果我应该 PHPMailer ,最后使用 Swiftmailer ,它在我用PHPComposer安装后立即工作。
我的内部邮件服务器非常挑剔,并且在硬件和软件级别上有大量的防火墙设置和规则,我很惊讶它没有给我任何问题;在587端口发送的电子邮件没有任何问题。
require_once 'vendor/swiftmailer/swiftmailer/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('mail.hellog***.com', 587)
->setUsername('apache@hellog***.com')
->setPassword('apa******')
;
这就是你需要的gmail:
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername($this->username)
->setPassword($this->password);
$this->mailer = Swift_Mailer::newInstance($transporter);
如果你不喜欢什么,你可以试试phpgmailer: https://github.com/GregDracoulis/LectureBank/tree/master/phpgmailer
这是一个如何使用它的示例: http://www.vulgarisoverip.com/2006/10/13/update-send-email-with-php-and-gmail-hosted-for-your-domain/
这个类专门用于gmail使用。
如果您的所有问题和问题都与openSSL有关,请执行以下步骤:
<强> 1。确保OpenSSL模块DLL文件包含在PHP安装中:
C:\ user&gt; dir \ local \ php \ ext \ php_openssl.dll
C:\ local \ php \ ext
目录php_openssl.dll
<强> 2。创建PHP配置文件\local\php\php.ini
,如果它不存在:
C:\user>copy \local\php\php.ini-production \local\php\php.ini
1 file(s) copied.
第3。通过使用文本编辑器编辑配置文件来启用OpenSSL模块。您需要在两个配置行上删除注释商(;):
...
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
extension_dir = "ext"
...
extension=php_openssl.dll
...
就是这样。您应该在Windows IIS WebServer上设置openSSL。请遵循以下选项和步骤,这可能是您的问题。
答案 1 :(得分:1)
这个问题是斜杠(\)
修改
require_once ("incl\\PHPMailer\\PHPMailerAutoload.php");
答案 2 :(得分:1)
我试过你的代码,我只更改了这一行:
require_once ("incl\PHPMailer\PHPMailerAutoload.php");
这一个:
require_once ("incl\PHPMailer\class.phpmailer.php");
它成功了。
您还应该关注PHPMailer版本和PHP版本
您是否尝试过发送没有安全方法的电子邮件?
您确定您的Google凭据有效吗?
<强>已更新强>
从服务器的命令行,此命令的输出是什么以及响应所花费的时间
telnet smtp.gmail.com 587
答案 3 :(得分:1)
我想知道您是否遇到了this question遇到的同一问题。谷歌对使用Gmail作为自己的个人SMTP服务器的人们不屑一顾。
http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/
Google还限制了您可以在一天内通过Gmail帐户发送的电子邮件数量。如果您超出每日配额,Google可能会暂时停用您的Gmail帐户而不会发出任何警告,您可能需要等待最多24小时才能重新获得对Gmail邮箱的访问权限。
我可以看到类似可能产生500错误的错误。
答案 4 :(得分:1)
从评论到问题,很明显这个问题与 OpenSSL 有关。
您提到您已取消注释extension=php_openssl.dll
,但phpinfo()
确实显示未加载。
一些想法:
在取消注释php.ini
中的openssl php模块后,您是否重新启动了网络服务器?
这是非常明显的一个,但仍值得一提。 php.ini
在启动时加载,而不进行服务重启只是一个常见的错误。
检查Loaded Configuration File
phpinfo()
的值
如果这个位置与您编辑的php.ini
不同,那么也很清楚为什么它没有被加载。来自phpinfo()
的以下行可能值得检查。
还有其他一些事情可以做,比如卸载和重新安装OpenSSL,但最好先检查这些更明显的事情。
进一步的想法:
检查错误日志
对于php,可以(再次)在phpinfo()
中找到路径。在您尝试重新加载页面后立即查找error_log
的值并检查最新条目。
另外,您可能想检查IIS的日志文件。如果您不知道IIS管理器中的路径,请在左窗格中选择计算机,然后在中间窗格中,转到&#34; logging&#34;在IIS区域。通常,这些内容会指向C:\inetpub\logs\LogFiles
或C:\Windows\System32\LogFiles
,其子文件夹为W3SVC[x]
,其中[x]
为网站ID。 (如果您只有一个页面,则只需1
,否则请检查IIS管理器中的顶级网站文件夹,查看右侧窗格中的站点列表,它是应用程序ID)
答案 5 :(得分:1)
设置和配置IIS
首先转到服务器上的ServerManager。通常这是您将运行php网站的服务器。转到功能摘要部分中的添加功能。在添加功能向导中检查SMTP服务,然后单击安装。现在等待安装完成。在管理工具下打开IIS6(或IIS7)管理器 - &gt; Internet Information Services 6.0在“开始”菜单中,SMTP的配置使用IIS6中的管理控制台。在[SMTP虚拟服务器]下,单击鼠标右键,然后从上下文菜单中选择属性。转到“访问”选项卡,然后单击“中继”按钮。通过单击“添加”按钮在列表中添加新条目,然后在单个计算机输入字段中输入127.0.0.1(或您的Web服务器的IP)。点击确定两次以应用新设置。
配置Php
要让Php发送电子邮件,您需要进行一些配置。基本上有两种选择。 如果您只打算在单个项目中使用SMTP服务器并且不希望它干扰其他项目,您可以通过在发送电子邮件之前的任何地方添加以下行来在您的php代码中设置配置:
ini_set('SMTP','localhost' );
ini_set('sendmail_from', 'administrator@YourWebsite.com');
另一种方法是,要全局使用这些设置,请将下一行添加到php.ini文件中。
[mail function]
SMTP = localhost
sendmail_from = me@example.com
确保在进行这些更改后重新启动服务器,以确保它们已加载。
这里提供了关于如何设置IIS和php的http://geekswithblogs.net/tkokke/archive/2009/05/31/sending-email-from-php-on-windows-using-iis.aspx的解决方案,并提供了这个问题的答案500 error when trying to use the MAIL function
答案 6 :(得分:0)
尝试使用端口465进行SSL加密:
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;
答案 7 :(得分:0)
警告:require_once(mailer / PHPMailerAutoload.php):无法打开 stream:....中没有这样的文件或目录。
这是我将文件路由的方式
在:
require_once "mailer/PHPMailerAutoload.php";
在:
require_once "../mailer/PHPMailerAutoload.php";
...通常使用css将img链接为背景的过程相同。