הפורום נסגר!

במקומו נפתח פורום חדש, טוב יותר בהרבה מובנים. >>>>
אתם מוזמנים להצטרף אליו, בואו!

ההצטרפות לפורום התכנות החדש כרוכה בתשלום חודשי סמלי.

מחלקה גנרית לשליחת מייל בC#

שיתוף של ידע פרקטי, ספריות, קוד, ודוקמנטציה ברוחב לב החברים היקרים.

מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי avr416 » 21 מרץ 2016, 17:55

מצ"ב מחלקה עם מתודה לשליחת מיילים בצורה גנרית.
הקדמה:
המחלקה משתמשת בחשבון גימייל לשליחת מייל, לא ניסיתי להתעסק עם הגדרות של חשבונות אחרים כיון שזה הכי נפוץ וזמין.
את הגדרות החשבון אנו מגדירים בקובץ הקונפיגורציה של האפליקציה (app.config או web.config) כך:
xml code
<appSettings>
<!--הגדרות חשבון גימייל לאפליקציה-->
<add key="From" value="שם השולח כפי שיוצג לנמען"/>
<add key ="SMTPUserName" value="כתובת המייל של השולח - דהיינו החשבון שלנו"/>
<add key="SMTPPasssword" value="סיסמת החשבון שלנו"/>
<!--סוף הגדרות חשבון גימייל-->
</appSettings>

יש לנו 2 מחלקות: המחלקה הראשונה מכילה את הפרטים של ההודעה, והשניה מכילה את המתודה לשליחת ההודעה.
יש ליצור אובייקט של הודעה, להכניס את הערכים הרצויים, ואח"כ להשתמש במתודה SendEMail לשליחת ההודעה לנמען.
זה תומך גם בריבוי נמענים, וכן בריבוי קבצים מצורפים.
בהצלחה!!

csharp code
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using System.Text;

public class MessageGmail
{
//חשוב להקפיד שהערכים יהיו כך
//key=שם הנמען,value=כתובת המייל שלו
public Dictionary<string, string> ToList { get; set; } = new Dictionary<string, string>();
public string Subject { get; set; }
public string Body { get; set; }
public bool IsBodyHtml { get; set; } = false;
public List<Attachment> ListFileAttachment { get; set; } = new List<Attachment>();
}

public static class SendMail
{
private static string senderName = ConfigurationManager.AppSettings["From"].ToString();
private static string senderEmailId = ConfigurationManager.AppSettings["SMTPUserName"].ToString();
private static string password = ConfigurationManager.AppSettings["SMTPPasssword"].ToString();
private static MailAddress fromAddress = new MailAddress(senderEmailId, senderName);

public static bool SendEMail(MessageGmail message)
{
var success = false;
var msg = createMessage(message);
msg = addFilesToMessage(message, msg);

var client = createClient();
try
{
client.Send(msg);
success = true;
}
catch(Exception ex)
{
//להוסיף דיוח על שגיאה אם רוצים
}
return success;
}

private static MailMessage createMessage(MessageGmail message)
{
MailMessage msg = new MailMessage()
{
From = fromAddress,
Subject = message.Subject,
Body = message.Body,
IsBodyHtml = message.IsBodyHtml,
SubjectEncoding = Encoding.UTF8,
BodyEncoding = Encoding.UTF8
};
//מצרף את כתובות המייל לשליחה
foreach (var address in message.ToList)
{
var ToAddress = new MailAddress(address.Value, address.Key);
msg.To.Add(ToAddress);
}
return msg;
}

private static SmtpClient createClient()
{
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.Credentials = new NetworkCredential(fromAddress.Address, password);
return client;
}

private static MailMessage addFilesToMessage(MessageGmail originalMessage, MailMessage msg)
{
if (originalMessage.ListFileAttachment!= null)
{
foreach (var file in originalMessage.ListFileAttachment)
{
msg.Attachments.Add(file);
}
}
return msg;
}
}

טסט:
csharp code
[TestClass()]
public class SendMailTests
{
string path = @"C:\Users\Latitude E7240\Downloads\RecieptDonationNo1.pdf";
string path2 = @"C:\Users\Latitude E7240\Documents\InvoiceNo.2837.pdf";
MessageGmail message = new MessageGmail();

[TestMethod()]
public void SendEMailTest()
{
message.ToList.Add("ישראל ישראלי", "israel@gmail.com");
message.ToList.Add("אליהו הנביא", "eliau@gmail.com");
message.Subject = "בדיקה בדיקה בדיקה";
message.Body = "test test test";

message.ListFileAttachment.Add(new Attachment(path));
message.ListFileAttachment.Add(new Attachment(path2));

SendMail.SendEMail(message);
}
}
הבדיקה עברה בהצלחה :lol:
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי מתכנת » 26 אוגוסט 2016, 13:28

תודה.
הקוד לא שולח לי.
מתכנת
משתמש וותיק
 
הודעות: 45
הצטרף: 05 אוגוסט 2016, 11:38
שלח תודה: 10 פעמים
קיבל תודה: 7 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי avr416 » 26 אוגוסט 2016, 13:37

תראה מה עשית?
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי מתכנת » 29 אוגוסט 2016, 10:34

Send.cs
csharp code
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using System.Text;

public class MessageGmail
{
//חשוב להקפיד שהערכים יהיו כך
//key=שם הנמען,value=כתובת המייל שלו
public Dictionary<string, string> ToList { get; set; } = new Dictionary<string, string>();
public string Subject { get; set; }
public string Body { get; set; }
public bool IsBodyHtml { get; set; } = false;
public List<Attachment> ListFileAttachment { get; set; } = new List<Attachment>();
}

public static class SendMail
{
private static string senderName = ConfigurationManager.AppSettings["From"].ToString();
private static string senderEmailId = ConfigurationManager.AppSettings["SMTPUserName"].ToString();
private static string password = ConfigurationManager.AppSettings["SMTPPasssword"].ToString();
private static MailAddress fromAddress = new MailAddress(senderEmailId, senderName);

public static bool SendEMail(MessageGmail message)
{
var success = false;
var msg = createMessage(message);
msg = addFilesToMessage(message, msg);

var client = createClient();
try
{
client.Send(msg);
success = true;
}
catch (Exception ex)
{
//להוסיף דיוח על שגיאה אם רוצים
}
return success;
}

private static MailMessage createMessage(MessageGmail message)
{
MailMessage msg = new MailMessage()
{
From = fromAddress,
Subject = message.Subject,
Body = message.Body,
IsBodyHtml = message.IsBodyHtml,
SubjectEncoding = Encoding.UTF8,
BodyEncoding = Encoding.UTF8
};
//מצרף את כתובות המייל לשליחה
foreach (var address in message.ToList)
{
var ToAddress = new MailAddress(address.Value, address.Key);
msg.To.Add(ToAddress);
}
return msg;
}

private static SmtpClient createClient()
{
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.Credentials = new NetworkCredential(fromAddress.Address, password);
return client;
}

private static MailMessage addFilesToMessage(MessageGmail originalMessage, MailMessage msg)
{
if (originalMessage.ListFileAttachment != null)
{
foreach (var file in originalMessage.ListFileAttachment)
{
msg.Attachments.Add(file);
}
}
return msg;
}
}

Program.cs
csharp code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MessageGmail mg = new MessageGmail();
mg.Subject = "test";
mg.Body = "test";
mg.ToList.Add("שם המייל", "כתובת המייל");
SendMail.SendEMail(mg);

}
}
}
נערך לאחרונה על ידי מתכנת בתאריך 31 אוגוסט 2016, 12:41, נערך פעם אחת בסך הכל.
מתכנת
משתמש וותיק
 
הודעות: 45
הצטרף: 05 אוגוסט 2016, 11:38
שלח תודה: 10 פעמים
קיבל תודה: 7 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי avr416 » 29 אוגוסט 2016, 11:02

איפה הגדרת את חשבון השולח שלך?
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי מתכנת » 31 אוגוסט 2016, 12:04

ב app.config
מתכנת
משתמש וותיק
 
הודעות: 45
הצטרף: 05 אוגוסט 2016, 11:38
שלח תודה: 10 פעמים
קיבל תודה: 7 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי avr416 » 31 אוגוסט 2016, 12:36

צרף פה את כל הפרוייקט (קובץ ZIP), כדי שנוכל לראות ולעזור לך.
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי מתכנת » 31 אוגוסט 2016, 12:49

צרפתי.
צריך Visual Studio 15 Preview 4 כדי לפתוח.
העלו פה קישור להתקנה.
אין לך את ההרשאות המתאימות על מנת לצפות בקובץ המצורף להודעה זאת.
מתכנת
משתמש וותיק
 
הודעות: 45
הצטרף: 05 אוגוסט 2016, 11:38
שלח תודה: 10 פעמים
קיבל תודה: 7 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי דוד ל.ט. » 31 אוגוסט 2016, 13:10

מתכנת יקר, מתרחשת שגיאה כל שהיא או כלום לא קורה?
אנא גם שים נקודת עצירה בתוך הTry (בקובץ Send שורה 39) ותראה אם זה עוצר, ואם כן מה התוכן של השגיאה בex.
סמל אישי של המשתמש
דוד ל.ט.
משתמש וותיק
 
הודעות: 2380
הצטרף: 12 יוני 2013, 11:02
שלח תודה: 1238 פעמים
קיבל תודה: 2019 פעמים

Re: מחלקה גנרית לשליחת מייל בC#

הודעהעל ידי avr416 » 31 אוגוסט 2016, 14:34

קודם כל בפרוייקט שצירפת לא הגדרת שום חשבון לשליחה, (אני מניח כדי שלא נוכל לפרוץ לך לגימייל..). אז בהנחה שאתה מגדיר את כל הפרטים בצורה נכונה ומדוייקת.
אצלי זה עובד!
אולם ניסיתי עם חשבון מייל אחר, וקיבלתי מייד מייל מגוגל שמישהו ניסה להתחבר לחשבון שלי דרך אפליקציה שאינה עומדת בתקני האבטחה המחמירים של גוגל 8-) ולכן הם חסמו זאת.. אז ככל הנראה זאת הסיבה שזה לא עובד אצלך.
תבדוק בחשבון המייל שלך אם אתה מקבל את ההודעה הבאה:
2016-08-31.png

עיין בקישור הבא כיצד אתה יכול לשנות את הגדרות החשבון כדי שיאפשרו שליחת מייל דרך אפליקציה
https://support.google.com/accounts/answer/6010255
במייל שלי אני אפשרתי זאת (כדי לאפשר לאאוטלוק להשתמש במייל של גוגל..)
בהצלחה!
אין לך את ההרשאות המתאימות על מנת לצפות בקובץ המצורף להודעה זאת.
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

הבא

חזור אל שיתופיה

מי מחובר

משתמשים הגולשים בפורום זה: all bots ו 0 אורחים

Fatal: ./cache/ is NOT writable.