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

时间:2015-03-04 14:50:09

标签: bash email pipe postfix-mta

我正在尝试管理来自我的生产邮件服务器(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创建新票证。

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

 output /usr/local/psa/var/log/maillog in mail server

另一方面,osticket API正在接收请求:

 output /var/log/apache2/access.log in ostickets VPS

问题是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脚本中缺少什么? (特别是stdin输入)

非常感谢你,

更新 问题确实存在于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'

1 个答案:

答案 0 :(得分:1)

问题确实存在于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'