最近自己搭建在 BAE 下的mantis一直发送不了邮件,因为使用频率不高一直没在意。以为是因为最近Gmail在国内被墙造成的(mantis使用Gmail的smtp账号进行发送),昨天换了n多账号,改了n次mantis的配置文件,都无法发送。
发现问题不在账号,而是百度应用引擎(BAE)屏蔽了php的很多函数。造成phpmailer的smtp相关代码失效。
我的解决方案是在不改变mantis代码的基础上,使用cron任务,配合简单脚本,直接对mantis的email表进行处理。本来打算使用 BAE 的消息队列进行mail发送,经过简单测试,发现 BAE 的消息队列发送email会对email的内容进行关键词审核,造成大量了email发送失败。
没办法,最终在Sina App Engine搭建了个简单的脚本,接受外部post参数,使用seamail的quickSend进行邮件发送。
cron任务使用 BAE 的app.conf实现。具体代码:
crond :
service : on
crontab :
- "*/1 * * * * php /home/bae/app/scripts/mail.php"
发送邮件的部分代码:
// /home/bae/app/scripts/mail.php
require_once dirname(__DIR__).'/config_inc.php';
$g_hostname = explode(':', $g_hostname);
$dsn = 'mysql:dbname='.$g_database_name.';host='.$g_hostname[0].';port='.$g_hostname[1];
$user = $g_db_username;
$password = $g_db_password;
try {
$db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$sql = "SELECT * FROM mantis_email_table ORDER BY email_id DESC LIMIT 1";
$query = $db->query($sql);
$mail = new myMail('用户名', '密码');
foreach ($query as $row) {
$mail->send($row['email'], $row['subject'], $row['body']);
$sql = "DELETE FROM mantis_email_table WHERE email_id = '{$row['email_id']}'";
$db->exec($sql);
}
希望对大家有帮助,欢迎讨论。