/// <summary> /// Sends a comment update email. /// </summary> /// <returns>Dictionary with two keys: message and subject.</returns> public void sendMail(ref CreateEmailEventArgs args) { /* construct your message here */ string message="A comment has been added<br>Subject:"+args.Reply.Subject+"<br>Message:"+args.Reply.Comment; /* this is what you're sending as an email */ args.MessageBody = message; args.Subject = "A comment has been added."; return; }
public void sendMail(ref CreateEmailEventArgs args) { /* construct your message here */ string message="Your password is "+args.User.Password+"."; /* this is what you're sending as an email */ args.MessageBody = message; args.Subject = "Your password from "+Main.Site.Defaults.SiteName; return; }
public void sendMail(ref CreateEmailEventArgs args) { /* construct your message here */ string msg=@"You may be interested in "+args.Item.Number+ @"<br>Here's a message from your friend <hr>"+args.UserComment; /* this is what you're sending as an email */ args.MessageBody = msg; args.Subject = "Your friend "+args.User.Email+" thought you would be intrested in."; return; }
/// <summary> /// Emails A friend information about this item using the createemail event handler. /// </summary> /// <param name="item">The item.</param> /// <param name="user">The user.</param> /// <param name="message">The message.</param> /// <param name="emailTo">Send the email to.</param> /// <returns>{error:0,desc:"error description"}.</returns> public static Dictionary<string, object> EmailAFriend(Commerce.Item item, Commerce.User user, string message, string emailTo) { CreateEmailEventArgs emailArgs = new CreateEmailEventArgs("emailAFriend", Main.Site.site_operator_email, user.Email, Main.Site.site_log_email, user, Main.GetCurrentSession(), null, item, message, null); DefaultEmails.EmailAFriend(ref emailArgs); Main.Site.raiseOnCreateEmail(emailArgs); using(SqlConnection cn = Site.CreateConnection(true, true)) { cn.Open(); return Commerce.SendEmailArgResult(emailArgs, cn, null); } }
/// <summary> /// Resets the password of the account matching the email provided in the argument. /// An email will be sent to the account with the new randomly created password. /// </summary> /// <param name="email">The email.</param> /// <returns></returns> public static Dictionary<string, object> ResetPassword(string email) { Dictionary<string, object> j = new Dictionary<string, object>(); /* see if the old password matches */ using(SqlConnection cn = Site.CreateConnection(true, true)) { cn.Open(); using(SqlCommand cmd = new SqlCommand(@"select userId from users with (nolock) where email = @email; update users set password = @newPassword where email = @email; ", cn)) { string newPassword = Guid.NewGuid().ToBase64Hash().Substring(1, 7); string hashPassword = Site.GetHash(newPassword); cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = email; cmd.Parameters.Add("@newPassword", SqlDbType.VarChar).Value = hashPassword; using(SqlDataReader r = cmd.ExecuteReader()) { if(!r.HasRows) { j.Add("error", -1); j.Add("description", "No such email. Password reset failed."); } else { /* find the user's Id */ Rendition.Commerce.User user = Commerce.Users.GetUserByEmail(email); /* set the new password while we know it */ user.Password = newPassword; ("Password reset for user " + user.UserId + ". New password:"******"lostPassword", Main.Site.site_operator_email, user.Email, Main.Site.site_log_email, user, Main.GetCurrentSession(), null, null, "", null); DefaultEmails.LostPassword(ref emailArgs); Main.Site.raiseOnCreateEmail(emailArgs); Commerce.SendEmailArgResult(emailArgs, cn, null); j.Add("error", 0); j.Add("description", "Password Reset."); } } } } return j; }
/// <summary> /// Raises the oncreateemail event. /// </summary> /// <param name="args">The <see cref="Rendition.CreateEmailEventArgs"/> instance containing the event data.</param> internal void raiseOnCreateEmail( CreateEmailEventArgs args ) { if( CreatingEmail != null ) { CreatingEmail( this, args ); }; }
/// <summary> /// Emails the user a shipment update containing all the information about their shipment. /// </summary> /// <param name="order">The order.</param> /// <param name="args">Dictionary containing the shipmentId.</param> /// <returns>{error:0,desc:"error description"}.</returns> public static Dictionary<string, object> ShipmentUpdateEmail(Commerce.Order order, ShipmentUpdateArgs args) { CreateEmailEventArgs emailArgs = new CreateEmailEventArgs("shipmentUpdate", Main.Site.site_operator_email, order.User.Email, Main.Site.site_log_email, order.User, null, order, null, "", args); DefaultEmails.ShipConfirm(ref emailArgs); Main.Site.raiseOnCreateEmail(emailArgs); Dictionary<string, object> f; using(SqlConnection cn = Site.CreateConnection(true, true)) { cn.Open(); f = SendEmailArgResult(emailArgs, cn, null); } return f; }
/// <summary> /// Used internally by other methods to clear the createemail event. /// </summary> /// <param name="emailArgs">The <see cref="Rendition.CreateEmailEventArgs"/> instance containing the event data.</param> /// <param name="cn">The cn.</param> /// <param name="trans">The trans.</param> /// <returns> /// {error:0,desc:"error description"}. /// </returns> public static Dictionary<string, object> SendEmailArgResult(CreateEmailEventArgs emailArgs, SqlConnection cn, SqlTransaction trans) { Dictionary<string, object> j = new Dictionary<string, object>(); if(!emailArgs.AbortEmail) { SendEmail(emailArgs.MessageBody, emailArgs.Subject, emailArgs.MailTo, emailArgs.MailFrom, emailArgs.BCC, cn, trans); j.Add("error", 0); j.Add("description", ""); } else { j.Add("error", -1); j.Add("description", "Email aborted by createemail event handler"); } return j; }
/// <summary> /// Renders an email using the information provided in args. /// </summary> /// <param name="pathToEmail">The path to email source code (e.g.: ~/plugins/email/someEmail.cs).</param> /// <param name="args">The <see cref="Rendition.CreateEmailEventArgs"/> instance containing the event data.</param> /// <returns>{error:0,desc:"error description",message:"extended error info"}.</returns> public static Dictionary<string, object> RenderEmail(string pathToEmail, CreateEmailEventArgs args) { Dictionary<string, object> j = new Dictionary<string, object>(); List<object> errors = new List<object>(); string ext = Path.GetExtension(pathToEmail); pathToEmail = Rendition.Utilities.VirtualToPhysicalSitePath(pathToEmail); if(!File.Exists(pathToEmail)) { j.Add("error", -2); j.Add("description", "File does not exist."); return j; } string language = ""; string sourceCode = File.ReadAllText(pathToEmail); if(ext == ".cs") { language = "CSharp"; object email = null; try { object[] eventArgs = { args }; email = Admin.ExecuteScript(sourceCode, language, "email", "sendMail", ref eventArgs, ref errors); } catch(Exception e) { j.Add("error", -5); j.Add("description", e.Message); return j; } if(errors.Count > 0) { j.Add("error", -3); j.Add("description", "One or more errors occured while compling the email script."); j.Add("errors", errors); return j; } if(email == null) { j.Add("error", -6); j.Add("description", "An unknown error occured while trying to render your email source code."); return j; } if(email.GetType() == typeof(Dictionary<string, object>)) { j.Add("error", 0); j.Add("description", ""); j.Add("message", ((Dictionary<string, object>)email)["message"].ToString()); j.Add("subject", ((Dictionary<string, object>)email)["subject"].ToString()); return j; } else if(email.GetType() == typeof(string)) { j.Add("error", 0); j.Add("description", ""); j.Add("message", email.ToString()); return j; } } else if(ext == ".html" || ext == ".htm") { j.Add("error", 0); j.Add("description", ""); j.Add("message", sourceCode); return j; } j.Add("error", -4); j.Add("description", "Unable to detect the type of source code for the input file (ext:" + ext + "). Acceptable types are .cs (CSharp), .html or .htm."); return j; }
/// <summary> /// Emails information about this order using the createemail event handler. /// </summary> /// <param name="order">The order.</param> /// <param name="cn">The cn.</param> /// <param name="trans">The trans.</param> /// <returns> /// {error:0,desc:"error description"}. /// </returns> public static Dictionary<string, object> PlacedOrderEmail(Commerce.Order order, SqlConnection cn, SqlTransaction trans) { User user = Main.Site.Users.List.Find(delegate(Commerce.User u) { return u.UserId == order.UserId; }); CreateEmailEventArgs emailArgs = new CreateEmailEventArgs("orderConfirm", Main.Site.site_operator_email, user.Email, Main.Site.site_log_email, user, Main.GetCurrentSession(), order, null, "", null); DefaultEmails.OrderConfirm(ref emailArgs); Main.Site.raiseOnCreateEmail(emailArgs); return SendEmailArgResult(emailArgs, cn, trans); }
/// <summary> /// Emails the user a copy of their password using the createemail event handler. /// </summary> /// <param name="args">Dictionary containg the userId.</param> /// <returns>{error:0,desc:"error description"}.</returns> public static Dictionary<string, object> LostPasswordEmail(Dictionary<string, object> args) { Dictionary<string, object> j = new Dictionary<string, object>(); if(args.ContainsKey("userId")) { j.Add("error", -1); j.Add("description", "Missing key userId. Cannot send lost password email"); return j; } int userId = (int)args["userId"]; User user = Main.Site.Users.List.Find(delegate(Commerce.User u) { return u.UserId == userId; }); CreateEmailEventArgs emailArgs = new CreateEmailEventArgs("lostPassword", Main.Site.site_operator_email, user.Email, Main.Site.site_log_email, user, Main.GetCurrentSession(), null, null, "", null); DefaultEmails.LostPassword(ref emailArgs); Main.Site.raiseOnCreateEmail(emailArgs); Dictionary<string, object> f; using(SqlConnection cn = Site.CreateConnection(true, true)) { cn.Open(); f = SendEmailArgResult(emailArgs, cn, null); } return f; }
/// <summary> /// Sends a shipment update mail. /// </summary> /// <param name="user">The user of the order.</param> /// <param name="order">The order.</param> /// <returns>Dictionary with two keys: message and subject.</returns> public void sendMail( ref CreateEmailEventArgs args ) { String URL = Main.Site.Defaults.SiteUrl; StringBuilder b = new StringBuilder(); Commerce.Shipment shipment = Commerce.Shipment.GetBestShipment( args.Order.Shipments ); /* if the shipment being sent is not a lead shipment or has been voided abort the email */ if( args.ShipmentUpdateArgs.Id != shipment.Id ) { args.AbortEmail = true; return; } b.Append( @"<h2>Your order has been shipped.</h2>" ); b.Append("Purchase Order: "+args.Order.PurchaseOrder); b.Append( @" <table width='500'> <tr> <td> Tracking Number </td> <td> Date Shipped </td> </tr>" ); b.Append( @" <tr> <td> " + shipment.Tracking + @" </td> <td> " + shipment.DateShipped + @" </td> </tr>" ); b.Append( "</table>" ); b.Append( @" <table width='500'> <tr> <td colspan='2'> <div style='float:right;text-align:right;'> <span><a href=" + URL + "/" + Main.Responder + "?method1=" + ( "[\"printOrder\",[{\"orderNumber\":\"" + args.Order.OrderNumber + "\"}]]" ).UrlEncode() + ">PRINT</a></span>" + @"</div> </td> </tr> <tr> <td colspan='2'>THANKS AGAIN FOR YOUR ORDER!</td> </tr> <tr> <td colspan='2' bgcolor='#58595B'> <font color='#ffffff'>PURCHASHING INFORMATION</font> </td> </tr> <tr> <td colspan='2'> <strong>E-mail Address:</strong> " + args.User.Email + @" </td> </tr> <tr> <td valign='top' style='width:250px;'> <h2>Bill To</h2> " + args.Order.BillToAddress.FirstName + " " + args.Order.BillToAddress.LastName + "<br>" + args.Order.BillToAddress.Address1 + "<br>" + args.Order.BillToAddress.Address2 + "<br>" + args.Order.BillToAddress.City + ", " + args.Order.BillToAddress.State + ", " + args.Order.BillToAddress.Zip + @"</td><td valign='top'> <h2>Ship To</h2> " + args.Order.ShipToAddress.FirstName + " " + args.Order.ShipToAddress.LastName + "<br>" + args.Order.ShipToAddress.Address1 + "<br>" + args.Order.ShipToAddress.Address2 + "<br>" + args.Order.ShipToAddress.City + ", " + args.Order.ShipToAddress.State + ", " + args.Order.ShipToAddress.Zip + @"</td> </tr> <tr> <td colspan='2' bgcolor='#58595B'> <font color='#FFFFFF'>Order Summary</font> </td> </tr> <tr> <td colspan='2'> " + args.Order.OrderNumber + @" </td> </tr> <tr> <tr> <tr> <td colspan='2'> <table width='100%'> <tr> <td> Item No. </td> <td> Qty. </td> <td> Price </td> </tr>" ); foreach( Commerce.Line c in args.Order.Lines ) { b.Append( @"<tr> <td>" + c.ItemNumber + @"</td> <td>" + c.Item.Description + @"</td> <td>" + c.Qty + @"</td> <td>" + c.Price.ToString( "f" ) + @"</td> </tr>" ); }; b.Append( @" </tr> </table> </td> </tr> <tr> <td colspan='2'> <table align='right'> <tr> <td align='left'> Sub-total of Items: </td> <td align='right'> " + args.Order.SubTotal.ToString( "c" ) + @" </td> </tr> <tr> <td align='left'> Shipping & Handling: </td> <td align='right'> " + args.Order.ShippingTotal.ToString( "c" ) + @" </td> </tr> <tr> <td align='left'> Sales Tax: </td> <td align='right'> " + args.Order.TaxTotal.ToString( "c" ) + @" </td> </tr> <tr> <td align='left'> Discount: </td> <td align='right'> " + args.Order.Discount.ToString( "c" ) + @" </td> </tr> <tr> <td align='left'> Total for this Order: </td> <td align='right'> " + args.Order.GrandTotal.ToString( "c" ) + @" </td> </tr> </table> </td> </tr> </table>" ); args.MessageBody = b.ToString(); args.Subject = "Order " + args.Order.OrderNumber + " from " + Main.Site.Defaults.SiteName; return; }
/// <summary> /// Sends an new order mail. /// </summary> /// <param name="user">The user of the order.</param> /// <param name="order">The order.</param> /// <returns>Dictionary with two keys: message and subject.</returns> public void sendMail(ref CreateEmailEventArgs args) { String URL = Main.Site.Defaults.SiteUrl; StringBuilder b=new StringBuilder(); b.Append(@" <table width='500'> <tr> <td colspan='2'> <div style='float:right;text-align:right;'> <span><a href="+URL+"/"+Main.Responder+"?method1="+ ("[\"printOrder\",[{\"orderNumber\":\""+args.Order.OrderNumber+"\"}]]").UrlEncode()+ ">PRINT</a></span>"+ @"</div> </td> </tr> <tr> <td><img src='http://"+URL+@"/img/blueStar.jpg'></td> <td>THANKS FOR YOUR ORDER!</td> </tr> <tr> <td colspan='2' bgcolor='#58595B'> <font color='#ffffff'>PURCHASHING INFORMATION</font> </td> </tr> <tr> <td colspan='2'> <strong>E-mail Address:</strong> "+args.User.Email+@" </td> </tr> <tr> <td> <strong>Billing Address:</strong><br/> "+args.Order.BillToAddress.CreateShortAddressBlock("<br/>")+@" </td> <td> <strong>Shipping Address:</strong><br/> "+args.Order.BillToAddress.CreateShortAddressBlock("<br/>")+@" </td> </tr> <tr> <td colspan='2' bgcolor='#58595B'> <font color='#FFFFFF'>Order Summary</font> </td> </tr> <tr> <td colspan='2'> ORDER #: "+args.Order.OrderNumber+@" </td> </tr> <tr> <tr> <td colspan='2'> <table width='100%'> <tr> <td> Item No. </td> <td> Qty. </td> <td> Price </td> </tr>"); foreach(Commerce.Line c in args.Order.Lines) { b.Append(@"<tr> <td>"+c.ItemNumber+@"</td> <td>"+c.Item.Description+@"</td> <td>"+c.Qty+@"</td> <td>"+c.Price.ToString("f")+@"</td> </tr>"); }; b.Append(@" </tr> </table> </td> </tr> <tr> <td colspan='2'> <table align='right'> <tr> <td align='left'> Sub-total of Items: </td> <td align='right'> "+args.Order.SubTotal.ToString("c")+@" </td> </tr> <tr> <td align='left'> Shipping & Handling: </td> <td align='right'> "+args.Order.ShippingTotal.ToString("c")+@" </td> </tr> <tr> <td align='left'> Sales Tax: </td> <td align='right'> "+args.Order.TaxTotal.ToString("c")+@" </td> </tr> <tr> <td align='left'> Discount: </td> <td align='right'> "+args.Order.Discount.ToString("c")+@" </td> </tr> <tr> <td align='left'> Total for this Order: </td> <td align='right'> "+args.Order.GrandTotal.ToString("c")+@" </td> </tr> </table> </td> </tr> </table>"); args.MessageBody = b.ToString(); args.Subject = "Order "+args.Order.OrderNumber+" from "+Main.Site.Defaults.SiteName; return; }