תוכנה לשליחת אימיילים
-
בקיצור, דיברתי שוב עם ההוא שביקש לי את זה,
והתחוור שזה פרוייקט מורכב יותר מלשלוח מכתב פשוט
הוא רוצה לצרף קבצים נוספים ולסנן כל מיני נתונים.
שעד שאני ילמד את הכל בC# כשאני עדיין מתחיל של מתחיל שלו, אז יהיה פסח X2אז נראה לי שאני יירד מלעשות את זה שם,
והשאלה שלי היא עכשיו, אם אקסס יוכל לתמוך בשליחה של כמות גדולה של דואלים או שהוא ייתקע?
אולי אני יעזוב בכלל את הפרוייקט ודי.פורסם במקור בפורום CODE613 ב05/06/2017 23:31 (+03:00)
-
בעבר צירפתי פה מחלקה לשליחת מיילים מגימייל דרך C#.
אתה יכול לצרף אותה לפרוייקט שלך.והנה מימוש שלי לאפשר ללקוח שליחת מייל בפרוייקט WEB
(ASP.NET MVC)הנה קוד הHTML (משתמש בrazor):
כמו כן אני משתמש בספריות: bootstrap3 - עבור העיצוב
select2 - לא חובה
CKEditor - כדי לתת למשתמש להזין טקסט בפורמט HTML@model ContactApp.UI.ViewModel.MessageToContactVM @{ ViewBag.Title = "כתיבת הודעה"; } @Styles.Render("~/bundlesContent/datepicker") <script src="~/Scripts/ckeditor/ckeditor.js"></script> <script src="~/Scripts/ckeditor/config.js"></script> <link href="~/Scripts/ckeditor/styles.js" rel="stylesheet" /> <div class="row col-lg-12"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">שליחת מייל</h3> </div> @using (Html.BeginForm("Create", "Email", FormMethod.Post)) { <div class="panel-body"> @Html.AntiForgeryToken() <div class="form-horizontal"> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <legend>כתוב הודעה</legend> <div class="row"> <div class="col-md-12"> <div class="form-group "> @Html.LabelFor(model => model.AllContactsId, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.ListBoxFor(model => model.AllContactsId, new SelectList(ViewBag.AllContactsList, "Id", "FullName", null), new { @class = "form-control select2-general",id="allContactsList" }) @Html.HiddenFor(model => model.ToContactsId, new { id="toContactsId"}) @Html.ValidationMessageFor(model => model.AllContactsId, "", new { @class = "text-danger" }) </div> </div> </div> </div> <div class="row"> <div class="col-md-12"> <div class="form-group "> @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) </div> </div> <div class="form-group "> @Html.LabelFor(model => model.Body, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.TextAreaFor(model => model.Body, new { @class = "form-control" ,id="editor1"} ) <script> CKEDITOR.replace('editor1'); </script> @Html.ValidationMessageFor(model => model.Body, "", new { @class = "text-danger" }) </div> </div> </div> <div class="col-sm-6"> </div> </div> </div> </div> <div class="panel-footer"> <div class="row"> <div class="form-group"> <div class="col-md-12"> <a href="" class="btn btn-primary btn-small pull-left ">ביטול</a> <input type="submit" value="שלח" class="btn btn-primary btn-small pull-left" /> </div> </div> </div> </div> } </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/datepicker") <script> $(".select2-general").select2({ language: "he", dir: "rtl" }); $('#allContactsList').on('select2:select select2:unselect', function (e) { var items = $(this).val(); $('#toContactsId').val(items); }) $('form').submit(function () { //alert(CKEDITOR.instances.editor1.getData()); $("input[Body]").html(CKEDITOR.instances['editor1'].getData()); }) </script> }
והנה הקוד בצד השרת ששולח את ההודעה:
[HttpPost, ValidateInput(false)] public async Task<ActionResult> Create(MessageToContactVM message) { if (ModelState.IsValid) { //לשנות למזהה של בעל התוכנה message.FromContact = 3; message.DateSend = DateTime.Now; message.Status = (int)StatusMessage.Send; message.TypeSend = (int)TypeSendMessage.Email; var gmailMssg = new MessageGmail() { Subject = message.Title, //אני עוטף את התוכן שהמשתמש הזין בדיב חיצוני, כדי ליישר את המייל לימין //כמו כן, אולי זה יכול לעזור גם לאבטחה??? Body = "<div style=\"direction:rtl\">" + message.Body + "</div>", IsBodyHtml = true }; //מאפשר שליחת אותה הודעה לנמענים מרובים foreach (var item in message.AllContactsId) { var temp = await Repository.Get<ContactVM>(item) as ContactVM; gmailMssg.ToList.Add(temp.FullName, temp.Email.Split(',')[0]); } try { var success = SendGMail.SendEMail(gmailMssg); await MapObjToUI.CreateObjInDAL(message); } catch (Exception ex) { throw ex; } return RedirectToAction("Index"); } await LoadParameterForViewBagCreateViewAsync(); return View(); }
וככה זה נראה:
זה ההתחלה, ואתה יכול לקחת את זה הלאה לאן שאתה רוצה.
אפשר גם לצרף קבצים על ידי שימוש במאפיין:gmailMssg.ListFileAttachment.Add()
בהצלחה!
מקווה שקצת עזרתי.פורסם במקור בפורום CODE613 ב06/06/2017 01:19 (+03:00)
-
@דוד ל.ט.
עזוב אקסס זה לא אופציה בכלל.
בכמה מיילים מדובר ביום, סדר גודל?
והאם את תוכן המייל צריך עיצוב משמעותי או די פשוט?UY, האנשים האלה לא מוותרים...
אני משתגע כל פעם מחדש, איך יש לכם עצבים לכל השאלות ומתעקשים לעזור, כל החברה פה בפורום, ובפרט ר' דוד היקר.
חן חן.אז אפרט יותר:
הוא לא מדבר על כמות מסויימת ליום, לא יודע כל כמה זמן הוא יישלח מיילים,
בכל שליחה מדובר בכ200-300 מיילים כולו.תוכן המייל והעיצוב של גוף ההודעה זה לא הנושא, את המכתב הוא רוצה שיהיה מעוצב עם בלנק וכו'.
מה שהוא רוצה לעשות:
לשלוח מכתב אישי לכל אחד מהנמענים.
בנוסף, הוא רוצה לצרף פרוספקטים ומסמכים להודעה.
ואופציה שהוא ביקש: שצירוף הקבצים יהיה בבחירה אישית לפי מה שהוא יסמן או שיסתמן לו בתוכנה,
לנמען X לצרף קובץ 1 ו 2
לנמען Y לצרף רק קובץ 1
לנמען Z לצרף רק קובץ 2
וכו' על זה הדרך.בקיצור, זה לא רק מיזוג דואר יבש ושליחה.
הכיוון שלי היה לעשות הדפסה או שמירה בשם שמובנה היום באופיס לPDF של מסמך הוורד,
לכל נמען קובץ נפרד, ששם הקובץ יהיה הקוד המזהה של הלקוח בתוכנה.
אח"כ לעבור עם LOP על כל הקצבים שבתקיה אותה זה עתה יצרתי, ולחפש עם שם הקובץ את כתובת המייל והקבצים שיש לצרף.
לצרפם ולשלוח.פורסם במקור בפורום CODE613 ב06/06/2017 11:56 (+03:00)
-
טוב כעת אפיינת היטב.
לדעתי זה כן רעיון לC#.
מהרגע שיש מסמכים מצורפים אז כל המיזוג דואר של וורד מאבד מערכו.
אתה צריך לשות תוכנה בC, בה יהיה א. מודול שליחת מייל (avr416 כבר כתב לנו כזה) ב. מודול של מיני מיזוג - שילוב תבנית טקסט עשיר עם טוקנים של שדות המיזוג ג. מודול גישה לנתונים כדי לדעת מה לשלוח למי, וכדי לעדכן מה נשלח.אבל יש בעיונת עם השליחה. שליחה של יותר מ200 מיילים ביום דרך SMTP לא מתאפשרת למשל בג'ימייל.
בספקיות אחרות המצב דומה.
אולי בגלל זה צריך להוסיף מודול של תזמון השליחה במנות קטנות בהפרשי כמה שעות.פורסם במקור בפורום CODE613 ב06/06/2017 13:43 (+03:00)
-
@דוד ל.ט.
ב. מודול של מיני מיזוג - שילוב תבנית טקסט עשיר עם טוקנים של שדות המיזוג
את זה ניתן לעשות בקלות על ידי שימוש ב Razor, אם תרצה בהמשך אשתדל להעלות דוגמא שעשיתי בעבר להפקת קבלות בדרך הזו.
אח"כ גם ניתן בקלות להפוך כל HTML ל PDF ולשלוח אותו במייל כרצונך.פורסם במקור בפורום CODE613 ב06/06/2017 14:17 (+03:00)
-
@דוד ל.ט.
אם דקדקתי טוב במה שכתב מלא, אז המיזוג הוא בהודעה אבל במסמכים המצורפים אין שתילה של שדות ולכן הhtml לא צריך המרה לPDF.
עוד מעט אגיע למחשב שלי בס"ד, אז אבדוק את מה שכתוב ואמשיך עם הנדנודים מאן להתחיל ולאן להמשיך.
אבל, הוא כן רוצה שהמיזוג יהיה בקובץ PDF, לא בדווקא בוורד. העיקר שהמכתב יהיה PDF
התוכן בגוף ההודעה לא מעניין אותו איך זה ייראה.פורסם במקור בפורום CODE613 ב06/06/2017 15:59 (+03:00)
-
הנה הקוד שאתה צריך כדי ליצור מיזוג בקובץ PDF.
אתה צריך לכלול את הספריה הבאה בפרוייקט שלך: https://www.nrecosite.com/pdf_generator_net.aspx
אם אתה רוצה שקובץ הPDF יהיה מעוצב יפה, אתה צריך ליצור HTML ואח"כ להמיר אותו לPDF.
חשוב- תוודא שההפניות לקבצי הCSS שלך יהיו הפניות מלאות ולא חלקיות (דהיינו נתיב מוחלט), אח"כ הספריה הנ"ל לא תדע לטעון אותם.בהצלחה!
using NReco.PdfGenerator; using System.IO; using System.Threading.Tasks; using System.Web.Mvc; namespace EmailService { /// <summary> /// מחלקה לדוגמה שמכילה את המידע העדכני עבור יצירת הקובץ /// </summary> public class ContentFile { public int Id { get; set; } public string Name { get; set; } public string CustomerName { get; set; } } public static class CreatePdfFile { /// <summary> /// יוצר קובץ פי.די.אף מקומי על השרת /// </summary> /// <param name="content"></param> /// <param name="fileName"></param> /// <param name="path"></param> /// <param name="controller"></param> /// <returns></returns> public static async Task<bool> CreateFile(ContentFile content, string fileName, string path, ControllerContext controller) { bool success = false; var stream = await CreateStream(content, controller); using (FileStream fs = new FileStream(fileName, FileMode.Create)) { stream.WriteTo(fs); success = true; } return success; } /// <summary> /// מחזיר סטרים של קובץ פי.די.אף בלא לשמור על השרת /// יותר נח כאשר רוצים לשלוח מייל או לתת ללקוח להוריד מהדפדפן /// כך אתה מפחית את העומס מהשרת שלך /// </summary> /// <param name="content"></param> /// <param name="controller"></param> /// <returns></returns> public static async Task<MemoryStream> CreateStream(ContentFile content, ControllerContext controller) { var html = await CreateHtmlToString(content, controller); MemoryStream memory = new MemoryStream(); //משתמש בספריה NReco.PdfGenerator - ניתנת להתקנה דרך NuGet var htmlToPDF = new HtmlToPdfConverter(); var pdfBytes = htmlToPDF.GeneratePdf(html); htmlToPDF.CustomWkHtmlArgs = " --load-media-error-handling ignore "; htmlToPDF.GeneratePdf(html, null, memory); memory.Position = 0; return memory; } private static async Task<string> CreateHtmlToString(ContentFile content, ControllerContext controller) { //הנתיב צריך להפנות לקובץ ההטמל הנכון string html = RenderViewToString(controller, "~/Views/Email/CreateFileInHtml.cshtml", content, true); return html; } private static string RenderViewToString(ControllerContext context, string viewPath, object model = null, bool partial = false) { // first find the ViewEngine for this view ViewEngineResult viewEngineResult = null; if (partial) viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath); else viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null); if (viewEngineResult == null) throw new FileNotFoundException("View cannot be found."); // get the view and attach the model to view data var view = viewEngineResult.View; context.Controller.ViewData.Model = model; string result = null; using (var sw = new StringWriter()) { var ctx = new ViewContext(context, view, context.Controller.ViewData, context.Controller.TempData, sw); view.Render(ctx, sw); result = sw.ToString(); } return result; } } }
פורסם במקור בפורום CODE613 ב06/06/2017 16:57 (+03:00)
-
תודה רבה על התשובות המפורטות.
אני מתחיל פרה פרה.
- הצלחתי להדפיס קוד HTML לPDF.
אותיות עבריות הוא מדפיס לג'יבריש, אני מפחד שהוא חסיד סאטמר. :lol: :lol: - יש איזה קוד שיכול להמיר טקסט מ richtextbox ל HTML ? אני עם הארץ גמור בHTML.
פורסם במקור בפורום CODE613 ב07/06/2017 22:02 (+03:00)
- הצלחתי להדפיס קוד HTML לPDF.
-
- הצלחתי להדפיס קוד HTML לPDF.
אותיות עבריות הוא מדפיס לג'יבריש, אני מפחד שהוא חסיד סאטמר. :lol: :lol:
אתה צריך להוסיף לתגית הhead של הדף את התגית הזאת:
<meta charset="utf-8" />
והדף עצמו נראה כך:
<!DOCTYPE html>
<html lang="he">
<head>
<meta charset="utf-8" />
<title>זה הכותרת של הדף</title>
<!--כאן אתה מוסיף הפניה לקובץ הCSS של הגדרות העיצוב --></head> <body> כאן נמצא התוכן שאתה רוצה שהמשתמש יראה... </body> </html>
הנה קישור למדריך HTML בסיסי בעברית, ולא חסרים כאלה במרשתת
פורסם במקור בפורום CODE613 ב07/06/2017 22:57 (+03:00)
- הצלחתי להדפיס קוד HTML לPDF.
-
אני מידי מתחיל בשפה הזו, ואני מתחיל להתבלבל...
עכשיו אני עומד בשלב של יצירת קבצי PDF עם שמות.איפה אני הולך לכתוב את הטקסט שאני רוצה לקבל לקובץ? ואיך אני ממזג לו את השמות.
בינתיים הבאתי את הספריה של nreco
והצלחתי לייצא כמה מילים לPDF ככה:string strWride = "<head>" + "<meta charset = utf-8" + "<body>" + "<h1>" + "this is the titl " + "</h1>" + "<br/>" + "this is a new row" + "</body>" + "</head>"; var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter(); htmlToPdf.GeneratePdf(strWride, null, "e:/pdffile.pdf");
יצרתי דף HTML ואני לא יודע איך אני קורא לייצא אותו.
פורסם במקור בפורום CODE613 ב08/06/2017 02:30 (+03:00)
-
לא צריך להמציא את הגלגל, מיקרוסופט בנו מפלצת שנקראת SQL Reporting Services (בקיצור SSRS), שיכולה לענות על רוב הדרישות הנ"ל ללא שורת קוד אחת, ועבור מה שכן צריך לפתח, יש לה API מסודר.
למי שיש רישיון SQL זה כלול.
למי שיש אקספרס צריך להתקין את גירסת האקספרס המוגבלת יחסית.
פורסם במקור בפורום CODE613 ב08/06/2017 14:07 (+03:00)
-
איפה אני הולך לכתוב את הטקסט שאני רוצה לקבל לקובץ? ואיך אני ממזג לו את השמות.
יצרתי דף HTML ואני לא יודע איך אני קורא לייצא אותו.
אני המלצתי לך להשתמש ברייזור, כי אני לא מכיר את מה שsoft המליץ.
בשביל רייזור אתה צריך פרוייקט asp.net mvc שמשתמש במנוע של רייזור.
הRazor בעצם מאפשר לך לכתוב קוד HTML ולשלב בתוכו משתנים של C # בקלות, כך שכאשר הדף מרונדר הוא מציג את תוכן המשתנה במקום המתאים.יש לך כאן מדריך בעברית ASP.NET MVC
בהצלחה!
פורסם במקור בפורום CODE613 ב08/06/2017 15:13 (+03:00)
-
יצרתי דף HTML ואני לא יודע איך אני קורא לייצא אותו.
או לטעון את תוכן הקובץ למשתנה:
string strWride = File.ReadAllText(@"e:\קובץ שיצרת.html"); var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter(); htmlToPdf.GeneratePdf(strWride, null, "e:/pdffile.pdf");
יותר פשוט להשתמש במתודה שלהם שמקבלת כפרמטר נתיב לקובץ:
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter(); htmlToPdf.GeneratePdfFromFile(@"e:\קובץ שיצרת.html" , null, "e:\\pdffile2.pdf");
פורסם במקור בפורום CODE613 ב08/06/2017 15:40 (+03:00)
-
איפה אני הולך לכתוב את הטקסט שאני רוצה לקבל לקובץ? ואיך אני ממזג לו את השמות.
יצרתי דף HTML ואני לא יודע איך אני קורא לייצא אותו.
אני המלצתי לך להשתמש ברייזור, כי אני לא מכיר את מה שsoft המליץ.
בשביל רייזור אתה צריך פרוייקט asp.net mvc שמשתמש במנוע של רייזור.
הRazor בעצם מאפשר לך לכתוב קוד HTML ולשלב בתוכו משתנים של C # בקלות, כך שכאשר הדף מרונדר הוא מציג את תוכן המשתנה במקום המתאים.יש לך כאן מדריך בעברית ASP.NET MVC
בהצלחה!
בhtmlPage שאני מייצר מתוך הWPF שלי אני לא יכול לשלוף משתנים בהפרוייקט?
אני צריך לפתוח פרוייקט חדש?פורסם במקור בפורום CODE613 ב08/06/2017 17:02 (+03:00)