Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

how do I catch a bad email address before sending?

0 views
Skip to first unread message

Keith G Hicks

unread,
Apr 28, 2008, 12:19:54 PM4/28/08
to
I'm using the following code to send out email messages to a list of people
in a database. My problem is that if I'm sending to 100 people and the 40th
address is bad, it crashes on that one and doesn't run the rest. I want to
log the one that crashed so I can display it to the user and then continue
sending to the remaining people in the list.

If an address is bad, the error occurs here: EmailMsg.To.Add(New
MailAddress(RecipientEmail, RecipientDisplayName)) and goes to the exception
block. I am not sure the best way to set this up so that the error is
caught, logged and then the code continues. Can anyone let me know the best
way to do this? (apart from this problem, all the code below runs fine as
needed).

Thanks,

Ketih

Try
cnn = New SqlConnection(cnnStr)
cnn.Open()

cmd = New SqlCommand("SELECT TOP 1 EmailFromAddress_Dev AS
EmailFromAddress, " _
& " EmailSenderAddress_Dev AS EmailSenderAddress,
ReunionEmailClient_Dev AS ReunionEmailClient " _
& " FROM Reunion.vwSystemData", cnn)

cmd.CommandType = CommandType.Text

rdr = cmd.ExecuteReader
While rdr.Read
EmailFromAddress =
rdr.GetValue(rdr.GetOrdinal("EmailFromAddress")).ToString()
EmailSenderAddress =
rdr.GetValue(rdr.GetOrdinal("EmailSenderAddress")).ToString()
ReunionEmailClient =
rdr.GetValue(rdr.GetOrdinal("ReunionEmailClient")).ToString()
End While
rdr.Close()

cmd = Nothing
cmd = New SqlCommand("SELECT DisplayName, Email FROM
Reunion.vwEmailRecipients WHERE " & rblWhichList.Text & " = 1", cnn)
cmd.CommandType = CommandType.Text

rdr = cmd.ExecuteReader
While rdr.Read

i = i + 1

EmailMsg.From = New MailAddress(EmailFromAddress, "Reunion
Committee")
EmailMsg.Sender = New MailAddress(EmailSenderAddress,
"Reunion Committee")

RecipientEmail =
rdr.GetValue(rdr.GetOrdinal("Email")).ToString
RecipientDisplayName =
rdr.GetValue(rdr.GetOrdinal("DisplayName")).ToString

EmailMsg.To.Clear()
EmailMsg.To.Add(New MailAddress(RecipientEmail,
RecipientDisplayName))

EmailMsg.Subject = txtEmailSubject.Text

EmailMsg.Body = htmleditEmailBody.Html.ToString

EmailMsg.IsBodyHtml = True
EmailMsg.BodyEncoding = System.Text.Encoding.UTF8

If chkRequestReadReceipt.Checked Then
EmailMsg.Headers.Add("Disposition-Notification-To",
EmailFromAddress)
End If

Dim EmailClient As New SmtpClient()
EmailClient.Send(EmailMsg)

'error: The specified string is not in the form required for
an e-mail address.

End While

cmd.Connection.Close()

lblStatus.Text = "Mail Message Sent to " & Trim(Str(i)) & "
recipient(s)."
lblStatus.ForeColor = Drawing.Color.Blue

Catch ex As SqlException
lblStatus.Text = "Database error: " & ex.ErrorCode.ToString
lblStatus.ForeColor = Drawing.Color.Red
If cmd.Connection.State <> ConnectionState.Closed Then
cmd.Connection.Close()
End If

Catch ex As Exception
lblStatus.Text = "General error: " & ex.Message
lblStatus.ForeColor = Drawing.Color.Red
If cmd.Connection.State <> ConnectionState.Closed Then
cmd.Connection.Close()
End If

End Try


Mark Rae [MVP]

unread,
Apr 28, 2008, 12:30:49 PM4/28/08
to
"Keith G Hicks" <k...@comcast.net> wrote in message
news:OwYf0uU...@TK2MSFTNGP02.phx.gbl...

> I'm using the following code to send out email messages to a list of
> people
> in a database. My problem is that if I'm sending to 100 people and the
> 40th
> address is bad, it crashes on that one and doesn't run the rest. I want to
> log the one that crashed so I can display it to the user and then continue
> sending to the remaining people in the list.
>
> If an address is bad, the error occurs here: EmailMsg.To.Add(New
> MailAddress(RecipientEmail, RecipientDisplayName)) and goes to the
> exception
> block. I am not sure the best way to set this up so that the error is
> caught, logged and then the code continues. Can anyone let me know the
> best
> way to do this? (apart from this problem, all the code below runs fine as
> needed).

Fairly simple. Just validate that the email address is valid before trying
to send it:
http://www.google.co.uk/search?sourceid=navclient&hl=en-GB&ie=UTF-8&rlz=1T4GZEZ_en-GBGB252GB252&q=%2eNET+email+address+validate

If the email address fails validation, log it as "bad" and move on to the
next one.

I usually use a regular expression for this, e.g.

public static bool isValidEmail(string pstrEmailAddress)
{
string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
Regex objRegex = new Regex(strRegex);
if (objRegex.IsMatch(pstrEmailAddress))
{
return true;
}
else
{
return false;
}
}


--
Mark Rae
ASP.NET MVP
http://www.markrae.net

Keith G Hicks

unread,
Apr 28, 2008, 12:59:37 PM4/28/08
to
Thanks Mark. That helps a lot.

I have a question. Your validation string is quite a bit longer than the one
that is preset in the RegularExpressionValidator for testing emails in a
text box:
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

I'm not very experienced with RE's so they might mean the same thing. I'm
just wondering why such a big difference. Does "w" handle a-zA-Z0-9 and the
Underscore character?

Thanks,

Keith


"Mark Rae [MVP]" <ma...@markNOSPAMrae.net> wrote in message
news:eeVG50U...@TK2MSFTNGP06.phx.gbl...

0 new messages