• 0

كيف أعمل إرفاق لصورة بغرض إرسالها لبريد الكتروني (ASP.NET with C#)

السلام عليكم،

لدي صفحة بإسم (SelectCard.aspx) فيها مجموعة من الصور، هذه الصور مُخزنة في قاعدة البيانات محفوظة على شكل مسار الصورة (مكان الصورة الفيزيائي ضمن ملفات المشروع file path)، ولدى كل صورة معرف id خاص بها، وهذه الصور معروضة في صفحة (SelectCard.aspx) بإستخدام GridView، وتحت كل صورة Link وهذا الكود الخاص به:

<asp:HyperLink ID="HyperLink1" runat="server" Text="Detailed / Edit"  NavigateUrl='<%# Eval("Card_id", "~/send-card.aspx?Id={0}") %>'>Select Card</asp:HyperLink>

وهذا الكود الخاص بالصورة نفسها:

<asp:Image ID="Image1" runat="server" Height="194px" Width="188px" ImageUrl='<%# Eval("Card_Path") %>' />

عندما يتم الضغط على الرابط، يتم التحول الى صفحة ثانية اسمها (send-card.aspx)، ويتم عرض txtbox فيه الـID الخاص بالصورة، وهنالك txtbox فيه امكانية كتابة ايميل الشخص المرسل له، وايضاً يتم عرض Image Control فيه الصورة نفسها التي اختارها الشخص من الصفحة الاولى، وهنالك textbox = multiline يتم كتابة رسالة فيه، وآخيراً هنالك زر للارسال.
الان كل شيء يعمل عندما اكتب إيميل الشخص والرسالة، ولكن الصورة التي هي موجودة في الـImage Control لا يتم ارسالها، بعد بحث في الانترنت علمت انه يجب عمل Attachment، وهذا الـ(attachment) يحتاج الى مسار الصورة المُختارة أو المعروضة في الـImage Control .. ولكن حاولت بكل الطرق جلب مسار الصورة، يعني أريد مسار الصورة الموجوة في صندوق الصورة لكي أضعه داخل attachment ، لا اعرف كيف استخرجه.
هذا الكود (سي شارب) الخاص بصفحة send-card لكي يتضح  الامر..

public partial class send_card : System.Web.UI.Page
{
    // Creating connection
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["eg"].ConnectionString);
    protected void Page_Load(object sender, EventArgs e)
    {
        // Getting ID number from selected card and pass it to ID textbox
        txt_id.Text = Request.QueryString["id"].ToString();
        // Open connection
        conn.Open();
        // Selecting the specific image based on the retrieved id number from the textbox
        SqlCommand cmd = new SqlCommand("Select * from Cards where Card_ID ='" + txt_id.Text + "'", conn);
        SqlDataReader dr = cmd.ExecuteReader();
        
        while(dr.Read())
        {
            SelectedImg.ImageUrl = dr["Card_Path"].ToString();
        }
        conn.Close();
    }
    // A method which used to created AlertBox
    public void AlertBox(string msg)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("<script type = 'text/javascript'>");
        sb.Append("window.onload=function(){");
        sb.Append("alert('");
        sb.Append(msg);
        sb.Append("')};");
        sb.Append("</script>");
        ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString());
    }
    protected void btn_send_Click(object sender, EventArgs e)
    {
        // Open connection
        conn.Open();
        // ********************   Code for sending the mail
        System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
        mail.To.Add(email2.Text);
        mail.From = new MailAddress("abuhussam@mymail.com", "E-Greetings", System.Text.Encoding.UTF8);
        mail.Subject = "E-Greetings from :" + email2.Text;
        mail.SubjectEncoding = System.Text.Encoding.UTF8;
        //mail.Attachments.Add(new Attachment(SelectedImg.ImageUrl));


        mail.Body = "Dear User," + "<br><br>" + "You have received one new mail greeeting from E-Greetings Service." + "<br>" + "Your friend message showing as below:" + "<br><br><br>" + txt_body.Text + "<br><br>"  + "<br><br>" + "Thanks & Regards," + "<br>" + "E-Greetings(Admin)";
        mail.BodyEncoding = System.Text.Encoding.UTF8;
        mail.IsBodyHtml = true;
        mail.Priority = MailPriority.High;
        SmtpClient client = new SmtpClient();
        client.Credentials = new System.Net.NetworkCredential("abuhussam@mymail.com", "aa2132e"); // Enter the pwd instead
        client.Port = 25;
        client.Host = "mail.sharewaretech.com";
        client.EnableSsl = false; 
        client.Send(mail);

        // ****************   Code for storing the data inside the database




        Response.Write("<script language='javascript'>window.alert('Mail Sent Successfully<br>click OK to select another card.');window.location='SelectCard.aspx';</script>");
    }
}

ستلاحظ أنني وضعت الكود :

//mail.Attachments.Add(new Attachment(SelectedImg.ImageUrl));

في تعليق لكي لا يتأثر الكود الاصلي، الان بدل كتابة (SelectedImg.ImageUrl) يجب علي كتابة مسار الصورة الموجودة في الImage Control ، وهذه ممكن تكون اكثر من صورة لانهم مخزنين في قاعدة البيانات، فأنا ليس من المعقول ان اعطي مسار صورة واحدة ((بالتحديد))، لذلك علي استخراج المسار من الصورة المختارة من الصفحة الاولى، يعني الصورة الموجودة في الImage Control لانها تم استخراجها من الصفحة الاولى، وأخذ المسار الخاص بها ووضعه في مكان (SelectedImg.ImageUrl).
أتمنى أن الفكرة والمشكلة والسؤال وصل مفهوم، أتمنى المساعدة، واسف على الاطالة..

أرجو المساعدة في إيجاد حل المشكلة، شكراً لكم كثيراً :) ..

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 2

مسار الصورة موجود لديك قمتَ بجلبه من الاستعلام

SqlCommand cmd = new SqlCommand("Select * from Cards where Card_ID ='" + txt_id.Text + "'", conn);

حاول طباعة محتوى SelectedImg.ImageUrl وجرّب إنشاء Label  أو HiddenField وإسناد مسار الصورة لها :

while(dr.Read())
        {
            SelectedImg.ImageUrl = dr["Card_Path"].ToString();

             lbl.Text = dr["Card_Path"].toString();
        }

ثم استبدل SelectedImg.ImageUrl بـ lbl.Text

mail.Attachments.Add(new Attachment(lbl.Text));

حل آخر جرّب إرسال مسار الصورة Card_Path مع معرّف الصورة id ضمن رابط الصفحة الثانية ثم قم باسترجاعه وتمريره لـ mail.Attachments.Add():

mail.Attachments.Add(new Attachment(Request.QueryString["CardPath"].ToString()));

 

ملاحظة: استخدم الإشارة @ في بداية كتابتك للسلسلة النصّية String ليسهّل عليك كتابة الجمل واستعلامات SQL الطويلة على عدّة أسطر وبالتالي سهولة قراءتها:

mail.Body = @"Dear User," + "<br><br>" 
+ "You have received one new mail greeeting from E-Greetings Service."
+ "<br>" + "Your friend message showing as below:"
+ "<br><br><br>" + txt_body.Text + "<br><br>"  + "<br><br>" 
+ "Thanks & Regards," + "<br>" + "E-Greetings(Admin)";

بالتوفيق

تمّ تعديل بواسطة Lujain
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 1

حسنًا سأكتب لك الطريقة الثانية ولكن أولًا هل يمكنك كتابة المسار الذي يظهر لك هنا 

تمّ تعديل بواسطة Lujain

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 1

حسنًا أول خطوة يجب أن يأخذ المسار الشكل التالي بدون /~:

Cards/birthday-10.jpg

ولعمل ذلك اكتب الشيفرة التالية:

String myNewPath = SelectedImg.ImageUrl.Substring(2);

اعتمد طريقتك السّابقة ولكن مرر المسار كما في المثال التالي: 

 

MailAttachment attachment = new MailAttachment( Server.MapPath(myNewPath) );

mail.Attachments.Add( attachment );	//add the attachment

لتصبح الشيفرة الكاملة على الشكل التالي:

System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
        mail.To.Add(email2.Text);
        mail.From = new MailAddress("abuhussam@mymail.com", "E-Greetings", System.Text.Encoding.UTF8);
        mail.Subject = "E-Greetings from :" + email2.Text;
        mail.SubjectEncoding = System.Text.Encoding.UTF8;

String myNewPath = SelectedImg.ImageUrl.Substring(2);
MailAttachment attachment = new MailAttachment( Server.MapPath(myNewPath) );
mail.Attachments.Add( attachment );	//add the attachment

 

بالتوفيق

تمّ تعديل بواسطة Lujain

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 1

هذه الطريقة الثانية ((للإستفادة)) تمرير أكثر من قيمة في رابط الصفحة URL:

<asp:HyperLink ID="HyperLink1" runat="server" Text="Detailed / Edit"  NavigateUrl='<%# String.Format("~/send-card.aspx?Id={0}&Path={1}", DataBinder.Eval(Container.DataItem, "Card_id"), DataBinder.Eval(Container.DataItem, "Card_Path"))%>'>Select Card</asp:HyperLink>

 

تمّ تعديل بواسطة Lujain

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

شكراً لك "Lujain" إستخدمت الطريقة الاولى، وهي بإسناد مسار الصورة للـlbl_imgpath، وهو عبارة عن TextBox في الصفحة أمرر له قيمة مسار الصورة عن طريق الImgUrl، ولكن عند استخدامها داخل الـAttachment يعطيني مشكلة بعدم إيجاد المسار الخاص بالصورة رغم انني متأكد بأن المسار تم طباعته في الـTextBox الاضافي بشكل صحيح 100%. لذلك اريد استخدام الطريقة الثانية بتمرير Card_Path إلى عنوان الصفحة، كيف يمكنني عمل ذلك، أي تمريره لعنوان الصفحة؟ حيث الان أستطيع أن امرر الـid الخاص بالصورة، ولكن لا اعرف طريق تمرير العنوان الخاص بالصورة في عنوان الصفحة، هذا مثال لرابط الصفحة بعد الضغط على أي رابط لصورة ما من الصفحة الاولى:
 

http://localhost:20133/send-card.aspx?Id=16

كيف يمكنني إضافة بعد الـid ، الـpath الخاص بالصورة لكي أستخدمه لاحقاً لعمل ارفاق للصورة في الايميل؟ أرجو إعطاءي التفاصيل لأنني بحثت جيداً لساعات عديدة. وشكراً لك جزيلاً على المساعدة ^_^

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

المسار الذي يظهر لي في الـTextBox هكذا بالضبط: (للصورة رقم 16 من صور عيدالميلاد)
 

~/Cards/birthday-10.jpg

طبعاُ الصور مخزنة في مجلد المشروع الذي اسمه (Cards) و مسار الصورة (Card_Path) ، مع الid محفوظ في قاعدة البيانات الخاصة بالمشروع ايضاً.

تمّ تعديل بواسطة ABU_HUSSAM
إضافة نص

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن