יום שני, 11 באוקטובר 2010

יצירת תוכנת מייל C# - mail client


נתייחס לג'ימייל, אך השימוש נכון גם לכל שרת מייל אחר.
מיקמתי את הקוד המלא  כאן:

לאחר שיצרנו את הטופס-ממשק משתמש כפי שרצינו, נלחץ פעמיים על כפתור 'שלח' כדי להגיע לקוד של הטופס.



ראשית, נוסיף בראש הדף התייחסויות שימוש במחלקות של רשת ומייל:

using System.Net;
using System.Net.Mail;
את הקוד כדאי לתחום בתוך try..catch, כדי למנוע נפילות של התוכנית במקרה פשוט, למשל- מקרה של חוסר חיבור לאינטרנט.
כעת אציג את כל הקוד של הפעולה הבסיסית של לחיצה על 'שלח':
MailMessage msg = new MailMessage();
SmtpClient myServer = new SmtpClient("smtp.gmail.com", 587);
myServer.EnableSsl = true; // SSL ג'ימייל דורש
SmtpServer.Credentials = new NetworkCredential("user@gmail.com", "password");

msg.From = new MailAddress(txtb_from.Text, txt_name.Text, System.Text.Encoding.UTF8);

נשים לב, כי ג'ימייל דורש חיבור SSL. מעבר לכך הגדרנו את הקידוד של הדף ל-UTF8 כדי שיישלח בעברית קריאה.
לשם הוספת כתובות רבות לשליחה אליהן, נשתמש בטריק. נקבע שהכתובות יופרדו בפסיקים (,), ונחלק את המחרוזת. ()Trim מסיר רווחים מיותרים:
String[] adresses = txtb_to.Text.Split(',');
for (int i = 0; i < adresses.Length; i++)
      msg.To.Add(new MailAddress(adresses[i].Trim() ) );

נמשיך בהוספת נושא מייל, ואת גוף המייל:
msg.Subject = txtBox_Subject.Text;
msg.Body = richTextBox.Text; 
msg.ReplyTo = new MailAddress(txtb_From.Text);

msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
SmtpServer.Send(msg);

כדאי להוסיף לסוף הקוד חיווי שנדע שהמייל נשלח בהצלחה:
MessageBox.Show("מייל נשלח בהצלחה");
וכמו כן להוסיף חיווי על כשלון בשליחה, בתוך catch: 
catch (System.Exception ex)
{
    MessageBox.Show("שגיאה - \n" + ex.Message);
}

הוספת קבצים למייל - באחד הפוסטים הבאים.

הקוד המלא:
private void btn_Send_Click(object sender, EventArgs e)
{
   try
   {
      MailMessage msg = new MailMessage();
      SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com", 587);
      SmtpServer.EnableSsl = true; 
 
      SmtpServer.Credentials = new NetworkCredential(
                           txtb_Account.Text.Trim().ToString(), 
                           txtb_Password.Text.Trim().ToString());

      msg.From = new MailAddress(
                           txtb_From.Text.Trim(), txtb_Name.Text, 
                           System.Text.Encoding.UTF8);

      String[] adresses = txtb_To.Text.Split(',');
      for (int i = 0; i < adresses.Length; i++)
      msg.To.Add(new MailAddress(adresses[i].Trim()));

      msg.Subject = txtb_Subject.Text;
      msg.Body = richTextBox1.Text;
      msg.ReplyTo = new MailAddress(txtb_From.Text.Trim());

      msg.DeliveryNotificationOptions = 
                           DeliveryNotificationOptions.OnFailure;
      msg.DeliveryNotificationOptions = 
                           DeliveryNotificationOptions.OnSuccess;

      SmtpServer.Send(msg);
   }
   catch (System.Exception ex)
   {
      MessageBox.Show("error - " + ex.Message);
   }
}
קוד לקבלת מייל -
כדי להתחבר לחשבון גימייל עם תוכנה פשוטה צריך קודם כל לאפשר "גישה לאפליקציות ברמת אבטחה נמוכה" בג'ימייל, אחרת נקבל תשובה ששם המשתמש או הסיסמה אינן נכונים.
אבל,
כדי לשמור על אבטחת החשבון, החל מתאריך 30 במאי 2022 תפסיק ​​Google לתמוך באפליקציות או במכשירים של צד שלישי שבהם אפשר להיכנס לחשבון Google באמצעות הזנה של שם המשתמש והסיסמה בלבד.
כלומר כדי לכתוב תוכנת מייל עם ג'ימייל יהיה צורך לעבוד עם google api.
עד אז... אפשר להשתמש בקוד הבא.
protected void ReadMail(string address, string password, string server = "pop.gmail.com")
{
    // create an instance of TcpClient 
    TcpClient tcpclient = new TcpClient();
    tcpclient.Connect(server, 995);
    System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream());
    sslstream.AuthenticateAsClient(server);
    StreamWriter sw = new StreamWriter(sslstream);
    System.IO.StreamReader reader = new StreamReader(sslstream);
    sw.WriteLine("USER " + address);
    sw.Flush();
    sw.WriteLine("PASS " + password);
    sw.Flush();
    sw.WriteLine("RETR 1");
    sw.Flush();
    sw.WriteLine("Quit ");
    sw.Flush();
    string str = string.Empty;
    string strTemp = string.Empty;
    int max_emails = 20;
    while ((strTemp = reader.ReadLine()) != null || max_emails >= 0)
    {
      if (".".Equals(strTemp))
      {
          break;
      }
      if (strTemp.IndexOf("-ERR") != -1)
      {
          textBox1.Text += strTemp;
          break;
      }
      textBox1.Text += strTemp + Environment.NewLine;
      listView1.Items.Add(str);

      max_emails--;
      if (max_emails <= 0) break;
    }
    //Console.Write(str);
    reader.Close();
    sw.Close();
    tcpclient.Close(); // close the connection
}
מידע על משמעות מילות הקוד של שליחת/קבלת מייל:
https://www.codeproject.com/Articles/14304/POP3-Email-Client-NET-2-0

אין תגובות:

הוסף רשומת תגובה