asp.net mvc send multiple email with different subject and body asynchronously - asp.net-mvc

Folks,
I wanted to send a few emails with different subject and body asynchronously. here is my code
Email.cs
public string To;
public string CC;
public string Subject;
public string Host;
public string Port;
public string Body;
public MailMessage mail;
public SmtpClient smtp;
public void send()
{
smtp = new SmtpClient();
mail = new MailMessage();
mail.To.Add(To);
if (this.CC !="" && this.CC !=null) mail.CC.Add(CC);
mail.CC.Add(CCIDBizzMail);
mail.Subject = this.Subject;
mail.From = new MailAddress(From);
mail.IsBodyHtml = true;
smtp.Host = this.SMTPAddress;
mail.Body = this.Body;
smtp.Credentials = new System.Net.NetworkCredential
(this.From, this.Password);
smtp.EnableSsl = false;
smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
smtp.SendAsync(mail, null);
}
private void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
String token = (string)e.UserState;
if (e.Cancelled)
{
}
if (e.Error != null)
{
}
else
{
mail.Dispose();
smtp.Dispose();
}
}
here is my code to send an email:
Email objEmail = new Email();
objEmail.Subject = "Thank You for Your Order!";
objEmail.Body = "first email";
objEmail.To: "ssss#mail.com"
objEmail.Send();
objEmail.Subject = "Thank You for Your Order!";
objEmail.Body = "second email";
objEmail.To: "tttt#mail.com"
objEmail.Send();
However, tttt#mail.com never received an email. my website always send to ssss#mail.com
can you help me to solve this issue?

Here you try to send an email with Asynchronous type with out making a new object Email.
I suggest to try two thinks.
Make new on every email send
{
Email objEmail = new Email();
objEmail.Subject = "Thank You for Your Order!";
objEmail.Body = "first email";
objEmail.To: "ssss#mail.com"
objEmail.Send();
}
{
Email objEmail = new Email();
objEmail.Subject = "Thank You for Your Order!";
objEmail.Body = "second email";
objEmail.To: "tttt#mail.com"
objEmail.Send();
}
Or change the Email routine to
public string To;
public string CC;
public string Subject;
public string Host;
public string Port;
public string Body;
public void send()
{
using(var smtp = new SmtpClient())
{
using(mail = new MailMessage())
{
mail.To.Add(To);
if (this.CC !="" && this.CC !=null) mail.CC.Add(CC);
mail.CC.Add(CCIDBizzMail);
mail.Subject = this.Subject;
mail.From = new MailAddress(From);
mail.IsBodyHtml = true;
smtp.Host = this.SMTPAddress;
mail.Body = this.Body;
smtp.Credentials = new System.Net.NetworkCredential
(this.From, this.Password);
smtp.EnableSsl = false;
// maybe here you place extra code for the errors
// http://msdn.microsoft.com/en-us/library/swas0fwc.aspx
smtp.Send(mail);
}
}
}
If the email is send using localhost and if you like to send many emails, is better to send them right way and not asynchronous.

Related

.net mvc SendAsync - How to find error logs if a message can't be sent?

I have the following class to send emails.
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
if (message != null)
{
MailMessage mail = new MailMessage();
mail.To.Add(message.Destination);
mail.From = new MailAddress("test#test.com");
mail.Subject = message.Subject;
string Body = message.Body;
mail.Body = Body;
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.test.com";
smtp.Port = 587;
smtp.UseDefaultCredentials = false;
//
smtp.Credentials = new System.Net.NetworkCredential("username", "pass");
smtp.EnableSsl = true;
return smtp.SendMailAsync(mail);
}
return Task.FromResult(0);
}
}
Our IT informed us that he open the port 587 on the firewall. However, the emails can't be sent.
In C:\inetpub\logs\LogFiles\W3SVC2 logs I have the following messages without getting an error.
2021-02-08 12:02:13 192.168.1.2 GET /signalr/connect transport=serverSentEvents&clientProtocol=1.5&connectionToken=1%2FM7LMZNVeWfN1mD1D9geTBdC7vVjo6nQRtD%2BrQv%2BVwUUdC6eE6jbKaIq2CUlrUsaylRVyJgz6fFqoQDsxJ9%2F77L8kizNCyZYkAs5nxK2T6Crz4xlKu9lAS1z9%2FHDen84sd7IVBASCnCm46jfQlrdg%3D%3D&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=0 81 test#gmail.com 192.168.1.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/88.0.4324.146+Safari/537.36 http://192.168.1.2:81/Account/ReSendEmailConfirmationTokenAsync?userID=51abfa03-6d09-40bb-8e4c-89117515ff&subject=Confirm%20your%20account 200 0 0 494899
Can you please help me?

how to include cc copy in email notification

How am I include the sender/creator in email notification in my project?
This code is working fine and it notifies all the persons tagged in Assigned To textfield. And now how can I include in CC copy the person who created the report?.
The string created_by is the employee number of the person who created the report and the ad_users table is where all the employee number and email addresses can be found. How can I get the email address of the person who created the report?
public void SendEmail(Guid[] UsersID,
string ir_no,
string place,
int? hn,
int? age,
string gender,
string persons_involved,
string incidentName,
string narrative_report,
DateTime? created_date,
string created_by,
Guid IRID)
{
var Host = ConfigurationManager.AppSettings["SmtpClient"].ToString();
var password = ConfigurationManager.AppSettings["SmtpPassword"].ToString();
var FromEmailID = ConfigurationManager.AppSettings["FromMail"].ToString();
var port = ConfigurationManager.AppSettings["Port"].ToString();
var username = ConfigurationManager.AppSettings["Username"].ToString();
var incident_name = (from i in db.All_Issues
select i.Incident_Patient_Name);
//Users already Activated the accounts
MailMessage mail = new MailMessage();
mail.From = new MailAddress(FromEmailID);
//MailAddress copy = new MailAddress(irCreatorEmail);
//mail.CC.Add(copy);
mail.Subject = "Sample Email";
mail.IsBodyHtml = true;
mail.BodyEncoding = System.Text.Encoding.GetEncoding("utf-8");
//Users not yet Activated
MailMessage mail2 = new MailMessage();
mail2.From = new MailAddress(FromEmailID);
//MailAddress copy2 = new MailAddress(irCreatorEmail);
//mail2.CC.Add(copy2);
mail2.Subject = "Sample Email";
mail2.IsBodyHtml = true;
mail2.BodyEncoding = System.Text.Encoding.GetEncoding("utf-8");
SmtpClient smtpclient = new SmtpClient();
smtpclient.Host = Host;
smtpclient.Port = Convert.ToInt32(port);
smtpclient.Credentials = new System.Net.NetworkCredential(username, password);
smtpclient.EnableSsl = true;
List<ad_users> users = db.ad_users.ToList();
if (UsersID != null)
{
foreach (var Users in UsersID)
{
foreach (var usersList in users)
{
if (Users == usersList.user_id)
{
var adUsersList = db.ad_users.Find(Users);
var emp = adUsersList.employee_nr;
if (emp != null)
{
mail.Body = EmailMessage(ir_no,
place,
hn,
age,
gender,
persons_involved,
incidentName,
narrative_report,
created_date,
created_by,
IRID);
mail.To.Add(usersList.email_address);
}
else
{
mail2.Body = EmailMessageNotActivated(ir_no,
place,
hn,
age,
gender,
persons_involved,
incidentName,
narrative_report,
created_date,
created_by,
IRID);
mail2.To.Add(usersList.email_address);
}
}
}
}
try
{
smtpclient.Send(mail);
smtpclient.Send(mail2);
}
catch (InvalidOperationException /*ex*/)
{
//ModelState.AddModelError("", ex);
}
}
}
Thank you in advance.
Already found the solution in this problem. Just took a long time for posting here for update.
I found the answer by using a Helper wherein, I can get the email of the creator.
public static string GetEmailOfIRCreator(this string empNo)
{
IREntities dbIMR = new IREntities();
var email = dbIMR.ad_users.Where(a => a.employee_nr == empNo).Select(a => a.email_address).FirstOrDefault();
return email;
}
Then I use this helper in my class on sending email notification.
var irCreator = created_by_emp_nr.GetEmailOfIRCreator();
if (mail.To.Count > 0)
{
if (irCreator != null)
{
mail.CC.Add(new MailAddress(irCreator));
}
client.Send(mail);
}
And that's it. I already send an email notification to creator as cc copy.
Hoping this can also help someone.

Feedback Form to receive an email in Mvc

Actually in my application i have a feedback form to get the complaints through email. So how can i achieve to get an email from each users to some particular email ("abed#gmail.com").
Usually, i use user account credentials to send email to others.
Code to send email
public ActionResult SendEmail(string SentTo, string Text)
{
MailMessage msg = new MailMessage();
msg.From = new MailAddress("senderemail");
msg.To.Add(SentTo);
msg.Subject = "Password";
msg.Body = Text;
msg.Priority = MailPriority.High;
msg.IsBodyHtml = true;
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.UseDefaultCredentials = false;
//client.EnableSsl = false;
client.Credentials = new NetworkCredential("emailaddress", "password");
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
bool result = false;
try
{
client.Send(msg);
}
catch (Exception)
{
result = false;
}
return View();
}
But how can i receive an email from contact form?
Looking for some help to get the solution for my issue. Any help appreciated. Thanks in advance !!!

Error while sending email using SMTP & exchange server office365.com

I am trying to send email from my controller (MVC4) through exchange server i.e. (outlook.office365.com as I can see it from my outlook settings) using SMTP but could not succeed. I tried solution from many previous posts but cant get any clue. I sincerely appreciate any help from you guys..
Here is my mail configuration:
<system.net>
<mailSettings>
<smtp>
<network host="smtp.office365.com" userName="no-reply#mydomain.com" password="defaultPassword"/>
</smtp>
</mailSettings>
</system.net>
Here is my class for email:
public class eMail
{
public eMail() { }
private string Sender{ get; set; }
private List<string> Recipients { get; set; }
private string Subject { get; set; }
private string Body { get; set; }
public bool SendEmail()
{
try
{
var smptClient = new SmtpClient { EnableSsl = true };
MailMessage newEmail = new MailMessage();
foreach (var reciepent in this.Recipients )
newEmail.To.Add(new MailAddress(recipient));
newEmail.From = new MailAddress(this.Sender);
newEmail.Subject = this.Subject;
newEmail.Body = this.Body;
newEmail.IsBodyHtml = false;
smptClient.Send(newEmail);
return true;
}
catch { return false; }
}
}
in above code if I use "EnableSsl = true", I get error "Server does not support secure connections.". Still if I disable ssl, I get following error:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM
use this piece of code:
MailMessage msg = new MailMessage();
msg.To.Add(new MailAddress("someone#somedomain.com", "SomeOne"));
msg.From = new MailAddress("you#yourdomain.com", "You");
msg.Subject = "This is a Test Mail";
msg.Body = "This is a test message using Exchange OnLine";
msg.IsBodyHtml = true;
SmtpClient client = new SmtpClient();
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("your user name", "your password");
client.Port = 25; // give 587 if 25 is blocked
client.Host = "smtp.office365.com";
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
try
{
client.Send(msg);
lblText.Text = "Message Sent Succesfully";
}
catch (Exception ex)
{
lblText.Text = ex.ToString();
}
Finally I'd resolve the issue which was related to domain we have.
For the person who are facing similar problem, here is how I had fixed it. Follwoing were my email settings:
<network host="smtp.office365.com" userName="no-reply#mydomain.com" password="defaultPassword"/>
If you are on domain then your username must have domain mentioned in your username i.e. no-reply#domain.mydomain.com and bang :)
Cheers!!

ASP.Net MVC File Upload and Attach to Email

I'm developing an ASP.Net MVC 3 web application. One of my Razor Views allows a user to upload a file (selected from their computer) and then this is attached to an outgoing email.
Below is my code to date, but unfortunately it does not work. By this I mean the email (and of course the attachment) never gets sent. Although, when I step threw/ debug my code locally no errors occur, and none as well on the live server.
Does anyone see what I'm missing? Any advice would be greatly appreciated.
Thanks.
Controller
[HttpPost]
public ActionResult CvUpload(HttpPostedFileBase file)
{
//Get logged in user
User user = _accountService.GetUser(_formsAuthService.GetLoggedInUserID());
if (file != null && file.ContentLength > 0)
{
_emailService.SendUpload(user, file);
return RedirectToAction("CvUpload", new { feedBack = "Success" });
}
return RedirectToAction("CvUpload", new { feedBack = "Failed" });
}
Email Service
public void SendUpload(User user, HttpPostedFileBase file)
{
string messageBody = "";
string subject = "Upload";
string[] toAddress = new string[1];
string ToBCC = "";
if (isProduction.Equals("true"))
{
toAddress[0] = "myemail#test.com";
sendEmail(toAddress, ToBCC, adminFromEmail, adminFromEmail, subject, messageBody, true, emailServer, file);
}
else
{
// DO NOT SEND EMAIL
}
}
private bool sendEmail(string[] toAddresses, string ToBCC, string fromAddress, string replyto, string subject, string body, bool ishtml, string emailHost, HttpPostedFileBase file)
{
bool mailSent = false;
try
{
MailMessage mail = new MailMessage();
foreach (string addresss in toAddresses)
mail.To.Add(addresss);
mail.From = new MailAddress(fromAddress);
mail.ReplyToList.Add(replyto);
mail.Bcc.Add(ToBCC);
mail.Subject = subject;
mail.Body = body;
if(file != null && file.ContentLength > 0)
{
string fileName = Path.GetFileName(file.FileName);
mail.Attachments.Add(new Attachment(file.InputStream, fileName));
}
if (ishtml)
mail.IsBodyHtml = true;
else
mail.IsBodyHtml = false;
SmtpClient smtp = new SmtpClient();
smtp.Host = emailHost;
smtp.Send(mail);
mailSent = true;
}
catch (Exception)
{
mailSent = false;
}
return mailSent;
}
I have a similar service and this is what I have although the attachments are saved so they can be reused later.
var attachment = new Attachment(path);
ContentDisposition disposition = attachment.ContentDisposition;
disposition.CreationDate = File.GetCreationTime(path);
disposition.ModificationDate = File.GetLastWriteTime(path);
disposition.ReadDate = File.GetLastAccessTime(path);
disposition.FileName = attachmentName.Name;
disposition.Size = new FileInfo(path).Length;
disposition.DispositionType = DispositionTypeNames.Attachment;
mailMessage.Attachments.Add(attachment);

Resources