我正在为学校项目开发一个邮件客户端.我已经设法使用SmtpClient
C#发送电子邮件.这适用于任何服务器,但它不适用于Gmail.我相信这是因为谷歌使用TLS.我曾尝试设置EnableSsl
到true
上SmtpClient
,但这并不有所作为.
这是我用来创建SmtpClient
和发送电子邮件的代码.
this.client = new SmtpClient("smtp.gmail.com", 587);
this.client.EnableSsl = true;
this.client.UseDefaultCredentials = false;
this.client.Credentials = new NetworkCredential("username", "password");
try
{
// Create instance of message
MailMessage message = new MailMessage();
// Add receiver
message.To.Add("myemail@mydomain.com");
// Set sender
// In this case the same as the username
message.From = new MailAddress("username@gmail.com");
// Set subject
message.Subject = "Test";
// Set body of message
message.Body = "En test besked";
// Send the message …
Run Code Online (Sandbox Code Playgroud) 如果点出现在MIME编码行的开头(例如test.com有时显示为test..com),.NET的SmtpClient似乎正在创建主机名中带有额外点的电子邮件.示例代码:
[TestMethod]
public void TestEmailIssue()
{
var mail = new System.Net.Mail.MailMessage();
var smtpClient = new System.Net.Mail.SmtpClient();
mail.To.Add("Test@test.com");
mail.Subject = "Test";
mail.From = new System.Net.Mail.MailAddress("test@test.com");
mail.Body = "Hello this is a short test of the issue:"
+" <a href='https://test.com/'>https://test.com/</a>: ";
smtpClient.PickupDirectoryLocation = "C:\\temp\\";
smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
smtpClient.Send(mail);
}
Run Code Online (Sandbox Code Playgroud)
这会创建一个如下所示的.eml文件:
X-Sender:test@test.com
X-Receiver:Test@test.com
MIME版本:1.0
来自:test@test.com
致:Test@test.com
日期:2011年7月6日15:55:28 -0400
主题:测试
内容类型:text/plain; 字符集= US-ASCII
Content-Transfer-Encoding:quoted-printable
您好,这是对该问题的简短测试:https:// test =
..com /'> https://test.com/:= 20
当发送文件,或开口在Outlook(或任何其他程序),双点显示(即test..com).请注意,如果我删除了额外的空格(在"是"中),则test.com会正确显示,因为该点不再出现在行的开头.
这在尝试发送网站地址时会出现问题,我们会收到来自客户的电话,说他们无法点击我们的链接.
还有其他人经历过这个吗?除了编写自己的编码之外,我们如何解决这个问题呢?
我最近将我的.net框架从3.5升级到4.0后出现问题:
System.Net.Mail.SmtpException:发送邮件失败.---> System.IndexOutOfRangeException:索引超出了数组的范围.在System.Net.Base64Stream.EncodeBytes(Byte [] buffer,Int32 offset,Int32 count,Boolean dontDeferFinalBytes,Boolean shouldAppendSpaceToCRLF)System.Net.Base64Stream.Write(Byte [] buffer,Int32 offset,Int32 count)at System.Net System.Net.Mail.SmtpClient上的System.Net.Mail.Message.Send(BaseWriter writer,Boolean sendEnvelope)上的System.Net.Mime.MimeMultiPart.Send(BaseWriter writer)中的.Mime.MimePart.Send(BaseWriter writer).发送(MailMessage消息)---内部异常堆栈跟踪结束---
我在这里阅读了这个连接错误列表:http://connect.microsoft.com/VisualStudio/feedback/details/544562/cannot-send-e-mails-with-large-attachments-system-net-mail-smtpclient-system- net-mail-mailmessage.
如果有人关心这个问题,请在Connect上投票,所以它会尽快修复.
有没有办法从web.config设置EnableSSL?
我可以在代码中设置此属性,但这对于简单邮件Web事件和使用默认Smtp服务器的其他类不起作用.有任何想法吗?
我已经为Asp.Net Identity 2.0实现了一个简单的EmailService(通过IIdentityMessageService
界面.
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// convert IdentityMessage to a MailMessage
var email =
new MailMessage(new MailAddress("noreply@mydomain.com", "(do not reply)"),
new MailAddress(message.Destination))
{
Subject = message.Subject,
Body = message.Body,
IsBodyHtml = true
};
using (var client = new SmtpClient()) // SmtpClient configuration comes from config file
{
return client.SendMailAsync(email);
}
}
}
Run Code Online (Sandbox Code Playgroud)
要发送电子邮件,我将通过UserManager:
await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl …
我有一个发送简单电子邮件的动作:
[HttpPost, ActionName("Index")]
public ActionResult IndexPost(ContactForm contactForm)
{
if (ModelState.IsValid)
{
new EmailService().SendAsync(contactForm.Email, contactForm.Name, contactForm.Subject, contactForm.Body, true);
return RedirectToAction(MVC.Contact.Success());
}
return View(contactForm);
}
Run Code Online (Sandbox Code Playgroud)
和电子邮件服务:
public void SendAsync(string fromEmail, string fromName, string subject, string body, bool isBodyHtml)
{
MailMessage mailMessage....
....
SmtpClient client = new SmtpClient(settingRepository.SmtpAddress, settingRepository.SmtpPort);
client.EnableSsl = settingRepository.SmtpSsl;
client.Credentials = new NetworkCredential(settingRepository.SmtpUserName, settingRepository.SmtpPassword);
client.SendCompleted += client_SendCompleted;
client.SendAsync(mailMessage, Tuple.Create(client, mailMessage));
}
private void client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
Tuple<SmtpClient, MailMessage> data = (Tuple<SmtpClient, MailMessage>)e.UserState;
data.Item1.Dispose();
data.Item2.Dispose();
if (e.Error != null) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用SmtpClient在.NET中编写通知服务(用于完全合法的非垃圾邮件目的).最初我只是通过每个消息循环并发送它,但这很慢,我想提高速度.所以,我切换到使用'SendAsync',但现在第二次调用时出现以下错误:
An asynchronous call is already in progress.
Run Code Online (Sandbox Code Playgroud)
我读到这意味着MS瘫痪System.Net.Mail以防止群发邮件.它是否正确?如果是这样,有没有更好的方法在.NET中执行此操作,并且仍然能够记录每封电子邮件的结果(这对我们的客户来说很重要).如果没有,为什么SendAsync只能被调用一次?
在Visual Studio 2008中使用C#.NET中的电子邮件发送时,我收到以下错误
连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应74.125.53.108:25
但是相同的代码在其他一些PC上工作得很好,但是当我今天测试时它给了我Send()
方法错误...我的网络连接也很好,我正在测试电子邮件代码..
以下是我的电子邮件代码
MailMessage mail = new MailMessage();
mail.To.Add(to);
mail.From = new MailAddress(from);
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Credentials = new System.Net.NetworkCredential("MyUserName@gmail.com",
"MyPassword");
smtp.EnableSsl = true;
smtp.Send(mail);
Run Code Online (Sandbox Code Playgroud)
可能是这种错误的原因.. ???
这与我前几天询问如何发送电子邮件的问题有关.
我的新相关问题就是这个...如果我的应用程序的用户是在防火墙后面或者为什么行client.Send(mail)将无法工作...
线后:
SmtpClient client = new SmtpClient("mysmtpserver.com", myportID);
client.Credentials = new System.Net.NetworkCredential("myusername.com", "mypassword");
Run Code Online (Sandbox Code Playgroud)
在尝试发送之前,我可以做些什么来测试客户端?
我想把它放在try/catch循环中,但我宁愿做一个测试,然后弹出一个对话框说:无法访问smtp或类似的东西.
(我假设我和我的应用程序用户都没有能力调整他们的防火墙设置.例如......他们在工作时安装应用程序并且无法控制他们的互联网工作)
-Adeena
我无法使用smtp客户端发送邮件.这是代码:
SmtpClient client=new SmtpClient("Host");
client.Credentials=new NetworkCredential("username", "password");
MailMessage mailMessage = new MailMessage();
mailMessage.from="sender@gmail.com";
mailMessage.To.Add("recipient@gmail.com");
mailMessage.body="body";
mailMessage.subject="subject";
client.Send(mailMessage);
Run Code Online (Sandbox Code Playgroud)
问题是,当我在ASP.NET应用程序中使用此代码时,我不会收到任何邮件.在asp.net中,我将从邮件地址更改为NetworkCredential中给出的用户名,我收到邮件.
但是在C#windows应用程序中,即使发件人的电子邮件地址无效,我也可以收到电子邮件.
smtpclient ×10
c# ×7
.net ×4
email ×4
asp.net ×2
gmail ×2
.net-4.0 ×1
mono ×1
monodevelop ×1
smtp ×1
web-config ×1