EWS getting of MimeContent async request takes too long to respond in Outlook Desktop - outlook

I am working with Outlook Plugin and i used Exchange Web Service to support lower versions of Outlook.
I have to fetch the mime content of the email and upload it somewhere. I am using this code to fetch the mime content but when using Outlook Desktop it took aroung 3 mins for 400kb file to load. Do you have any suggestions or resolutions on this? I can't use Graph API and Rest API because some users are using old Exchange Server.
'<?xml version="1.0" encoding="utf-8"?>' +
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
' xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
' xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"' +
' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"' +
' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
' <soap:Header>' +
' <RequestServerVersion Version="Exchange2013" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" soap:mustUnderstand="0"/>' +
' </soap:Header>' +
' <soap:Body>' +
' <m:GetItem>' +
' <m:ItemShape>' +
' <t:ItemClass>IPM.Note</t:ItemClass>' +
' <t:BaseShape>IdOnly</t:BaseShape>' +
' <t:IncludeMimeContent>true</t:IncludeMimeContent>' +
' </m:ItemShape>' +
' <m:ItemIds>' +
' <t:ItemId Id="' + emailItemID + '" />' +
' </m:ItemIds>' +
' </m:GetItem>' +
' </soap:Body>' +
'</soap:Envelope>'

Related

SOAP request stopped to provide PidLidGlobalObjectId and PidLidCleanGlobalObjectId?

I developed an Outlook addin which relies on GlobalObjectId to uniquely identify an event in the calendar. But suddenly the SOAP request I was using to the Exchange server stopped providing the GlobalObjectId and CleanGlobalObjectId.
I was using this request and it worked fine
function generateCalendarUidSoapRequest (itemId) {
const request = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
' <soap:Header><t:RequestServerVersion Version="Exchange2013" /></soap:Header>' +
' <soap:Body>' +
' <m:GetItem>' +
' <m:ItemShape>' +
' <t:BaseShape>AllProperties</t:BaseShape>' +
' </m:ItemShape >' +
' <t:AdditionalProperties>' +
' <t:FieldURI FieldURI="calendar:UID"/>' +
' <t:ExtendedFieldURI DistinguishedPropertySetId="Meeting" PropertyId="3" PropertyType="Binary" />' +
' <t:ExtendedFieldURI DistinguishedPropertySetId="Meeting" PropertyId="35" PropertyType="Binary" />' +
' </t:AdditionalProperties>' +
' <m:ItemIds>' +
' <t:ItemId Id="' + itemId + '" />' +
' </m:ItemIds>' +
' </m:GetItem>' +
' </soap:Body>' +
'</soap:Envelope>'
return request
}
The response gives no error but now it does not include any <t:GlobalObjectId> nor anything similar. Perhaps an update in the Exchange server? What can I do to fetch the GlobalObjectId or the CleanGlobalObjectId?
I have no problem when requesting these two properties using the following:
<t:AdditionalProperties>
<t:ExtendedFieldURI PropertyType="Binary" PropertyId="3" PropertySetId="6ed8da90-450b-101b-98da-00aa003f1305"/>
<t:ExtendedFieldURI PropertyType="Binary" PropertyId="35" PropertySetId="6ed8da90-450b-101b-98da-00aa003f1305"/>
</t:AdditionalProperties>

How Empty folder "Delete All" in outlook plugin

Is there any way to manage folder to delete all items there? i want to clear trash folder "deleteditems" when i used EWS i got an error :
The requested web method is unavailable to this caller or application.
Is there any workaround to make it works in web plugin ?
full code here :
var xml =
'<?xml version="1.0" encoding="utf-8"?>' +
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \n' +
' xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" \n' +
' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" \n' +
' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">\n' +
' <soap:Header>' +
' <t:RequestServerVersion Version="Exchange2010_SP1"/>' +
' </soap:Header>' +
' <soap:Body>' +
' <m:EmptyFolder DeleteType="HardDelete" DeleteSubFolders="true">' +
' <m:FolderIds>' +
' <t:DistinguishedFolderId Id="deleteditems" />' +
' </m:FolderIds>' +
' </m:EmptyFolder>' +
' </soap:Body>' +
'</soap:Envelope>';
Office.context.mailbox.makeEwsRequestAsync(xml, function (result) {
console.log(result);
});
For Office.context.mailbox.makeEwsRequestAsync, we only support a small subset of EWS operations, all documented here. EmptyFolder is not one of the supported operations; that's why you are getting the error. An alternative approach is to use Microsoft Graph.

VFP CHR(9) not outputting TAB as expected

I need to create a tab-delimited file from a cursor. I would normally just use COPY TO but in this case I need to a header row which COPY TO doesn't create.
I thought I could use ?|?? along with CHR(9) but it doesn't put a TAB in the file. I opened the file with notepad++ and word with show special characters turned on. I expected to see the right-arrow for TAB but not there. The file looked more like a fixed width format
Here's my code
LOCAL lcWBSIncFile, lcEACIncHeader
lcEACIncHeader = "EarnedValue" + CRLF +;
"ContrName" + CHR(9) + ;
"StruName" + CHR(9) + ;
"WbsNum" + CHR(9) + ;
"EndDate" + CHR(9) + ;
"UnitName" + CHR(9) + ;
"UnitScale" + CHR(9) + ;
"LRE"
lcWBSIncFile = RTRIM(vpcProgram) + "_" + dtoc(vpdStatusDate,1) + "_" + TTOC(DATETIME(),1) + "_WBS_EAC.inc"
SET ALTERNATE TO ( lcWBSIncFile )
SET ALTER ON
SET CONSOLE OFF
? lcEACIncHeader
SELECT _csrEACUpdateWBSFinal
SCAN
? contrname + CHR(9)
?? struname + CHR(9)
?? wbsnum+ CHR(9)
?? enddate + CHR(9)
?? unitname + CHR(9)
?? unitscale + CHR(9)
?? ALLT(STR(lre,24,2 ))
ENDSCAN
SET ALTERNATE TO
SET ALTERNATE OFF
COPY TO (filename) TYPE DELIMITED WITH TAB works fine, I just don't get a header.
? | ?? didn't work but FPUTS() did. Not sure why.

Hidden SPAM script in Joomla footer

I got my Joomla site www.semignu.dk and there is suddenly some hidden SPAM script in my footer? How do I remove this?
If you are referring to the following code:
//<!--
document.getElementById('cloak6482').innerHTML = '';
var prefix = 'ma' + 'il' + 'to';
var path = 'hr' + 'ef' + '=';
var addy6482 = 'Kontakt' + '#';
addy6482 = addy6482 + 'semignu' + '.' + 'dk';
var addy_text6482 = 'Kontakt' + '#' + 'semignu' + '.' + 'dk';
document.getElementById('cloak6482').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy6482 + '\'>'+addy_text6482+'<\/a>';
//-->
Then this is not spam. It's part of the email cloaking that you possibly have turned on.
Open the footer module in the Joomla Module Manager and look for:
{emailcloak=on}

Is it possible to import existing SSRS reports in Visual Studio?

When upgrading a machine, we lost the Visual Studio project that was used to create SSRS reports. The Data Sources and the Reports still exist on the server however. Is there a way to re-create the VS project using what it on the SQL server? Is there a way to create a new Reporting Services project and to import existing Data Sources and Reports in it?
I believe the reports were originally created using VS 2005.
You haven't lost much.
The data sources are not much: the connection string to a database, and possibly settings for caching and authentication. These should be easily recreated.
The report definitions (.rdl files) can be downloaded for each report type, and added to a new Reporting Services project. They will need to be pointed at the newly recreated datasources, but then should be fine.
To download the report files, go to the Reporting Services Report Manager (website.) For a default instance of SQL with default install options this is http://servername/reports/ If you have admin permissions, there you can browse through the reports. Go to the properties of a given report and click the Edit... button. This will download the .rdl through your browser. (In SSRS 2008, the Edit button was changed to "Download...")
You will need to find out what version of SSRS you are running: the different versions of Business Intelligence Developer Studio (BIDS, the SSAS and SSRS version of Visual Studio) create reports for specific versions of SSRS. The reports can be upgraded, but not downgraded or deployed to an older version of SSRS.
There's now a PowerShell module that will do a nice job of this.
out-rsfoldercontent -reportserveruri http://[reportserver name]/reportserver -RsFolder /[path you'd like to export] -Destination c:\test -recurse
Adjust the parameters to suit.
https://github.com/Microsoft/ReportingServicesTools
SSRS doesn't allow you to download all reports from a report folder in 1 go...
However I found and tweaked a simple piece of SQL I found on the net which we use to great effect on our system...
This is it:-
/*
People working on SSRS are well aware that “Report Manager” does not support downloading all the report files (.rdl files) at one go out-of-box.
However take this script, alter the xxx parameters to your bits. Its works great.
If you get a HOST Error - you need to set full permission to the SQL Server Group on your DOS Dir.
on [Our_Prod_Server], this is: SQLServerMSSQLUser$NS226758$MSSQLSERVER
NOTE: You will find a RETURN; statement below, comment it out once you have altered the parameters.
*/
--Replace NULL with keywords of the ReportManager's Report Path,
--if reports from any specific path are to be downloaded
--select * from [ReportServer].[dbo].[Catalog] CL -- this gives you an idea of the Report Directories.
DECLARE #FilterReportPath AS VARCHAR(500) = 'xxx'
--Replace NULL with the keyword matching the Report File Name,
--if any specific reports are to be downloaded
DECLARE #FilterReportName AS VARCHAR(500) = ''
--Replace this path with the Server Location where you want the
--reports to be downloaded..
DECLARE #OutputPath AS VARCHAR(500) = 'C:\Users\[uuuuu]\Documents\Visual Studio 2012\Projects\Report Skeleton\[Report DIR Name]\'
--Used to prepare the dynamic query
DECLARE #TSQL AS NVARCHAR(MAX)
RETURN;
--Reset the OutputPath separator.
SET #OutputPath = REPLACE(#OutputPath,'\','/')
--Simple validation of OutputPath; this can be changed as per ones need.
IF LTRIM(RTRIM(ISNULL(#OutputPath,''))) = ''
BEGIN
SELECT 'Invalid Output Path'
END
ELSE
BEGIN
--Prepare the query for download.
/*
Please note the following points -
1. The BCP command could be modified as per ones need. E.g. Providing UserName/Password, etc.
2. Please update the SSRS Report Database name. Currently, it is set to default - [ReportServer]
3. The BCP does not create missing Directories. So, additional logic could be implemented to handle that.
4. SSRS stores the XML items (Report RDL and Data Source definitions) using the UTF-8 encoding.
It just so happens that UTF-8 Unicode strings do not NEED to have a BOM and in fact ideally would not have one.
However, you will see some report items in your SSRS that begin with a specific sequence of bytes (0xEFBBBF).
That sequence is the UTF-8 Byte Order Mark. It’s character representation is the following three characters, “”.
While it is supported, it can cause problems with the conversion to XML, so it is removed.
*/
SET #TSQL = STUFF((SELECT
';EXEC master..xp_cmdshell ''bcp " ' +
' SELECT ' +
' CONVERT(VARCHAR(MAX), ' +
' CASE ' +
' WHEN LEFT(C.Content,3) = 0xEFBBBF THEN STUFF(C.Content,1,3,'''''''') '+
' ELSE C.Content '+
' END) ' +
' FROM ' +
' [ReportServer].[dbo].[Catalog] CL ' +
' CROSS APPLY (SELECT CONVERT(VARBINARY(MAX),CL.Content) Content) C ' +
' WHERE ' +
' CL.ItemID = ''''' + CONVERT(VARCHAR(MAX), CL.ItemID) + ''''' " queryout "' + #OutputPath + '' + CL.Name + '.rdl" ' + '-T -c -x'''
FROM
[ReportServer].[dbo].[Catalog] CL
WHERE
CL.[Type] = 2 --Report
AND '/' + CL.[Path] + '/' LIKE COALESCE('%/%' + #FilterReportPath + '%/%', '/' + CL.[Path] + '/')
AND CL.Name LIKE COALESCE('%' + #FilterReportName + '%', CL.Name)
FOR XML PATH('')), 1,1,'')
--SELECT #TSQL
--Execute the Dynamic Query
EXEC SP_EXECUTESQL #TSQL
END
I used this piece of code, but I had problems with the polish characters in SSRS 2008 R2.
So I added some replaces with replace this "broken" convert:
SET #TSQL = STUFF((SELECT
';EXEC master..xp_cmdshell ''bcp " ' +
' SELECT ' +
' REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE' +
' (REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), ' +
' CASE ' +
' WHEN LEFT(C.Content,3) = 0xEFBBBF THEN STUFF(C.Content,1,3,'''''''') '+
' ELSE C.Content '+
' END), ''''Å'''', ''''l''''), ''''Ä™'''', ''''e''''), ''''l›'''', ''''s'''') '+
' , ''''ć'''', ''''c''''), ''''l¼'''', ''''z''''), ''''lš'''', ''''s'''') ' +
' , ''''ó'''', ''''o''''), ''''Ä…'''', ''''a''''), ''''l»'''', ''''Z'''') '+
' , ''''sÄ'''', ''''S''''), ''''†'''', ''''C''''), ''''l‚'''', ''''l'''') ' +
' , ''''Ó'''', ''''O''''), ''''Ę'''', ''''E''''), ''''lº'''', ''''z'''') ' +
' , ''''Ä„'''', ''''A''''), ''''l¹'''', ''''Z'''') '+
' FROM ' +
' [ReportServer].[dbo].[Catalog] CL ' +
' CROSS APPLY (SELECT CONVERT(VARBINARY(MAX),CL.Content) Content) C ' +
' WHERE ' +
' CL.ItemID = ''''' + CONVERT(VARCHAR(MAX), CL.ItemID) + ''''' " queryout "' + #OutputPath + '' + CL.Name + '.rdl" ' + '-T -c -x'''
FROM
[ReportServer].[dbo].[Catalog] CL
WHERE
CL.[Type] = 2 --Report
AND '/' + CL.[Path] + '/' LIKE COALESCE('%/%' + #FilterReportPath + '%/%', '/' + CL.[Path] + '/')
AND CL.Name LIKE COALESCE('%' + #FilterReportName + '%', CL.Name)
FOR XML PATH('')), 1,1,'')

Resources