将电子邮件从 Plesk 下的 postfix 传送到 Ostickets 帮助台

Piping emails from postfix under Plesk to Ostickets helpdesk

我正在尝试通过管道从我的生产邮件服务器(Plesk 12 和 Postfix)发送支持电子邮件,以将它们发送到另一个 VPS 托管我的帮助台安装,出于多种原因我选择了 ostickets 帮助台(开源,PHP/MySQL...)

因此,我们的想法是触发某些地址的电子邮件接收,例如 contact@company.com、support@company.com... 然后通过其 API 将它们重新发送到 ostickets在那里创建一个新工单。

我试过这种方式 http://blog.absolutedisaster.co.uk/osticket-plesk-9-postfix-pipe-mail-to-a-progr/

它解释了如何创建一个管道来触发电子邮件、午餐 php 脚本...等

由于一些权限问题,我保留了所有这些配置并更改了最后一件事:php 脚本

所以我用一个简单的 bash 脚本替换了这个 php 脚本,它执行相同的操作:向 API 发送请求以通过 CURL 创建新票证。

现在在我的生产邮件服务器中,管道被识别并且电子邮件被成功触发:

另一边同理,osticket API 正在接收请求:

如您所见,问题是 http 响应为 400,这意味着 ostickets(格式错误的电子邮件)中的错误代码为 #66。

所以,我认为问题出在我的 bash 脚本中:

exec curl --header 'X-API-Key: API_KEY_HERE' --user-agent 'osTicket API Client v1.7' --data - 'http://support.company.com/api/tickets.email'

原来的PHP我用这个替换的脚本是:

#!/usr/bin/php -q
<?php

# Configuration: Enter the url and key. That is it.
#  url => URL to api/tickets.email e.g http://yourdomain.com/support/api/tickets.email
#  key => API's Key (see admin panel on how to generate a key)
#   

$config = array(
        'url'=>'http://support.company.com/api/tickets.email',
        'key'=>'API_KEY_HERE'
        );

#pre-checks
function_exists('file_get_contents') or die('upgrade php >=4.3');
function_exists('curl_version') or die('CURL support required');
#read stdin (piped email)
$data=file_get_contents('php://stdin') or die('Error reading stdin. No message');

#set timeout
set_time_limit(10);

#curl post
$ch = curl_init();        
curl_setopt($ch, CURLOPT_URL, $config['url']);        
curl_setopt($ch, CURLOPT_POST, 1);        
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_USERAGENT, 'osTicket API Client v1.7');
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect:', 'X-API-Key: '.$config['key']));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
$result=curl_exec($ch);        
curl_close($ch);

//Use postfix exit codes...expected by MTA.
$code = 75;
if(preg_match('/HTTP\/.* ([0-9]+) .*/', $result, $status)) {
    switch($status[1]) {
        case 201: //Success
            $code = 0;
            break;
        case 400:
            $code = 66;
            break;
        case 401: /* permission denied */
        case 403:
            $code = 77;
            break;
        case 415:
        case 416:
        case 417:
        case 501:
            $code = 65;
            break;
        case 503:
            $code = 69;
            break;
        case 500: //Server error.
        default: //Temp (unknown) failure - retry 
            $code = 75;
    }
}

exit($code);
?>

我的 bash 脚本中缺少什么? (尤其是标准输入)

非常感谢,

更新 问题确实在 bash 脚本中,这是我想出的解决方案:

#!/bin/bash
data=`cat -`
exec curl --header 'X-API-Key: API_KEY_HERE' --user-agent 'osTicket API Client v1.7' --data "$data" 'http://support.company.com/api/tickets.email'

问题确实在bash脚本中,这是我想出的解决方案:

#!/bin/bash
data=`cat -`
exec curl --header 'X-API-Key: API_KEY_HERE' --user-agent 'osTicket API Client v1.7' --data "$data" 'http://support.company.com/api/tickets.email'