359 lines
14 KiB
Plaintext
359 lines
14 KiB
Plaintext
<%@ language = "JavaScript" %>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: api_hmail.asp
|
|
Description: API voor opvangen van hMailserver e-mails
|
|
|
|
Parameters: Een xml
|
|
Status:
|
|
Context: 1-op-1 met \UTILS\mail_receive\EventHandlers.js
|
|
Notes: Deze API krijgen we XML binnen, en geven JSON terug.
|
|
Dat was het eenvoudigst
|
|
*/
|
|
JSON_Result = true;
|
|
THIS_FILE = "appl/api/api_hmail.asp";
|
|
%>
|
|
<!-- #include file="../Shared/common.inc" -->
|
|
<!-- #include file="../Shared/xml_converter.inc" -->
|
|
<!-- #include file="../Shared/flexfiles.inc" -->
|
|
<!-- #include file="../api/api.inc" -->
|
|
<%
|
|
|
|
var authparams = user.checkAutorisation("WEB_FACHML");
|
|
var API = new API_func();
|
|
|
|
function abortRejectMail(tekst, maillog)
|
|
{
|
|
var result = { success: false,
|
|
message: tekst,
|
|
maillog: maillog||tekst
|
|
}
|
|
__Log(result.maillog); // komt altijd ook in hmail log
|
|
Response.Write(JSON.stringify(result));
|
|
Response.End;
|
|
}
|
|
function stripHtml(html)
|
|
{
|
|
html = (html||"");
|
|
html = stripStyle(html);
|
|
// verwijder html-tags
|
|
html = html.replace(/(<([^>]+)>)/ig,"");
|
|
// naar spatie
|
|
html = html.replace(/\ \;/ig, " ");
|
|
//verwijder leading spaces and tabs
|
|
html = html.replace(/^[ \t]+/gm,"");
|
|
// verwijder lege regels
|
|
html = html.replace(/[(\n\r)]+/g,"\n\r");
|
|
// zet een regel die begint met : maar achter de vorige
|
|
html = html.replace(/(\n\r:)/g,":");
|
|
return html;
|
|
}
|
|
|
|
function stripStyle(html)
|
|
{
|
|
html = (html||"");
|
|
html = html.replace(/<style>[^<]*<\/style>/igm, "");
|
|
return html;
|
|
}
|
|
|
|
function get_XMLval(psessionid, pxml, ptag, pindex)
|
|
{
|
|
var tag_value = XMLval(pxml, ptag);
|
|
var sql_ins = "INSERT INTO fac_result"
|
|
+ " (fac_result_sessionid, fac_result_naam, fac_result_waarde)"
|
|
+ " VALUES"
|
|
+ " (" + safe.quoted_sql(psessionid)
|
|
+ " ," + safe.quoted_sql(ptag + (pindex ? "_"+pindex : ""), 30) // Een mail kan meerdere bijlagen bevatten. Voor elke bijlage is er dan een filename en size.
|
|
+ " ," + safe.quoted_sql(tag_value, 4000)
|
|
+ " )";
|
|
Oracle.Execute(sql_ins);
|
|
return tag_value;
|
|
}
|
|
|
|
// puur intern gebruik dus geen stylesheet conversie nodig
|
|
var parsed = RequestXML(API);
|
|
if (parsed.error)
|
|
{
|
|
abortRejectMail("Error " + parsed.error);
|
|
}
|
|
var xmlReq = parsed.xml;
|
|
|
|
var psession_id = Session.SessionID;
|
|
// verwijder entries in de FAC_RESULT table zodat de action nieuwe resultaten kan schrijven
|
|
var sql = "DELETE fac_result WHERE fac_result_sessionid = " + safe.quoted_sql(psession_id);
|
|
Oracle.Execute(sql);
|
|
|
|
var Subject = get_XMLval(psession_id, xmlReq, "subject");
|
|
var fromAddr = get_XMLval(psession_id, xmlReq, "fromaddr"); // "Returns the address that the sender gave in the MAIL FROM SMTP-command."
|
|
var from = get_XMLval(psession_id, xmlReq, "from"); // "This property returns the content of the From MIME-header of the email."
|
|
var toAddr = get_XMLval(psession_id, xmlReq, "to");
|
|
var RecipientNr = get_XMLval(psession_id, xmlReq, "RecipientNr"); // 0 voor 1e recipient, soms 1 voor tweede
|
|
var htmlBody = get_XMLval(psession_id, xmlReq, "htmlbody");
|
|
var Body = get_XMLval(psession_id, xmlReq, "body");
|
|
var CC = get_XMLval(psession_id, xmlReq, "CC");
|
|
//htmlBody = stripStyle(htmlBody);
|
|
//Body = stripStyle(Body);
|
|
|
|
// functie om velden in fac_result te zetten
|
|
__Log("To: " + toAddr);
|
|
|
|
var mailuser = toAddr.split("@")[0];
|
|
|
|
sql = "SELECT fac_email_setting_key,"
|
|
+ " fac_email_setting_action,"
|
|
+ " fac_email_setting_expire,"
|
|
+ " fac_email_setting_from,"
|
|
+ " fac_email_setting_frommode,"
|
|
+ " fac_email_setting_attachpath,"
|
|
+ " fac_email_setting_attachext,"
|
|
+ " fac_email_setting_loglevel,"
|
|
+ " prs_perslid_key_auth"
|
|
+ " FROM fac_email_setting"
|
|
+ " WHERE upper(fac_email_setting_user) = upper("+safe.quoted_sql(mailuser)+")";
|
|
|
|
var oRs = Oracle.Execute(sql);
|
|
if (oRs.Eof)
|
|
{
|
|
abortRejectMail(L("lcl_fac_hmail_unknown_user").format(mailuser), "E-mail user niet ontvankelijk: " + mailuser);
|
|
}
|
|
var allowed_attachext = oRs("fac_email_setting_attachext").Value;
|
|
var email_setting_key = oRs("fac_email_setting_key").Value;
|
|
var prs_perslid_key_auth = oRs("prs_perslid_key_auth").Value;
|
|
var email_setting_loglevel = oRs("fac_email_setting_loglevel").Value;
|
|
|
|
if (email_setting_loglevel > 0)
|
|
/* global */ __Logging = email_setting_loglevel || __Logging || 0; // Voor de rest van dit bestand
|
|
|
|
__Log("Subject: " + Subject);
|
|
__Log("From: " + from);
|
|
__Log("FromAddr: " + fromAddr);
|
|
__Log("To: " + toAddr);
|
|
__Log("RecipientNr: " + RecipientNr);
|
|
__Log("htmlBody: " + htmlBody);
|
|
__Log("body: " + Body);
|
|
|
|
__Log("E-mail user ontvankelijk: " + mailuser);
|
|
if (oRs("fac_email_setting_expire").Value != null)
|
|
{
|
|
var expire = new Date(oRs("fac_email_setting_expire").Value);
|
|
if (expire.getTime() < (new Date).getTime())
|
|
{
|
|
abortRejectMail(L("lcl_fac_hmail_expired"), "Te laat, moest voor: " + expire);
|
|
}
|
|
}
|
|
var theFrom = fromAddr; // SMTP communicatie, werkt matig bij forwards
|
|
if (oRs("fac_email_setting_frommode").Value == 1)
|
|
theFrom = from; // uit email MIME-header
|
|
else if (oRs("fac_email_setting_frommode").Value == 2)
|
|
{
|
|
// example srs address: servicedesk+SRS=kWNyq=RW=manutan.nl=Paul.Gozeling@hsleiden.nl
|
|
// output groups of RegExp: 1. servicedesk 2. kWNyq 3. manutan.nl 4. Paul.Gozeling
|
|
// from e-mail address when SRS is detected: Paul.Gozeling@manutan.nl
|
|
var regExpr = RegExp("(.+)[+]SRS=(.+)[=].+=(.+)=(.+)[@]");
|
|
if (regExpr.test(fromAddr)) // test whether the fromAddr is a SRS address
|
|
theFrom = regExpr.exec(fromAddr)[4] + "@" + regExpr.exec(fromAddr)[3]; // concat (group-4 @ group-3) as the fromAddr
|
|
}
|
|
var shouldFrom = oRs("fac_email_setting_from").Value;
|
|
if (shouldFrom)
|
|
{
|
|
if (String(shouldFrom).toUpperCase() != String(theFrom).toUpperCase())
|
|
{
|
|
abortRejectMail(L("lcl_fac_hmail_wrong_sender").format(theFrom), "Foute afzender. Verwacht: " + shouldFrom + ", kreeg: " + theFrom);
|
|
}
|
|
}
|
|
var action = oRs("fac_email_setting_action").Value; // Package aanroep
|
|
var setting_attachpath = oRs("fac_email_setting_attachpath").Value;
|
|
var path = setting_attachpath;
|
|
if (path && path.substr(0,1) == "@") // @/?API=OPDR_VO&APIKEY=**** zet automatisch de huidige url ervoor
|
|
{
|
|
path = HTTP.urlzelf() + path.substr(1);
|
|
}
|
|
|
|
if (path && path.substr(0, 1) == "*") // Bijvoorbeeld '*flexfilespath'
|
|
{
|
|
path = S(path.substr(1)) + "/";
|
|
}
|
|
oRs.Close();
|
|
|
|
var result = { success: true
|
|
, path: path
|
|
, attachments: []
|
|
, tempfolder: shared.tempFolder()
|
|
, loglevel: email_setting_loglevel || 0
|
|
};
|
|
|
|
var kenmerkpath = "";
|
|
|
|
if (action) // Bijv "fac.processemail" of "uwva.closeorder-sample"
|
|
{
|
|
if (!Body || Body == "") // Voorkeur voor plaintekst
|
|
{
|
|
var v_body = L("lcl_fac_hmail_empty_body") + stripHtml(htmlBody);
|
|
}
|
|
else
|
|
{
|
|
var v_body = Body;
|
|
}
|
|
|
|
sql = "BEGIN " + action + " (" + safe.quoted_sql(theFrom) + ","
|
|
+ safe.quoted_sql(toAddr) + ","
|
|
+ safe.quoted_sql(Subject || L("lcl_fac_hmail_no_subject")) + "," // de actions kunnen slecht tegen lege subject
|
|
+ safe.quoted_sql(v_body, 3990) + "," // HSLE#33588 10 karakters speling
|
|
+ safe.quoted_sql(psession_id) + ","
|
|
+ email_setting_key + ");"
|
|
+ "END;";
|
|
Oracle.Execute(sql);
|
|
|
|
// Nog iets specifieks terug te melden voor de logging?
|
|
sql = "SELECT fac_result_waarde"
|
|
+ " FROM fac_result"
|
|
+ " WHERE fac_result_naam = 'maillog'"
|
|
+ " AND fac_result_sessionid = " + safe.quoted_sql(psession_id);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
result.maillog = oRs("fac_result_waarde").Value;
|
|
}
|
|
else
|
|
result.maillog = "E-mail afgehandeld via: " + action;
|
|
oRs.Close();
|
|
|
|
sql = "SELECT fac_result_waarde"
|
|
+ " FROM fac_result"
|
|
+ " WHERE fac_result_naam = 'errormsg'"
|
|
+ " AND fac_result_sessionid = " + safe.quoted_sql(psession_id);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
abortRejectMail(oRs("fac_result_waarde").Value, result.maillog);
|
|
}
|
|
oRs.Close();
|
|
|
|
sql = "SELECT fac_result_waarde"
|
|
+ " FROM fac_result"
|
|
+ " WHERE fac_result_naam = 'kenmerkpath'"
|
|
+ " AND fac_result_sessionid = " + safe.quoted_sql(psession_id);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
kenmerkpath = oRs("fac_result_waarde").Value;
|
|
result.path = result.path + kenmerkpath;
|
|
}
|
|
oRs.Close();
|
|
}
|
|
else
|
|
result.maillog = "Verder geen e-mail action gedefinieerd";
|
|
|
|
// debug
|
|
//kenmerkpath = "MLD\\M1180___\\M1180706\\2803\\";
|
|
//result.path = result.path + kenmerkpath;
|
|
|
|
__Log(result.maillog);
|
|
|
|
var isUrl = false;
|
|
if (result.path && (result.path.substr(0,5) == "http:" || result.path.substr(0,6) == "https:"))
|
|
{
|
|
isUrl = true;
|
|
result.path = result.path.format(safe.url(theFrom), safe.url(toAddr), safe.url(Subject)); // supports &from={0}&to={1}&subject={2}
|
|
// bij de echte aanroep wordt &filename={filename} nog ingevuld met de echte filenaam
|
|
var fso = Server.CreateObject("Scripting.FileSystemObject");
|
|
if (!fso.FolderExists(result.tempfolder))
|
|
fso.CreateFolder(result.tempfolder);
|
|
}
|
|
|
|
// opruimen
|
|
var sql = "DELETE fac_result WHERE fac_result_sessionid = " + safe.quoted_sql(psession_id);
|
|
Oracle.Execute(sql);
|
|
|
|
if (result.path)
|
|
{
|
|
var Attachments = xmlReq.getElementsByTagName("attachment");
|
|
for (i=0; i < Attachments.length; i++)
|
|
{
|
|
var safefilename = safe.filename(XMLval(Attachments[i], "filename", i));
|
|
var attsize = parseInt(XMLval(Attachments[i], "size", i), 10);
|
|
if (safefilename == 'tmpl_logo.gif')
|
|
{ // Waarschijnlijk een FACILITOR bon gereply'd
|
|
__Log("Bijlage {0} genegeerd.".format(safefilename));
|
|
}
|
|
else if (attsize < S("flex_min_size"))
|
|
{
|
|
__Log("Bijlage {0} genegeerd, te klein met {1} bytes.".format(safefilename, attsize));
|
|
}
|
|
else if (!new RegExp(S("flexallowedext"), "ig").test(safefilename))
|
|
{
|
|
// TODO: Misschien ook terugkoppelen aan zender?
|
|
__DoLog("Onbekende extensie e-mail bijlage: {0} ({1} bytes) van {2}. Bestand is niet opgeslagen.".format(safefilename, attsize, theFrom));
|
|
}
|
|
else if (allowed_attachext && !new RegExp(allowed_attachext, "ig").test(safefilename))
|
|
{
|
|
__Log("Ongewenste extensie e-mail bijlage: {0} ({1} bytes) van {2}. Bestand is niet opgeslagen.".format(safefilename, attsize, theFrom));
|
|
}
|
|
else if (isUrl)
|
|
{
|
|
__Log('{0} bijlage ({1} bytes) verwerken met {2}'.format(safefilename, attsize, result.path));
|
|
var tempfilename = result.tempfolder + "\\" + shared.random(32);
|
|
__Log('Tijdelijk bewaard onder {0}'.format(tempfilename));
|
|
result.attachments.push ({ sequence: i,
|
|
safefilename: safefilename,
|
|
tempfilename: tempfilename,
|
|
safeurl: result.path,
|
|
headers: { "Content-Type": "application/json" } // meer extensies her/onderkennen?
|
|
})
|
|
}
|
|
else
|
|
{
|
|
if (setting_attachpath == "*flexfilespath" && kenmerkpath)
|
|
{ // Dan ook alvast registreren in fac_bijlagen.
|
|
// kenmerkpath zal iets zijn met MLD\M1180___\M1180707\2803\, helaas hier weer terugparsen
|
|
// naar module, kenmerkkey en melding_key
|
|
kenmerkpath = kenmerkpath.replace(/\\/g, "/"); // altijd forward slashed
|
|
kenmerkpath = kenmerkpath.replace(/\/$/, ""); // laatste er af
|
|
// Nu MLD/M1180___/M1180707/2803
|
|
var mm = kenmerkpath.match(/(.*)\/.*\/([A-Z])(\d+)\/(\d+)/);
|
|
__Log(mm);
|
|
if (mm && mm.length == 5)
|
|
{
|
|
var module = mm[1];
|
|
var niveau = mm[2];
|
|
var key = mm[3];
|
|
var kenmerk_key = mm[4];
|
|
var sql = "BEGIN "
|
|
+ " flx.setflexbijlage"
|
|
+ "(" + safe.quoted_sql(module)
|
|
+ ", " + kenmerk_key
|
|
+ ", " + key
|
|
+ ", " + safe.quoted_sql(kenmerkpath)
|
|
+ ", " + "NULL"
|
|
+ ", " + safe.quoted_sql(safefilename)
|
|
+ ", " + attsize
|
|
+ ", " + "SYSDATE"
|
|
+ ", " + "NULL" // Helaas (nog) zonder digest omdat we het bestand nog niet hebben
|
|
+ ");"
|
|
+ " END;";
|
|
Oracle.Execute(sql);
|
|
}
|
|
}
|
|
__Log('{0} bijlage ({1} bytes) mag naar {2}'.format(safefilename, attsize, result.path));
|
|
CreateFullPath(result.path); // Hoeft hMailserver dat niet meer te doen. Eist wel dat hMail op 'onze' webserver draait
|
|
result.attachments.push ({ sequence: i,
|
|
safefilename: result.path + safefilename
|
|
})
|
|
}
|
|
}
|
|
// Strikt genomen filtert allowed_attachext alleen maar. In de praktijk zetten we hem echter op XML
|
|
// als we een XML-bijlage ter importeren verwachten dan kan er maar beter ook eentje zijn ook!
|
|
if (allowed_attachext && !result.attachments.length)
|
|
{
|
|
__DoLog("Vreemd: ik had eigenlijk een '{0}' bijlage verwacht van {1}".format(allowed_attachext, theFrom), "#ff4");
|
|
}
|
|
}
|
|
|
|
__Log(result);
|
|
Response.Write(JSON.stringify(result));
|
|
Response.End;
|
|
%>
|
|
<% ASPPAGE_END(); %>
|