Files
Facilitor/APPL/API/api_hmail.asp
Alex Tiehuis 138fdd5183 FCLT#57124 Sender_Rewriting_Scheme standaard decoderen
svn path=/Website/branches/v2019.1/; revision=41819
2019-03-27 11:42:51 +00:00

279 lines
11 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/json2.js" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../api/api.inc" -->
<%
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)
{
// verwijder html-tags
html = (html||"").replace(/(<([^>]+)>)/ig,"");
// &nbsp; naar spatie
html = html.replace(/\&nbsp\;/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;
}
// puur intern gebruik dus geen stylesheet conversie nodig
var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
xmlReq.load(Request);
if (xmlReq.parseError.errorCode != 0)
{
abortRejectMail("Error " + xmlReq.parseError.reason);
}
if (API.apidata.loglevel)
__Log2File(xmlReq.xml, API.APIname + "_IN");
var Subject = XMLval(xmlReq, "subject");
var fromAddr = XMLval(xmlReq, "fromaddr"); // "Returns the address that the sender gave in the MAIL FROM SMTP-command."
var from = XMLval(xmlReq, "from"); // "This property returns the content of the From MIME-header of the email."
var toAddr = XMLval(xmlReq, "to");
var RecipientNr = XMLval(xmlReq, "RecipientNr"); // 0 voor 1e recipient, soms 1 voor tweede
var htmlBody = XMLval(xmlReq, "htmlbody");
var Body = XMLval(xmlReq, "body");
__Log("Subject: " + Subject);
__Log("From: " + from);
__Log("FromAddr: " + fromAddr);
__Log("To: " + toAddr);
__Log("RecipientNr: " + RecipientNr);
__Log("htmlBody: " + htmlBody);
__Log("body: " + Body);
var mailuser = toAddr.split("@")[0];
sql = "SELECT fac_email_setting_action,"
+ " fac_email_setting_expire,"
+ " fac_email_setting_from,"
+ " fac_email_setting_frommode,"
+ " fac_email_setting_attachpath,"
+ " fac_email_setting_attachext"
+ " 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"), "E-mail user niet ontvankelijk: " + mailuser);
}
var allowed_attachext = oRs("fac_email_setting_attachext").Value;
__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
fromAddr = 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"), "Foute afzender. Verwacht: " + shouldFrom + ", kreeg: " + theFrom);
}
}
var action = oRs("fac_email_setting_action").Value; // Package aanroep
var path = oRs("fac_email_setting_attachpath").Value;
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' or '*fg_dwf_path_concept'
{
path = S(path.substr(1)) + "/";
}
oRs.Close();
var result = { success: true
, path: path
, attachments: []
, tempfolder: Server.MapPath(rooturl + "/temp/" + customerId + "_files")
, loglevel: API.apidata.loglevel || 0 // TODO: Ik wil een fac_email_setting_loglevel
};
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);
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) + ","
+ user_key + ");"
+ "END;";
Oracle.Execute(sql);
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);
}
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)
{
result.path = result.path + oRs("fac_result_waarde").Value;
}
oRs.Close();
// 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();
}
else
result.maillog = "Verder geen e-mail action gedefinieerd";
__Log(result.maillog);
var isUrl = false;
if (result.path && (result.path.substr(0,5) == "http:" || result.path.substr(0,6) == "https:"))
{
isUrl = true;
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"));
var attsize = parseInt(XMLval(Attachments[i], "size"), 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
{
__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 en 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");
}
}
Response.Write(JSON.stringify(result));
Response.End;
%>