我正在尝试在我的网站上添加联系表单。在localhost它工作正常,现在移动Tiscali服务器我收到此错误:
Warning: is_writable() [function.is-writable]: open_basedir restriction in effect.
File(/tmp) is not within the allowed path(s):
(/var/www/virtual/mydomain.it/:/usr/share/php/:/var/www/ispcp/gui/tools/filemanager/) in /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/preferences.php on line 15`
致命错误: Uncaught exception Swift_TransportException' with message
'Expected response code 220 but got code "554",
with message "554 santino.mail.tiscali.it ESMTP server not available from your IP "' in /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/classes/Swift/Transport/AbstractSmtpTransport.php:422 Stack trace: #0 /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/classes/Swift/Transport/AbstractSmtpTransport.php(315):`
Swift_Transport_AbstractSmtpTransport->_assertResponseCode('554 santino.mai...', Array)
#1 /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/classes/Swift/Transport/AbstractSmtpTransport.php(123): Swift_Transport_AbstractSmtpTransport->_readGreeting()
#2 /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/classes/Swift/Mailer.php(79): Swift_Transport_AbstractSmtpTransport->start()
#3 /var/www/virtual/mydomain.it/htdocs/prova-intro/mail_SwiftMailer.php(129): Swift_Mailer->send(Object(Swift_Message) in /var/www/virtual/mydomain.it/htdocs/prova-intro/Swift-4.1.6/lib/classes/Swift/Transport/AbstractSmtpTransport.php on line 422`
我正在使用的参数:
define('HOST_SMTP', 'smtp.mydomain.it');
define('PORT_SMTP', 465);
define('SECUTITY_SMTP', ssl);
define('EMAIL_SMTP', 'info@mydomain.it');
define('PASSWORD_SMTP', 'xxxxxxx');
define('EMAIL_DESTINATARIO', $_POST['destinatario']);
define('MAX_DIM_FILE', 1048576); // 1mb
答案 0 :(得分:4)
这很少见 - 从PHP发送邮件的报告错误与MTA无关!
Swiftmailer正在尝试创建一个临时文件。如果没有深入挖掘源代码,如果它是合理编写的,它应该使用tmpnam()或tmpfile()(除非显式覆盖使用“系统默认临时目录”。它通过查看一些环境变量来决定这一点 - 如果这些不存在,然后默认编译。
也返回使用的目录(因为swiftmailer继续尝试发送一个无法创建的文件,这意味着代码中存在一个相当愚蠢的错误。)
实际上,设置open_basedir限制以确保正确配置其余PHP设置(会话保存路径,临时目录等)的责任。我向他们抱怨要妥善修理它。
在此期间尝试插入
$_ENV['TMPDIR']='/var/www/virtual/mydomain.it/tmp';
$_ENV['TMP']=$_ENV['TMPDIR'];
在脚本的顶部并创建相关目录,使其可由Web服务器写入。
请注意,tmpfile()页面上的相同错误消息为described in the comments。
答案 1 :(得分:0)
symcbean的解决方案对我来说很好,除了一点必须使用putenv()
才能修改环境变量。
所以我写了这样的话:
<?php
// web/app_dev.php
// in prod the warning should not raise an exception,
// but this depends on the error handling
use [..]
$tmpDir = __DIR__.'/../app/cache';
putenv('TMP='.$tmpDir);
putenv('TMPDIR='.$tmpDir);
putenv('TEMP='.$tmpDir);
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
[..]