PDA

View Full Version : ایمیل به تعداد فراوان



sahele_sheni
پنج شنبه 04 مهر 1387, 00:08 صبح
سلام
توی برنامه لازمه به افراد زیادی میل بزنم
کدش رو هم نوشتم و درست کار میکنه ولی به نظرم از لحاظ منطق برنامه نویسی اشکال
داره ....آخه زیادی عملnewرو انجام میدم

کد رو میذارم اگه اشکالی داره یا کد بهتری به نظرتون میرسه دریغ نکنید
چون برنامه فعلا روی سیستم خودمه از locallhost استفاده کردم



Dim mail AsNew System.Net.Mail.MailMessage()
Dim from AsNew System.Net.Mail.MailAddress(w@yahoo.com)
mail.From = from
counter = Me.Maindataset1.tblEnrolledProfessors.Rows.Count
Dim smtp AsNew System.Net.Mail.SmtpClient("localhost")
For innercounter = 0 To counter - 1
email = Me.Maindataset1.tblEnrolledProfessors.Rows(innerco unter).Item("Email")
Dim reciver AsNew System.Net.Mail.MailAddress(email)
mail.Subject = subjectbox.text
mail.Body = bodybox.text
smtp.Send(mail)
Next

sahele_sheni
جمعه 05 مهر 1387, 12:07 عصر
حداقل اگه درسته بگید تا استفاده کنم از همین کد !!!

__H2__
جمعه 05 مهر 1387, 21:12 عصر
سلام
شما میتوانید آدرس همه مقصد ها را در To بدهید و بعد یک باره برای همه اطلاعات را ارسال کنید.
البته شاید سریعترین راه باشد ولی اغلب برای تعداد خیلی زیاد چندان هم مناسب نیست.
چون نه میتوان فهمید که الآن پروسه چه آماری دارد و چندتا را فرستاده و چندتا ....، نه قابل مکس و توقف است و اگر هم به دلیلی به خطا بخورد متوجه نمیشویم کار تا کجا انجام شده بود و....


Dim smtp As New System.Net.Mail.SmtpClient("smtp.gmail.com")
Dim mail As New System.Net.Mail.MailMessage
Dim email As String

smtp.Timeout = Integer.MaxValue
smtp.EnableSsl = True
smtp.Credentials = New System.Net.NetworkCredential("accountname@gmail.com", "password")

mail.From = New System.Net.Mail.MailAddress("accountname@gmail.com")
mail.Subject = Me.subjectbox.text
mail.Body = Me.bodybox.text

Dim iEmailColumnIndex As Integer = Me.Maindataset1.tblEnrolledProfessors.Columns("Email").Ordinal
Dim rows As System.Data.DataRowCollection = Me.Maindataset1.tblEnrolledProfessors.Rows
Dim emails As System.Net.Mail.MailAddressCollection = mail.To

For innercounter = 0 To rows.Count - 1
email = TryCast(rows.Item(innercounter).Item(iEmailColumnI ndex), String)
If (Not String.IsNullOrEmpty(email)) Then
emails.Add(email)
End If
Next

smtp.Send(mail)


برای تعداد خیلی زیاد دستور پیشنهادی من این است:


Dim smtp As New System.Net.Mail.SmtpClient("smtp.gmail.com")
Dim mail As New System.Net.Mail.MailMessage
Dim email As String

smtp.EnableSsl = True
smtp.Credentials = New System.Net.NetworkCredential("accountname@gmail.com", "password")

mail.From = New System.Net.Mail.MailAddress("accountname@gmail.com")
mail.Subject = Me.subjectbox.text
mail.Body = Me.bodybox.text

Dim iEmailColumnIndex As Integer = Me.Maindataset1.tblEnrolledProfessors.Columns("Email").Ordinal
Dim rows As System.Data.DataRowCollection = Me.Maindataset1.tblEnrolledProfessors.Rows
Dim emails As System.Net.Mail.MailAddressCollection = mail.To

For innercounter = 0 To rows.Count - 1
email = TryCast(rows.Item(innercounter).Item(iEmailColumnI ndex), String)
If (Not String.IsNullOrEmpty(email)) Then
emails.Clear()
emails.Add(email)

Try
smtp.Send(mail)
Catch ex As Exception
'...
End Try
End If
Next


تعریف متغیرهای rows و emails و iEmailColumnIndex صرفاً جهت افزایش سرعت و کم کردن بار کاری درون حلقه است.
که شاید در ظاهر کد را افزایش داده باشد ولی در باطن موجب سرعت بیشتر میشود.
چون یک خط کد بیرون حلقه، یک کد است و یک بار اجرا میشود، ولی یک خط کد درون یک حلقه 100 دوری، 100 خط کد است و 100 بار اجرا میشود. !

گزینه SSL و user و password بسته به شرایط هاست، شاید نیاز نباشند.