• .NET Conf China
...

Asp.net通过smtp发送邮件突破SSL问题

jiwenyi163 2008-06-05 10:11:49
我用System.Net.Mail/System.Web.Mail/Cdo
等技术发送smtp邮件,如果smtp有ssl限制,始终发送不出去。
一般报下面这种错误。但是用System.Net.Mail发送我所在公司的邮箱时,没有错误,且没有发送出去。

希望哪位大侠能贴上来一段代码,经过测试成功的。能够突破SSL的邮件发送代码。
Gmail是带SSL的,



[COMException (0x80040213): 与服务器的传输连接失败。
]

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) +0
System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) +436
System.Web.Mail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args) +71

[HttpException (0x80004005): 与服务器的传输连接失败。
]
System.Web.Mail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args) +119
System.Web.Mail.CdoSysHelper.Send(MailMessage message) +1612
System.Web.Mail.SmtpMail.Send(MailMessage message) +116
MailSS.btn_Click(Object sender, EventArgs e) in f:\Codes\__滨海新区\Embedded\MailSS.aspx.cs:44
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +98
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4886


...全文
给本帖投票
1566 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingshengyy 2011-09-09
  • 打赏
  • 举报
回复
/// <summary>
/// 自动发送邮件
/// </summary>
/// <param name="strMail">邮件接受地址</param>
/// <param name="strRegistCode">注册码</param>
/// <returns></returns>
public bool SendMail1234(string strMail,string content,string biaoti)
{
string strHost = "192.168.1.14"; //STMP服务器地址
string strAccount = "ips.ecomm@ipsoftcom.com"; //SMTP服务帐号
string strPwd = "abc@123"; //SMTP服务密码

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
SmtpClient _smtpClient = new SmtpClient();
_smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
_smtpClient.Host = strHost; ;//指定SMTP服务器
_smtpClient.Port=25;//指定服务器端口为25
_smtpClient.Credentials = new System.Net.NetworkCredential(strAccount, strPwd);//用户名和密码




MailAddress sender = new MailAddress("ips.ecomm@ipsoftcom.com", " ");
//MailAddress sender = new MailAddress("691114553@qq.com", " ");
MailAddress receriver = new MailAddress(strMail);

MailMessage mail = new MailMessage(sender, receriver);
MailAddressCollection ToMail = new MailAddressCollection();

mail.Subject = biaoti;//主题

mail.Body = content;//内容
mail.BodyEncoding = System.Text.Encoding.Default;//正文编码
mail.IsBodyHtml = true ;
mail.Priority = MailPriority.High;//优先级

try
{
_smtpClient.Send(mail);
return true;
}
catch (Exception e)
{
return false;
}

}

放在服务器上 为什么只能发送内部邮件 外网的邮件就发不了了呢?
qingshengyy 2011-09-09
  • 打赏
  • 举报
回复
public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}


这个函数在哪调用呢?
这些参数应该传什么呢??
work_fei 2010-07-05
  • 打赏
  • 举报
回复
采用楼主已经成功的方法,但我这里还是报“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 202.100.200.45:587 ”的错误
jevinss 2010-05-04
  • 打赏
  • 举报
回复
在邮件标头中找到无效的字符。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.FormatException: 在邮件标头中找到无效的字符。

源错误:

行 43: //发送
行 44:
行 45: client.Send(oMail); //发送邮件
行 46: Label1.Text = "恭喜你!邮件发送成功。";
行 47:
zhou__zhong__yan 2010-04-23
  • 打赏
  • 举报
回复
用dll组件方式,没有测通......

public class SendEmailSino
{
public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}

public bool SendEmail(string fromWhere, string Displayname, string toWhere, string subject, string body, string attach, string sPwd)
{
bool flag;
MailMessage message = new MailMessage();
message.From = new MailAddress(fromWhere, Displayname);
message.To.Add(new MailAddress(toWhere));
message.Subject = subject;
message.IsBodyHtml = true;
message.BodyEncoding = Encoding.UTF8;
message.Body = body;
message.Priority = MailPriority.High;
if (!string.IsNullOrEmpty(attach))
{
message.Attachments.Add(new Attachment(attach));
}

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

SmtpClient client = new SmtpClient("*******",25);
client.Credentials = new NetworkCredential("****", sPwd);

client.EnableSsl = true;
object obj2 = message;
try
{
client.Send(message);
flag = true;
}
catch (Exception exception)
{
throw exception;
}
return flag;
}
}
zmgdpg 2010-03-17
  • 打赏
  • 举报
回复
DDD
jiwenyi163 2008-06-11
  • 打赏
  • 举报
回复
最后解决了:在skyaspnet代码的基础上,添加这个函数,
    public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}


在skyaspnet
 //发送邮件服务器
SmtpClient client = new SmtpClient();

前面加上
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);


好像是强制验证通过的意思。

谢谢诸位,之前写过这样的不知道为什么不成功,今天终于在我们公司的服务器上跑通。happy啊。谢谢。散分!
jiwenyi163 2008-06-11
  • 打赏
  • 举报
回复
然后,我用公司的smtp试验skyaspnet的代码

结果发生这个错误

The remote certificate is invalid according to the validation procedure.
jiwenyi163 2008-06-11
  • 打赏
  • 举报
回复
谢谢各位,

头两天加班太严重!所以今天才来看帖

skyaspnet 兄:你的代码我试了一下报下面的错误。我用我自己的GMail邮箱测试的。

由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 209.85.199.111:587

关于大家说的设置的问题:我是用公司的邮件网络。这里(上面的错误?)有没有可能被公司封了的。。。
我用浏览器登陆GMail没有问题
我用foxmail发送接收和发送邮件都可以,是用公司的smtp,但是,写程序就是发不出去
Nesta_13 2008-06-05
  • 打赏
  • 举报
回复
最近也在研究邮件收发
关注一下
简单的发送,已测试,不过邮箱地址要改成真实的,这里为了保密就乱写的

public void SendMails()
{
MailAddress from = new MailAddress("jbj12@sina.com");
MailAddress to = new MailAddress("hd13@sina.com");
MailMessage objMailMessage = new MailMessage(from, to);
objMailMessage.Subject = "SMTP";
objMailMessage.Body = "邮件测试";
SmtpClient objSmtpClient = new SmtpClient("smtp.sina.com");
objSmtpClient.Credentials = new System.Net.NetworkCredential("jbj12", "密码");
objSmtpClient.Send(objMailMessage);
}
skyaspnet 2008-06-05
  • 打赏
  • 举报
回复
主要是端口要设置为: 587

这个是最关键的地方
skyaspnet 2008-06-05
  • 打赏
  • 举报
回复
比较辛苦,记得加分啊
skyaspnet 2008-06-05
  • 打赏
  • 举报
回复
我写了一个,测试通过,你试一下:

email.aspx:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="email.aspx.cs" Inherits="_email" ValidateRequest="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table id="TABLE1" runat="server" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="width: 393px">
收信:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
主题:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
内容:<asp:TextBox ID="TextBox3" runat="server" Height="154px" TextMode="MultiLine"
Width="336px"></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="发送" OnClick="Button1_Click" /></td>
</tr>
</table>

</div>
<table id="Table2" runat="server" border="0" cellpadding="0" cellspacing="0" visible="false">
<tr>
<td align="center" style="width: 400px">
<asp:Label ID="Label1" runat="server" ForeColor="Red" Text="恭喜您,发表成功!"></asp:Label><br />
<asp:Button ID="Button2" runat="server" Text="返回" OnClick="Button2_Click" /></td>
</tr>
</table>
</form>
</body>
</html>



email.aspx.cs:



using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//倒入命名空间
using System.Net;
using System.Net.Mail;

public partial class _email : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
////设置发件人信箱,及显示名字
MailAddress from = new MailAddress("邮箱地址", "名字");
//设置收件人信箱,及显示名字
MailAddress to = new MailAddress("邮箱地址", "名字");
//创建一个MailMessage对象
MailMessage oMail = new MailMessage(from, to);

oMail.Subject = TextBox2.Text; //邮件标题
oMail.Body = TextBox3.Text; //邮件内容

oMail.IsBodyHtml = true; //指定邮件格式,支持HTML格式
oMail.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");//邮件采用的编码
oMail.Priority = MailPriority.High;//设置邮件的优先级为高

//发送邮件服务器
SmtpClient client = new SmtpClient();
client.Host = "smtp.gmail.com"; //指定邮件服务器
client.EnableSsl = true;
client.Port = 587; //端口要设置成587
client.Credentials = new NetworkCredential("邮箱用户名", "密码");//指定服务器邮件,及密码

//发送

client.Send(oMail); //发送邮件
Label1.Text = "恭喜你!邮件发送成功。";


oMail.Dispose(); //释放资源

TABLE1.Visible = false;
Table2.Visible = true;
}
protected void Button2_Click(object sender, EventArgs e)
{
//返回,继续发送
Response.Redirect(Request.Url.ToString());
TABLE1.Visible = true;
Table2.Visible = false;
}
}

l1519 2008-06-05
  • 打赏
  • 举报
回复
可能是你的smtp没些对
yuelailiu 2008-06-05
  • 打赏
  • 举报
回复
试用 Jmail 发送.
skyaspnet 2008-06-05
  • 打赏
  • 举报
回复
看一下你设置的SSL端口是不是不正确

62,236

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部