Having issues trying to get this code to work. It seems like the pdf it generates in google drive gets stuck in a loop. Each time the script runs it adds to the pdf rather than making a new pdf. I am not that advanced in code so I cant seem to fix this. I went back to the original code and its still happening. TO me it seems either like cache issue or that the temp html file is not getting deleted.
function AUTOPRINTV3() {
var gmailLabels = "AUTOPRINTV3";
var driveFolder = "Incoming Orders 2";
var threads = GmailApp.search("in:" + gmailLabels, 0, 5);
if (threads.length > 0) {
/* Google Drive folder where the Files would be saved */
var folders = DriveApp.getFoldersByName(driveFolder);
var folder = folders.hasNext() ?
folders.next() : DriveApp.createFolder(driveFolder);
/* Gmail Label that contains the queue */
var label = GmailApp.getUserLabelByName(gmailLabels) ?
GmailApp.getUserLabelByName(gmailLabels) : GmailApp.createLabel(driveFolder);
for (var t=0; t<threads.length; t++) {
threads[t].removeLabel(label);
var msgs = threads[t].getMessages();
var html = "";
var attachments = [];
var subject = threads[t].getFirstMessageSubject();
/* Append all the threads in a message in an HTML document */
for (var m=0; m<msgs.length; m++) {
var msg = msgs[m];
html += "From: " + msg.getFrom() + "<br />";
html += "To: " + msg.getTo() + "<br />";
html += "Date: " + msg.getDate() + "<br />";
html += "Subject: " + msg.getSubject() + "<br />";
html += "<hr />";
html += msg.getBody().replace(/<img[^>]*>/g,"");
html += "<hr />";
var atts = msg.getAttachments();
for (var a=0; a<atts.length; a++) {
attachments.push(atts[a]);
}
}
/* Save the attachment files and create links in the document's footer */
if (attachments.length > 0) {
var footer = "<strong>Attachments:</strong><ul>";
for (var z=0; z<attachments.length; z++) {
var file = folder.createFile(attachments[z]);
footer += "<li><a href='" + file.getUrl() + "'>" + file.getName() + "</a></li>";
}
html += footer + "</ul>";
}
/* Conver the Email Thread into a PDF File */
var tempFile = DriveApp.createFile("temp.html", html, "text/html");
folder.createFile(tempFile.getAs("application/pdf")).setName(subject + ".pdf");
tempFile.setTrashed(true);
}
}
}
Related
I have to log the exception into a database table and continue the foreach loop without any interruptions .
When i am trying to insert the exception into database table in catch block,its throwing null referenece exception. Here is my code.
foreach (var row in toEmailList)
{
foreach (var matrix in emailMatrixList.Where(u => names.Contains(u.BusinessUnit)))
{
// Send to Staff + Supervisor/Manager
if (row.DaysDueDate <= 42 && row.DaysDueDate >= 28)
{
if (matrix.StaffID.Equals(row.StaffID))
{
if (!row.EmailLevelSent.Equals("First Level"))
{
try {
var message = new MailMessage();
var bodyText = "<div style='font-family: Calibri, Arial, Helvetica, sans-serif;'>" +
"<p>Dear #FirstName #LastName,</p>" +
"<p>This is a notification to remind you that you have <b>#DaysDueDate</b> days to complete the following online <b>#TrainingTitle</b> training.</p>" +
"<p>Please remember to complete the training course within the next few days.</p>" +
"<p>If you do not complete this training within the required time frame, this information will be forwarded to your next level manager.</p>" +
"<p>Thank you very much,<br/>Kind regards,</p>" +
"<p>Manager</p>" +
"</div>";
var body = bodyText.Replace("#FirstName", row.FirstName).Replace("#LastName", row.LastName).Replace("#DaysDueDate", row.DaysDueDate.ToString()).Replace("#TrainingTitle", row.TrainingTitle.ToString());
if (matrix.StaffEmail.Contains("#domain.com"))
{
message.To.Add(new MailAddress(row.StaffEmail));
}
else if (matrix.ManagerEmail.Contains("#domain.com"))
{
message.To.Add(new MailAddress(matrix.ManagerEmail));
}
message.From = new MailAddress(_from);
message.Subject = "Training Notification for " + row.TrainingTitle;
if (matrix.ManagerEmail.Contains("#domain.com"))
{
message.CC.Add(new MailAddress(matrix.ManagerEmail));
}
else if ((matrix.ManagerEmail.Contains("N/A")) || (matrix.ManagerEmail.Contains("NA")) || (matrix.ManagerEmail.Contains("#N/A")) || (matrix.ManagerEmail.Contains("na")))
{
message.To.Add(new MailAddress(row.StaffEmail));
}
if (!string.IsNullOrEmpty(matrix.InTheLoop))
{
message.CC.Add(new MailAddress(matrix.InTheLoop));
}
message.Body = string.Format(body);
message.IsBodyHtml = true;
await smtp.SendMailAsync(message);
TempData["MailSent"] = "MailSent";
Debug.WriteLine("Sending first level email to " + row.FirstName + " " + row.LastName);
Debug.WriteLine("CC: " + message.CC.ToString());
row.EmailLevelSent = "First Level";
Debug.WriteLine("First Level email sent to " + row.FirstName);
}
catch (Exception e)
{
FailedEmails.StaffID = row.StaffID;
FailedEmails.FirstName = row.FirstName;
FailedEmails.LastName = row.LastName;
FailedEmails.StaffEmail = row.StaffEmail;
FailedEmails.ExceptionLog = e.Message;
FailedEmails.SentDate = DateTime.Now;
_context.Entry(FailedEmails).State = EntityState.Added;
}
}
}
}
}
}
Any help would be appreciated, is there anything i am missing. Thanks!
i am creating a wcf service for Pay u Money I wrote same code like asp.net c# for Pay u Money, but using HttpWebRequest I'm facing this error:
SORRY! We were unable to process your payment
Same code I tried in simple asp.net c# and there working fine. Here I don't know what goes wrong, how could I solve this?
enter code here
public PayUMoneyModel PayUMoney(PayUMoneyModel Data)
{
PayUMoneyModel objPayUMoneyModel = new PayUMoneyModel();
action1 = ConfigurationManager.AppSettings["PAYU_BASE_URL"] +
"/_payment";
try
{
string[] hashVarsSeq;
string hash_string = string.Empty;
if (string.IsNullOrEmpty(Data.txnid)) // generating txnid
{
Random rnd = new Random();
string strHash = Generatehash512(rnd.ToString() +
DateTime.Now);
txnid1 = strHash.ToString().Substring(0, 20);
}
else if(Data.txnid!=null)
{
txnid1 = Data.txnid;
}
Data.txnid = txnid1;
Data.key= ConfigurationManager.AppSettings["MERCHANT_KEY"];
string salt= ConfigurationManager.AppSettings["SALT"];
System.Collections.Hashtable data = new System.Collections.Hashtable();
data.Add("key", Data.key);
data.Add("txnid", Data.txnid);
string AmountForm = Convert.ToDecimal(Data.amount).ToString("g29");// eliminating trailing zeros
//amount.Text = AmountForm;
data.Add("amount", 1.00);
data.Add("firstname", Data.firstname);
data.Add("email", Data.email);
data.Add("phone", Data.phone);
data.Add("productinfo", Data.productinfo);
data.Add("surl", Data.surl);
data.Add("furl", Data.furl);
data.Add("lastname", Data.lastname);
data.Add("curl", Data.curl);
data.Add("address1", Data.address1);
data.Add("address2", Data.address2);
data.Add("city", Data.city);
data.Add("state", Data.state);
data.Add("country",Data.country);
data.Add("zipcode", Data.zipcode);
data.Add("udf1", Data.udf1);
data.Add("udf2", Data.udf2);
data.Add("udf3", Data.udf3);
data.Add("udf4", Data.udf4);
data.Add("udf5", Data.udf5);
data.Add("pg", Data.pg);
data.Add("service_provider", "payu_paisa");
hash_string = Data.key + "|" + Data.txnid + "|" + AmountForm + "|" + Data.productinfo+ "|" + Data.firstname + "|" + Data.email + "|||||||||||" + salt;
string hash = Generatehash512(hash_string);
data.Add("hash", hash);
data.Add("abc", hash_string);
string strForm = PreparePOSTForm(action1, data);
if (strForm != "")
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(action1);
// httpWebRequest.ContentType = "text/html";
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
httpWebRequest.ContentLength = strForm.Length;
string Json = "";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(strForm,0,strForm.Length);
streamWriter.Flush();
streamWriter.Close();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
Json = streamReader.ReadToEnd().Replace(";", "");
}
}
HttpContext.Current.Response.Write(Json);
}
}
catch(Exception ex)
{
throw ex;
}
return objPayUMoneyModel;
}
this is my Post Form Method
private string PreparePOSTForm(string url, System.Collections.Hashtable data) // post form
{
//Set a name for the form
string formID = "PostForm";
//Build the form using the specified data to be posted.
StringBuilder strForm = new StringBuilder();
strForm.Append("<form id=\"" + formID + "\" name=\"" +
formID + "\" action=\"" + url +
"\" method=\"POST\">");
foreach (System.Collections.DictionaryEntry key in data)
{
strForm.Append("<input type=\"hidden\" name=\"" + key.Key +
"\" value=\"" + key.Value + "\">");
}
strForm.Append("</form>");
//Build the JavaScript which will do the Posting operation.
StringBuilder strScript = new StringBuilder();
strScript.Append("<script language='javascript'>");
strScript.Append("var v" + formID + " = document." +
formID + ";");
strScript.Append("v" + formID + ".submit();");
strScript.Append("</script>");
//Return the form and the script concatenated.
//(The order is important, Form then JavaScript)
return strForm.ToString() + strScript.ToString();
}
this is my key and salt provided by Payumoney website:-
Key:-rjQUPktU
Salt:-e5iIg1jwi8
I'm trying to loop over the Photoshop preferences. This should be as straightforwards as
for (i = 0; i < app.preferences.length; i++)
{
alert(app.preferences[i]);
}
only the object app.preferences doesn't have a length and accessing each item such as
alert(app.preferences.beepWhenDone); //bool
works, but is tedious and is also possibly version dependent. I know most of them are read-only, but I'm quite keen to list them all.
This should do what you want:
alert(app.preferences.reflect.properties.sort().join("\r"));
Or actually, to also let you inspect the actual values, you could do something like this:
var prefsObject = app.preferences;
var prefs = app.preferences.reflect.properties.sort();
var prefString = "Photoshop Preferences\r";
for(var i = 0; i < prefs.length; i++) {
try {
prefString += prefs[i] + ": " + prefsObject[prefs[i]] + "\r";
} catch (e) {
prefString += prefs[i] + ": " + e.message + "\r";
}
}
alert(prefString);
I created a listener page that receives the Docusign webhooks. Everything is working as far as pulling data from the webhook, but when I cycle through the DocumentPDF's, it creates the PDF files but they are corrupted and cannot be opened (when I try to open it in Acrobat, I receive the following message: Acrobat could not open ... because it is either not a supported file type or because the file has been damaged.")
Can anybody help me figure out why the created pdf files are corrupted?
My code for the page is as follows:
protected void Page_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(Request.InputStream);
string xml = sr.ReadToEnd();
string fileName = HttpContext.Current.Server.MapPath("") + "\\Results\\" + DateTime.Now.Ticks + ".xml";
File.WriteAllText(fileName, xml);
try
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
var mgr = new XmlNamespaceManager(xmldoc.NameTable);
mgr.AddNamespace("a", "http://www.docusign.net/API/3.0");
XmlNode envelopeStatus = xmldoc.SelectSingleNode("//a:EnvelopeStatus", mgr);
XmlNode envelopeId = envelopeStatus.SelectSingleNode("//a:EnvelopeID", mgr);
XmlNode status = envelopeStatus.SelectSingleNode("//a:Status", mgr);
if (status.InnerText == "Completed")
{
LogException("Looking for DocPDF's_" + DateTime.Now.Ticks + ";");
// Loop through the DocumentPDFs element, storing each document.
XmlNode docs = xmldoc.SelectSingleNode("//a:DocumentPDFs", mgr);
foreach (XmlNode doc in docs.ChildNodes)
{
string documentName = doc.ChildNodes[0].InnerText; // pdf.SelectSingleNode("//a:Name", mgr).InnerText;
string documentId = doc.ChildNodes[2].InnerText; // pdf.SelectSingleNode("//a:DocumentID", mgr).InnerText;
string byteStr = doc.ChildNodes[1].InnerText; // pdf.SelectSingleNode("//a:PDFBytes", mgr).InnerText;
LogException("Writing Out PDF_" + HttpContext.Current.Server.MapPath("") + "\\Documents\\" + envelopeId.InnerText + "_" + documentId + "_" + documentName + "_" + DateTime.Now.Ticks + ";");
File.WriteAllText(HttpContext.Current.Server.MapPath("") + "\\Documents\\" + envelopeId.InnerText + "_" + documentId + "_" + documentName, byteStr);
LogException("Successfully wrote out PDF_" + DateTime.Now.Ticks + ";");
}
}
}
catch (Exception ex)
{
LogException("Exception: " + ex.Message + "; InnerException: " + ex.InnerException.ToString() + "_" + DateTime.Now.Ticks + ";");
}
}
#mkl is correct. The Webhook (Connect) notification message's PDF content is base64 encoded. Decode it to obtain the PDF file.
An example: see line 402 of the recipe example webhook listener --
pdf_file.write(base64.b64decode(pdf.PDFBytes.string))
I am using an Azure Function and using a Blob storage to save it.
This worked for me:
var byteStr = doc.ChildNodes[1].InnerText;
outputBlob.Write(System.Convert.FromBase64String(byteStr));
I using AE.Net.Mail in .net project.
I sent html mail and file attachment by gmail api and it work perfect.
But i dont know way to embed an image in body mail with it?
Somebody help me ?
string To = txtTo.Text;
string Subject = txtEmailSubject.Text;
string Body = hdfEmailContentSend.Value;
string InputAttachmentArr = hdfInputAttachmentArr.Value;
var msg = new AE.Net.Mail.MailMessage();
msg.From = new MailAddress("haunguyen1791990#gmail.com", "=?UTF-8?B?" + EncodeTo64UTF8(User.FullName) + "?=");
msg.ReplyTo.Add(msg.From);
msg.To.Add(new MailAddress(To));
msg.Subject = "=?UTF-8?B?" + EncodeTo64UTF8(Subject) + "?=";
msg.Body = Body;
var result = SendMessage(InputAttachmentArr, msg, "");
private Google.Apis.Gmail.v1.Data.Message SendMessage(string InputAttachmentArr, AE.Net.Mail.MailMessage msg, string ThreadId) {
try {
bool isAttackFile = false;
string boundary = "boundary_" + DateTime.Now.ToString("yyyyMMddHHmmss");
var service = CRMGmailUtils.DefineServiceGet(Server.MapPath(".") + "\\client_secret.json");
//get info file attachment
List<string> lstAttachFile = InputAttachmentArr.Split(',').ToList();
lstAttachFile.RemoveAll(item => item.Length == 0);
foreach (var item in lstAttachFile) {
string filePath = Server.MapPath("~/" + "Upload/gmail/" + item);
var bytes = File.ReadAllBytes(filePath);
AE.Net.Mail.Attachment file = new AE.Net.Mail.Attachment(bytes, GetMimeType(item), item, true);
msg.Attachments.Add(file);
isAttackFile = true;
}
var msgStr = new StringWriter();
//if file attachment not exists, set type mail is html
if (!isAttackFile) {
msg.ContentType = "text/html";
}
msg.Save(msgStr);
string data = msgStr.ToString();
//else i customize body mail with new boundary
if (isAttackFile) {
string beginBody = "Content-Type: multipart/alternative; boundary=" + boundary;
//beginBody += "\n\n--" + boundary;
//beginBody += "\nContent-Type: text/plain; charset=UTF-8";
//beginBody += "\n\n*2*";
beginBody += "\n\n--" + boundary;
beginBody += "\nContent-Type: text/html; charset=UTF-8";
string endBody = "\n\n--" + boundary + "--";
msg.Body += endBody;
string parentBoundary = Regex.Match(data, #"----(.*?)--").Groups[1].Value;
Regex rgx = new Regex("----" + parentBoundary);
data = rgx.Replace(data, "----" + parentBoundary + "\n" + beginBody, 1);
}
string raw = Base64UrlEncode(data.ToString());
var result = new Google.Apis.Gmail.v1.Data.Message();
//case send with reply
if (!string.IsNullOrEmpty(ThreadId)) {
result = service.Users.Messages.Send(new Google.Apis.Gmail.v1.Data.Message { Raw = raw, ThreadId = ThreadId }, "me").Execute();
} else {
//case send new mail
result = service.Users.Messages.Send(new Google.Apis.Gmail.v1.Data.Message { Raw = raw }, "me").Execute();
}
DeleteAttackFile(lstAttachFile);
return result;
} catch (Exception objEx) {
throw objEx;
}
}