Hi JOYSON,
I would refer you that not to delete the record if user is unsubscribed just change the status to false so that in future if you require any details about the user who were on the site then you can get it from subscription table.
First i have created a sample based on single page so go through below sample carefully and you need to add sendmail code from below article with link and modify it according to your need.
I have taken reference from below articles.
SQL
Create Table
CREATE TABLE Subscribe
( SubscribeId INT IDENTITY(1,1)
,Email VARCHAR(255)
,Subscribed BIT
)
INSERT INTO Subscribe VALUES('test@gmail.com',0)
INSERT INTO Subscribe VALUES('test123@gmail.com',1)
Stored Procedure
CREATE PROCEDURE Subscribe_NewsLetter
@email VARCHAR(255)
,@id int output
AS
BEGIN
IF EXISTS (SELECT Email FROM Subscribe WHERE Email = @email AND Subscribed = 1)
BEGIN
SET @id = 0
END
ELSE IF EXISTS(SELECT Email FROM Subscribe WHERE Email = @email AND Subscribed = 0)
BEGIN
UPDATE Subscribe
SET Subscribed = 1
WHERE Email = @email
SET @id = (SELECT SubscribeId
FROM Subscribe
WHERE Email = @email)
END
ELSE
BEGIN
INSERT INTO Subscribe VALUES(@email,1)
SET @id = (SELECT SCOPE_IDENTITY())
END
RETURN @id
END
HTML
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
body
{
font-family: Arial;
font-size: 10pt;
}
table th
{
background-color: #F7F7F7;
color: #333;
font-weight: bold;
}
table th, table td
{
padding: 5px;
border-color: #ccc;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
<script type="text/javascript">
$(function () {
$('[id*=btnSubscribe]').click(function () {
var emailId = $('[id*=txtEmail]').val();
if (emailId != '') {
$.ajax({
type: "POST",
url: "Default.aspx/SendMail",
data: '{emailId : "' + emailId + '"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
alert(r.d);
}
});
}
else {
alert('Please Enter Mail Id!');
}
return false;
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table id="tblSubscribe" runat="server">
<tr>
<td>
<asp:TextBox ID="txtEmail" CssClass="form-control" runat="server" ValidationGroup="valid" />
</td>
</tr>
<tr>
<td>
<asp:Button ID="btnSubscribe" class="btn btn-primary" ValidationGroup="valid" Text="Subscribe"
runat="server"></asp:Button>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
C#
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["unsubscribe"] != null)
{
string subscribeId = Request.QueryString["unsubscribe"];
subscribeId = Decrypt(subscribeId);
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
string query = "SELECT SubscribeId FROM Subscribe WHERE SubscribeId = @Id AND Subscribed = 1 ";
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@Id", subscribeId);
con.Open();
subscribeId = cmd.ExecuteScalar() != null ? cmd.ExecuteScalar().ToString() : string.Empty;
if (!string.IsNullOrEmpty(subscribeId))
{
string updateQuery = "UPDATE Subscribe SET Subscribed = 0 WHERE SubscribeId = @Id";
SqlCommand cmdUpdate = new SqlCommand(updateQuery, con);
cmdUpdate.Parameters.AddWithValue("@Id", subscribeId);
cmdUpdate.ExecuteNonQuery();
Response.Write("You have Unsubscribed Successfully!");
}
else
{
Response.Write("You have already Unsubscribed!");
}
con.Close();
tblSubscribe.Visible = false;
}
}
}
}
[System.Web.Services.WebMethod]
public static string SendMail(string emailId)
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
string query = "Subscribe_NewsLetter";
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@email", emailId);
cmd.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
string subscribeId = cmd.Parameters["@id"].Value.ToString();
con.Close();
if (!string.IsNullOrEmpty(subscribeId))
{
if (subscribeId == "0")
{
return "You have already Subscribed";
}
}
subscribeId = Encrypt(subscribeId);
// Your send mail code comes here and pass text and html file.
// and unsubscribing link with querystring encrypted so that no one can tamper with link.
string urlWithUnsubscribe = HttpContext.Current.Request.Url.ToString().Substring(0, HttpContext.Current.Request.Url.ToString().LastIndexOf('/'));
urlWithUnsubscribe += "?unsubscribe=" + subscribeId;
return urlWithUnsubscribe;
}
}
}
private static string Decrypt(string cipherText)
{
string EncryptionKey = "MAKV2SPBNI99212";
cipherText = cipherText.Replace(" ", "+");
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
private static string Encrypt(string clearText)
{
string EncryptionKey = "MAKV2SPBNI99212";
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
VB.Net
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Request.QueryString("unsubscribe") IsNot Nothing Then
Dim subscribeId As String = Request.QueryString("unsubscribe")
subscribeId = Decrypt(subscribeId)
Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
Using con As New SqlConnection(constr)
Dim query As String = "SELECT SubscribeId FROM Subscribe WHERE SubscribeId = @Id AND Subscribed = 1 "
Using cmd As New SqlCommand(query, con)
cmd.Parameters.AddWithValue("@Id", subscribeId)
con.Open()
subscribeId = If(cmd.ExecuteScalar() IsNot Nothing, cmd.ExecuteScalar().ToString(), String.Empty)
If Not String.IsNullOrEmpty(subscribeId) Then
Dim updateQuery As String = "UPDATE Subscribe SET Subscribed = 0 WHERE SubscribeId = @Id"
Dim cmdUpdate As New SqlCommand(updateQuery, con)
cmdUpdate.Parameters.AddWithValue("@Id", subscribeId)
cmdUpdate.ExecuteNonQuery()
Response.Write("You have Unsubscribed Successfully!")
Else
Response.Write("You have already Unsubscribed!")
End If
con.Close()
tblSubscribe.Visible = False
End Using
End Using
End If
End Sub
<System.Web.Services.WebMethod()> _
Public Shared Function SendMail(emailId As String) As String
Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
Using con As New SqlConnection(constr)
Dim query As String = "Subscribe_NewsLetter"
Using cmd As New SqlCommand(query, con)
cmd.Parameters.AddWithValue("@email", emailId)
cmd.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output
cmd.CommandType = System.Data.CommandType.StoredProcedure
con.Open()
cmd.ExecuteNonQuery()
Dim subscribeId As String = cmd.Parameters("@id").Value.ToString()
con.Close()
If Not String.IsNullOrEmpty(subscribeId) Then
If subscribeId = "0" Then
Return "You have already Subscribed"
End If
End If
subscribeId = Encrypt(subscribeId)
' Your send mail code comes here and pass text and html file.
' and unsubscribing link with querystring encrypted so that no one can tamper with link.
Dim urlWithUnsubscribe As String = HttpContext.Current.Request.Url.ToString().Substring(0, HttpContext.Current.Request.Url.ToString().LastIndexOf("/"c))
urlWithUnsubscribe += Convert.ToString("?unsubscribe=") & subscribeId
Return urlWithUnsubscribe
End Using
End Using
End Function
Private Shared Function Decrypt(cipherText As String) As String
Dim EncryptionKey As String = "MAKV2SPBNI99212"
cipherText = cipherText.Replace(" ", "+")
Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText)
Using encryptor As Aes = Aes.Create()
Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _
&H65, &H64, &H76, &H65, &H64, &H65, _
&H76})
encryptor.Key = pdb.GetBytes(32)
encryptor.IV = pdb.GetBytes(16)
Using ms As New MemoryStream()
Using cs As New CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)
cs.Write(cipherBytes, 0, cipherBytes.Length)
cs.Close()
End Using
cipherText = Encoding.Unicode.GetString(ms.ToArray())
End Using
End Using
Return cipherText
End Function
Private Shared Function Encrypt(clearText As String) As String
Dim EncryptionKey As String = "MAKV2SPBNI99212"
Dim clearBytes As Byte() = Encoding.Unicode.GetBytes(clearText)
Using encryptor As Aes = Aes.Create()
Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _
&H65, &H64, &H76, &H65, &H64, &H65, _
&H76})
encryptor.Key = pdb.GetBytes(32)
encryptor.IV = pdb.GetBytes(16)
Using ms As New MemoryStream()
Using cs As New CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)
cs.Write(clearBytes, 0, clearBytes.Length)
cs.Close()
End Using
clearText = Convert.ToBase64String(ms.ToArray())
End Using
End Using
Return clearText
End Function
ScreenShot