在Linux上,使用运行时ini_set()设置SMTP和SMTP_PORT的PHP: mail()函数无法正常工作。

6

我使用了以下 PHP 代码通过 SMTP 主机发送邮件:

        ini_set('SMTP','myserver');
ini_set('smtp_port',25);
$to = $email;
$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers  .= "From: NO-REPLY<no-reply@mydomain.com>" . "\r\n";
$subject = "Confirmation For Request";
$message = '<html>
                <body>
                    <p>Hi '.$firstname.' '.$lastname.'</p>
                    <p>
                        We recieved below details from you. Please use given Request/Ticket ID for future follow up:
                    </p>
                    <p>
                        Your Request/Ticket ID: <b>'.$ticketID.'</b>
                    </p>
                    <p>
                    Thanks,<br>
                    '.$team.' Team.
                    </p>
                </body>
            </html>';
mail( $to, $subject, $message, $headers ); 

现在当我在本地的Windows上执行代码时,我成功地接收到邮件,但是如果我将相同的代码部署到Linux设置中,则不会收到任何邮件,尽管在Linux机器上mail()函数返回true。在查看了Windows本地主机和Linux服务器的phpinfo中的邮件参数后,我发现一个区别:在Windows中,sendmail_path ==“No Value”,而在Linux服务器上则显示“usr/sbin/sendmail-t-i”。有人能帮助我解决这个问题吗?注意:在Windows上,它是WAMP设置,而Linux是专用服务器。

你在Linux上使用哪个MTA服务器?(sendmail/postfix/exim/...) - AnFi
2个回答

3
如果您正在查看您的php.ini,那么有一个简短的描述。
ini_set('SMTP','myserver');
ini_set('smtp_port',25);

这两个值仅适用于Windows。因此,如果您想在Linux上通过SMTP发送邮件,则需要安装例如postfix并构建中继。

https://www.linode.com/docs/email/postfix/postfix-smtp-debian7

或者更简单的方法是使用可以通过套接字或curl发送SMTP邮件的库,例如Swiftmailer。

http://swiftmailer.org/docs/sending.html

这样更容易,而且它正在工作。


0

我之前看过这个问题,在PHP.ini中有两个键sendmail_fromhttp://php.net/sendmail-from(对于Win32)和sendmail_pathhttp://php.net/sendmail-path(对于Unix)。在wamp或类似的Linux设置中,此键的默认值为me@localhost,但实际上邮件服务器应该拒绝此用户的电子邮件地址,因为它们不存在于服务器上。

尝试添加类似以下内容...

ini_set('sendmail_from','admin@example.co.uk')

那么结论是什么? - Padyster
最初它被设置为“无值”,我使用了“ini_set('sendmail_from','noreply@mydomain.com')”。你能告诉我如何找出安装了哪个邮件服务器吗? - Padyster
1
你可以使用 ini_get 获取当前配置键 - 或者在 php.ini 中获取默认值,所以我倾向于这样做:如果(ini_get('smtp_server')!= 'myserver'),则 ini_set('smtp_server','myserver')。 - user2762134
这将取决于服务器的设置,如果您正在管理服务器并且不知道,则我猜测没有安装,但如果它是托管的,则最好询问安装了哪个。但是,如果此帐户不存在,则使用noreply@mydomain.com将遇到相同的问题。 - user2762134
我使用了ini_get('SMTP')函数,输出结果为"localhost"。 - Padyster
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接