I have a code for sending emails:
public static bool SendEmail(
string fromEmail, string toEmail,
string subject, string body,
bool isBodyHtml = false, bool isThrowException = false)
{
var message = new MailMessage(fromEmail, toEmail)
{
IsBodyHtml = isBodyHtml,
Subject = subject,
Body = body,
};
using (var client = new SmtpClient())
{
try
{
client.Send(message);
}
catch (Exception ex)
{
if (isThrowException)
{
throw new Exception(ex.ToString());
}
}
}
return true;
}
In web.config I have:
<system.net>
<mailSettings>
<smtp>
<network host="smtp.bizmail.yahoo.com" port="25" enableSsl="true" userName=helpdesk#global.com" password="#cr123" defaultCredentials="true"/>
</smtp>
</mailSettings>
</system.net>
</configuration>
Now I don't have any exception, still mail is not receiving at the other end.
I am able to login to yahoo.com by my credentials.
still
client->credentils->domain=""
client->ServicePoint = 'client.ServicePoint' threw an exception of type 'System.TypeInitializationException'
What's gone wrong with it?
The code was working well... before 1 month, I didn't change a single line, what's gone wrong?
Add connection properties and credentials to your code:
NetworkCredentials Credencials = new NetworkCredential(SmtpUsername, SmtpPassword);
client.Host = SmtpHost;
client.Port = SmtpPort;
client.Credentials = Credencials;
First up all thanks to all who tried to help you.
As in the Question i mentioned there is an error while creating a new object of smtp.
smtp will read the web.config and create an object with respect to web.config.
So i came to know that the problem is with web.config .I was also sure that there is nothing wrong with the C# code. so i analysed the web.config and found some filter.
<filter level="TraceEventType.Error" />
basically i used this for removing error message for azure version.
which is causing problem for Serverpoint while creating an object of smtp.
So I just removed the line. and it worked fine.
I got to know not only smtp tag, other tags in web.config file will also effect the current problem.
Related
I have searched all over and I'm not coming up with any solutions to my problem.
I've got an Email service setup with a method SendEmail which looks like this:
public void SendEmail(List<string> message, recipientEmail)
{
MailMessage mailMessage = new MailMessage();
mailMessage.To.Add(recipientEmail);
mailMessage.Subject("My subject");
mailMessage.IsBodyHtml = true;
mailMessage.Body = message;
var address = 123.0.0.0;
var port = 1;
using (var client = new SmtpClient(address))
{
client.Port = port;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UserDefaultCredentials = false;
client.EnableSsl = false;
client.Send(mailMessage);
}
}
When I run my code I am getting this error:
Mailbox unavailable. The server response was: Sender email address
rejected
Which is totally true, my sender is null in the mailMessage.
However, in my Web.config I am doing this:
<system.net>
<mailSettings>
<smtp from="myEmail#mailinator.com">
</smtp>
</mailSettings>
</system.net>
Which I thought should just work.
So I tried adding mailMessage.Sender = new MailAddress("myEmail#mailinator.com")
And voila, it works, but I'm baffled how my other application still works without that.
I'm doing (as far as I can tell) the exact same thing in another application for a batch process I wrote and it works perfectly fine there. When I try using all of the identical settings to that batch process in my new application I get this error. I did write the batch process 6+ months ago so perhaps I have some magic sauce going on somewhere in there, or I'm just missing something obvious here.
I am sending email using c#:
protected void SendEmailToVisitor(string Name, string Email, string Contact, string Message, string Subject)
{
string myEmail = ConfigurationManager.AppSettings["Email"];
MailMessage objMail = new MailMessage();
objMail.From = new MailAddress(myEmail);
objMail.Subject = "Chanderraj.com";
objMail.To.Add(Email);
objMail.IsBodyHtml = true;
StringBuilder emailMessage = new StringBuilder();
emailMessage.Append("<h2>Hi, "+Name+",</h2> <br/>");
emailMessage.Append("Thank you for writing us. <br/><br/><br/>");
emailMessage.Append("Best wishes from http://www.chanderraj.com");
objMail.Body = emailMessage.ToString();
SmtpClient objSmtpClient = new SmtpClient();
objSmtpClient.UseDefaultCredentials = false;
// objSmtpClient.EnableSsl = true;
objSmtpClient.Send(objMail);
this.Reset();
lblSent.Text = Name + ", your message sent.";
}
<system.net>
<mailSettings >
<smtp>
<network host="smtp.gmail.com" userName="chanderraj1989#gmail.com" enableSsl="true" password="xxxxxxxxxx" port="587" />
</smtp>
</mailSettings>
If i add enableSsl in config it shows configuration error before page loads:
Unrecognized attribute 'enableSsl'.
may be this is due to older version of .NET on server.
So, i removed enablSsl from config and put it in code then it shows:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.
Yes, it is true that for .NET 3 and earlier you can not use enableSSL property in config file.
For your problem you can add line,
SmtpClient objSmtpClient = new SmtpClient();
objSmtpClient.EnableSsl = true; // Add this line of code. Hope this works
Also add this line in your config file,
<smtp deliveryMethod="Network" from="test#gmail.com">
For .NET 4: yes, You can use add the enableSSL tag in config section.
Not absolute solution but it worked.
As i have a domain chanderraj.com and a domain has option of creating emails like info#chanderraj.com. So i have created one and specified in my config file in place of Gmail id and password(shown in question).
Edit: I'm able to send mail without attachment
Getting this error while trying to send mail:
System.Net.Mail.SmtpException: The operation has timed out.
Following is my code:
public static void SendMailMessage(string to, string subject, string body, List<string> attachment)
{
MailMessage mMailMessage = new MailMessage();
// string body; --> Compile time error, body is already defined as an argument
mMailMessage.From = new MailAddress("abc#gmail.com");
mMailMessage.To.Add(new MailAddress(to));
mMailMessage.Subject = subject;
mMailMessage.Body = body;
foreach (string s in attachment)
{
var att = new Attachment(s);
mMailMessage.Attachments.Add(att);
}
// Set the format of the mail message body as HTML
mMailMessage.IsBodyHtml = true;
// Set the priority of the mail message to normal
mMailMessage.Priority = MailPriority.High;
using (SmtpClient mSmtpClient = new SmtpClient())
{
mSmtpClient.Send(mMailMessage);
}
}
Web Config
<system.net>
<mailSettings>
<smtp from="mailid">
<network host="smtp.gmail.com" port="587" enableSsl="true" userName="username" password="pass" />
</smtp>
</mailSettings>
Note : Attachments not exceeding its limit(below than 25 mb)
What can I do to solve this problem, or what am I missing?
So basically we discovered during the chat that the problem occurs
because the upload of the attachments takes to long.
One way to solve it is to increase the timeout value of the SmtpClient:
mSmtpClient.Timeout = int.MaxValue;
Note: Use int.MaxValue for testing but use a more realistic value for the deployed solution.
Setup a local smtp server to relay through, or use something like http://aws.amazon.com/ses/. I don't think google is going to allow you to programtically relay through their servers.
I am having an error that is occurring sporadically. When I encounter this error, if I try again, the e-mail will send. I cannot reliably reproduce the error, but it is hapening frequently enough to be a problem.
System.Net.Mail.SmtpException : Service not available, closing transmission channel. The server response was: [Servername]: SMTP command timeout - closing connection
Stack Trace:
at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response) at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception) at System.Net.Mail.SmtpClient.Send(MailMessage message)
Here's the code in question. It uses an HTML template (database driven with a web url default backup) to inject values and create an html e-mail.
public void AccountActivationEmail(Common.Request.Email.AccountActivation request)
{
var profile = profileRepository.GetOne(new ProfileByUsername(request.Username, request.SiteId));
var options = siteService.GetOptions(new GatewayOptionsRequest()
{
SiteId = request.SiteId
});
var site = options.Site;
ExpiringHMAC hmac = new ExpiringHMAC(request.ExpireOn, new string[] { request.AccountId.ToString(), request.AccountKey.ToString(), request.Username });
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("{{logourl}}", String.IsNullOrEmpty(options.FullyHostedGateway.LogoUrl) ? UrlHelper.ConvertRelativeToAbsolute("/content/images/spacer.png") : options.FullyHostedGateway.LogoUrl);
data.Add("{{name}}", profile.Name.DisplayName);
data.Add("{{sitename}}", site.Name.DisplayName);
data.Add("{{activationlink}}", String.Format(ActivationUrlFormat, options.UrlFriendlyName, Encryption.EncryptQueryString(request.Username), hmac.ToString()));
MailDefinition template = new MailDefinition();
MailMessage message = null;
var emailTemplate = options.GetEmailTemplate(EmailTemplateType.ActivateAccount);
string defaultSubject = "Activate Account";
bool hasTemplate = false;
if (emailTemplate != null)
{
hasTemplate = !String.IsNullOrEmpty(emailTemplate.Template);
}
if (!hasTemplate)
{
template.BodyFileName = activationDefaultTemplateUrl;
message = template.CreateMailMessage(request.EmailAddress, data, new System.Web.UI.LiteralControl());
message.IsBodyHtml = true;
message.Subject = defaultSubject;
}
else
{
message = template.CreateMailMessage(request.EmailAddress, data, emailTemplate.Template, new System.Web.UI.LiteralControl());
message.IsBodyHtml = emailTemplate.IsHtml;
if (!String.IsNullOrEmpty(emailTemplate.Subject))
message.Subject = emailTemplate.Subject;
else
message.Subject = defaultSubject;
}
if (options.ContactDetails != null)
{
if (!String.IsNullOrEmpty(options.ContactDetails.EmailAddress))
message.From = new MailAddress(options.ContactDetails.EmailAddress);
}
SmtpClient client = new SmtpClient();
client.Send(message);
}
This code is part of a class that is generated as a singleton using Structuremap. I thought maybe that might be causing the issue, but every time the method is called, a new SmtpClient object is created, which should eliminate the problems I have seen about using the same connection to send multiple e-mails.
We have nothing blocking or restricting the connection, which is the official stance our e-mail hosting is taking on this issue. I want to see if there's any way to do this better so I don't get these errors.
EDIT:
I do have my mail server defined in my web.config. I have confirmed with my e-mail hosting that my settings are correct.
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="no-reply#mydomain.com">
<network host="smtp.emailhost.com" userName="someaddress#mydomain.com"
password="myPassword1" port="2500" />
</smtp>
</mailSettings>
</system.net>
Are you disposing of the Smtp Client object after sending? From http://connect.microsoft.com/VisualStudio/feedback/details/337557/smtpclient-does-not-close-session-after-sending-message it would appear that "...even if you are creating a new instance of the SmtpClient every time, it still uses the same unerlying session."
So perhaps
using (SmtpClient client = new SmtpClient())
{
client.Send(message);
}
I've written several programs that send email from C#. This works great in winXP, but I find it breaks in Win7. My understanding is that even though the SMTP server I'm referencing is on another computer, the sending computer needs to have the SMTP service installed (and win7 does not).
I know its possible to install a third party SMTP server, but then I'd need to do that on every computer running my programs. Instead, I'd like to include a temporary SMTP server in my project that I can use entirely from code to do the same job. Does anyone know of a library (or sample code) on how I can include a temporary SMTP server in my project?
Here is my code:
public static void sendEmail(String[] recipients, String sender, String subject, String body, String[] attachments)
{
MailMessage message;
try
{
message = new MailMessage(sender, recipients[0]);
}
catch (Exception)
{
return;
}
foreach (String s in recipients)
{
if (!message.To.Contains(new MailAddress(s)))
message.To.Add(s);
}
message.From = new MailAddress(sender);
message.Subject = subject;
message.Body = body;
message.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient("PRIVATE.PRIVATE.PRIVATE", 25);
smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
//smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = true;
if (attachments.Length > 0)
{
foreach (String a in attachments)
{
message.Attachments.Add(new Attachment(a));
}
}
try
{
smtp.SendAsync(message, null);
To send emails from c#, you do not need a local SMTP service. You just need the System.Net.Mail library. Using a remote SMTP server (possibly one with valid PTR settings and not one in your network to avoid being regarded as a spammer) should definitely suffice.
It may be a credentials issue. Change SendAsync to Send to see if you are getting any exceptions. Or add a handler for the Async invocation
smtp.SendCompleted += delegate(object s, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
System.Diagnostics.Trace.TraceError(e.Error.ToString());
}
};
Following changes to your code works for me in Win7
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
//smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(GoogleUserEmail, GooglePassword);
smtp.EnableSsl = true;
// smtp.UseDefaultCredentials = true;
if (attachments != null && attachments.Length > 0)
{
foreach (String a in attachments)
{
message.Attachments.Add(new Attachment(a));
}
}
try
{
smtp.Send(message);
}
I have never found an embeddable SMTP server, but both of these are close and you could probably modify them to fit your needs.
http://www.codeproject.com/KB/IP/smtppop3mailserver.aspx
http://www.ericdaugherty.com/dev/cses/developers.html
I'm going to keep looking because this is also something I'd find useful. I'll post more if I find any.
If you just use an unconfigured service to send your emails you will definitely end up in the SPAM folder due to reverse DNS and SPF checks failing. So you'll want to configure your server properly. Alternatively you can use a 3rd party service like Elastic Email. Here is Elastic Email's sample code which uses HTTP to send the mail:
public static string SendEmail(string to, string subject, string bodyText, string bodyHtml, string from, string fromName)
{
WebClient client = new WebClient();
NameValueCollection values = new NameValueCollection();
values.Add("username", USERNAME);
values.Add("api_key", API_KEY);
values.Add("from", from);
values.Add("from_name", fromName);
values.Add("subject", subject);
if (bodyHtml != null)
values.Add("body_html", bodyHtml);
if (bodyText != null)
values.Add("body_text", bodyText);
values.Add("to", to);
byte[] response = client.UploadValues("https://api.elasticemail.com/mailer/send", values);
return Encoding.UTF8.GetString(response);
}
Have you tried specifying SMTP settings in an App.config file? Something like:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<specifiedPickupDirectory pickupDirectoryLocation="C:\tmp"/>
<network host="smtp.example.com"/>
</smtp>
</mailSettings>
</system.net>
</configuration>
If you change deliveryMethod="SpecifiedPickupDirectory" then it'll just write a file representing the email that would be sent to the directory you specify.