将电子邮件从 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'
我正在尝试通过管道从我的生产邮件服务器(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'