Explicit SSL发送邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

/// <summary>
/// 发送邮件方法
/// </summary>
/// <param name="FromMial">发件人邮箱</param>
/// <param name="ToMial">收件人邮箱(多个收件人地址用";"号隔开)</param>
/// <param name="AuthorizationCode">发件人授权码</param>
/// <param name="ReplyTo">对方回复邮件时默认的接收地址(不设置也是可以的)</param>
/// <param name="CCMial">//邮件的抄送者(多个抄送人用";"号隔开)</param>
/// <param name="File_Path">附件的地址</param>
public void SendMail(string FromMial, string ToMial, string AuthorizationCode, string ReplyTo, string CCMial, string File_Path)
{
try
{
//实例化一个发送邮件类。
MailMessage mailMessage = new MailMessage();

//邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
mailMessage.Priority = MailPriority.Normal;

//发件人邮箱地址。
mailMessage.From = new MailAddress(FromMial);

//收件人邮箱地址。需要群发就写多个
//拆分邮箱地址
List<string> ToMiallist = ToMial.Split(';').ToList();
for (int i = 0; i < ToMiallist.Count; i++)
{
mailMessage.To.Add(new MailAddress(ToMiallist[i])); //收件人邮箱地址。
}

if (ReplyTo == "" || ReplyTo == null)
{
ReplyTo = FromMial;
}

//对方回复邮件时默认的接收地址(不设置也是可以的哟)
mailMessage.ReplyTo = new MailAddress(ReplyTo);

if (CCMial != "" && CCMial != null)
{
List<string> CCMiallist = ToMial.Split(';').ToList();
for (int i = 0; i < CCMiallist.Count; i++)
{
//邮件的抄送者,支持群发
mailMessage.CC.Add(new MailAddress(CCMial));
}
}
//如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
mailMessage.SubjectEncoding = Encoding.GetEncoding(936);

//邮件正文是否是HTML格式
mailMessage.IsBodyHtml = false;

//邮件标题。
mailMessage.Subject = "发送邮件测试";
//邮件内容。
mailMessage.Body = "测试群发邮件,以及附件邮件!.....";

//设置邮件的附件,将在客户端选择的附件先上传到服务器保存一个,然后加入到mail中
if (File_Path != "" && File_Path != null)
{
//将附件添加到邮件
mailMessage.Attachments.Add(new Attachment(File_Path));
//获取或设置此电子邮件的发送通知。
mailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
}

//实例化一个SmtpClient类。
SmtpClient client = new SmtpClient();

#region 设置邮件服务器地址

//在这里我使用的是163邮箱,所以是smtp.163.com,如果你使用的是qq邮箱,那么就是smtp.qq.com。
// client.Host = "smtp.163.com";
if (FromMial.Length != 0)
{
//根据发件人的邮件地址判断发件服务器地址 默认端口一般是25
string[] addressor = FromMial.Trim().Split(new Char[] { '@', '.' });
switch (addressor[1])
{
case "163":
client.Host = "smtp.163.com";
break;
case "126":
client.Host = "smtp.126.com";
break;
case "qq":
client.Host = "smtp.qq.com";
break;
case "gmail":
client.Host = "smtp.gmail.com";
break;
case "hotmail":
client.Host = "smtp.live.com";//outlook邮箱
//client.Port = 587;
break;
case "foxmail":
client.Host = "smtp.foxmail.com";
break;
case "sina":
client.Host = "smtp.sina.com.cn";
break;
default:
client.Host = "smtp.exmail.qq.com";//qq企业邮箱
break;
}
}
#endregion

//使用安全加密连接。
client.EnableSsl = true;
//不和请求一块发送。
client.UseDefaultCredentials = false;

//验证发件人身份(发件人的邮箱,邮箱里的生成授权码);
client.Credentials = new NetworkCredential(FromMial, AuthorizationCode);

//如果发送失败,SMTP 服务器将发送 失败邮件告诉我
mailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
//发送
client.Send(mailMessage);
Console.WriteLine("发送成功");
}
catch (Exception)
{

Console.WriteLine("发送失败");
}
}

Implicit SSL发送邮件

查阅资料得知,.net 的自带组件System.Net.Mail发送邮件支持Explicit SSL但是不支持Implicit SSL,国内大部门邮件服务器都是Implicit SSL,所以无法通过465端口发邮件
有人说了,那干嘛要用呢,我用25不好好的么,为什么不用25呢?
这个问题问得好,很多云服务器像阿里、腾讯购买的新机都是把25端口封禁的,想要用25端口需要手动申请解封,据阿里工作客服所说,审核通过率感人
那么今天就记录一下如何使用465端口成功发邮件

可以使用CDO.Message发送邮件
如何引用CDO.Message? cod.message的引用位置: C:\Windows\System32\cdosys.dll

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/// <summary>
/// 针对465加密端口 加密协议SSL(Implicit SSL)进行的邮件发送
/// </summary>
/// <param name="FromMial">发件人邮箱</param>
/// <param name="ToMial">收件人邮箱(多个收件人地址用";"号隔开)</param>
/// <param name="AuthorizationCode">发件人授权码</param>
/// <param name="ReplyTo">对方回复邮件时默认的接收地址(不设置也是可以的)</param>
/// <param name="CCMial">//邮件的抄送者(多个抄送人用";"号隔开)</param>
/// <param name="File_Path">附件的地址</param>
/// <param name="Subject">邮件标题</param>
/// <param name="Body">邮件内容</param>
public void SendMailForSSL(string FromMial, string ToMial, string AuthorizationCode, string ReplyTo, string CCMial, string File_Path, string Subject = "", string Body = "")
{
CDO.Message objMail = new CDO.Message();
try
{
objMail.To = ToMial;//接收邮件账号
objMail.From = FromMial;//发送邮件账号
objMail.Subject = Subject;//邮件主题string strHTML = @"";
objMail.HTMLBody = Body;//邮件内容
objMail.AddAttachment(File_Path, FromMial, AuthorizationCode);//邮件附件
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"].Value = 465;//设置端口
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"].Value = "smtp.qq.com";
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"].Value = FromMial;//发送邮件账号
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpuserreplyemailaddress"].Value = FromMial;//发送邮件账号
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"].Value = FromMial;//发送邮件账号
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"].Value = FromMial;//发送邮件账号
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"].Value = AuthorizationCode;//发送邮件账号登录密码
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value = 2;
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"].Value = 1;
objMail.Configuration.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"].Value = "true";//这一句指示是否使用ssl
objMail.Configuration.Fields.Update();
objMail.Send();
}
catch (Exception ex)
{
if (ex is ExceptionEx)
{
throw;
}
else
{
throw ExceptionEx.ThrowBusinessException(ex);
}
}
}