话不多说,请看代码:(后面附上项目整体代码,可详细查看。)。
算了,vip文章要评审,还是在这里给朋友们注释一下代码内容吧,方便大家参考使用。
收邮件:
核心代码:
pop3:
//using是个好东西,如果你没有关资源,他自动给你关,特别是对于流来说。pop3其实也是输入流,这里就需要用它来保证一下安全。
using (var client = new Pop3Client())
{
client.Connect(PopName, PopPort, true); // 使用SSL连接,不用的话最后一个参数改成false。
client.Authenticate(MailMS.AccountName, UPwd);//如果是非ssl连接,这里的密码最好也使用邮箱厂商后台可以设置的链接码。这个链接码在邮箱的pop3说明里面有,imap和smtp的说明里面也有。
// 获取邮件数量
int count = client.GetMessageCount();
Console.WriteLine($"Total messages: {count}");
// 获取最新的邮件(索引从0开始)
for (int i = 0; i < count; i++)
{
string c0 = "", c1 = "", c2 = "";
int key = count - 1 - i;
var message = client.GetMessage(key);
c1 = message.Subject;
c0 = message.From.ToString();
c2 = message.Date.ToString();
dataGridView1.Rows.Add(key + 1, "",
c1,
c0,
c2
);//我的页面有个dataGridView来显示邮件列表,所以这里绑一下数据。
Hashtable savedMail = new Hashtable();//这个hashtable用来在页面暂存邮件
savedMail.Add("Subject", message.Subject);
savedMail.Add("From", message.From.ToString());
savedMail.Add("Date", message.Date.ToString());
savedMail.Add("text", message.TextBody == null ? "" : message.TextBody);
savedMail.Add("html", message.HtmlBody == null ? "" : message.HtmlBody);
//附件
if (message.Attachments.Count() > 0)
{
savedMail.Add("Attachments", message.Attachments);
}
else
{
savedMail.Add("Attachments", null);
}
mails.Add((key + 1).ToString(), savedMail);//暂存所有邮件
}
}
imap:
//建立连接
var client = new ImapClient();
if (_ssl == "启用")
{
client.Connect(MailMS.Imap, MailMS.ImapPort, true); // 替换为你的 IMAP 服务器地址和端口
}
else {
client.Connect(MailMS.Imap, MailMS.ImapPort, false); // 替换为你的 IMAP 服务器地址和端口
}
client.Authenticate(MailMS.UserName, MailMS.PassWd);
client.Inbox.Open(FolderAccess.ReadWrite);
打开smtp接口
//MailKit.Net.Smtp.SmtpClient smtpClient = new MailKit.Net.Smtp.SmtpClient();
//smtpClient.Connect(MailMS.SmtpName, MailMS.SmtpPort, true);
注:用户名和密码应妥善保管,不要硬编码到源码中
//smtpClient.Authenticate(MailMS.UserName, MailMS.PassWd);
//加载分类邮箱
AccountHandle acOperate = new AccountHandle();
string[] addressInfo = acOperate.GetToAddress("select * from AutoeMailAddress where AccountName='" + MailMS.UserName + "'");
string address1 = addressInfo[1];
string address2 = addressInfo[2];
string address3 = addressInfo[3];
string address4 = addressInfo[4];
//获取每一个邮件,保存到本地,同时转发,转移完后将邮件标记为已读,
int size = 0;
int uidCount = 0;
int lastPage = 0;
var query = SearchQuery.NotSeen;
var uids = client.Inbox.Search(query);
uidCount = uids.Count();
lastPage = lastPage + uidCount;
var inbox = client.Inbox;
foreach (var uid in uids)
{
if (!IsMove)
{
//停止进程
break;
}
//获取邮件
var oldmail = inbox.GetMessage(uid);
var flags = inbox.AcceptedFlags;
var isRead = oldmail.Headers;
string subject = oldmail.Subject;
WriteStatus("开始转移标题为“" + subject + "”的邮件……");
EmailData data = new EmailData();
data.Subject = subject;
//邮箱设置
AccountInfo account = new AccountInfo();
account.UserName = MailMS.UserName;
account.PassWd = MailMS.PassWd;
account.SmtpName = MailMS.SmtpName;
account.SmtpPort = MailMS.SmtpPort;
account.MailAddress = MailMS.MailAddress;
if (subject.ToLower().Contains("class1"))
{
data.To = address1;
}
else if (subject.ToLower().Contains("class2"))
{
data.To = address2;
}
else if (subject.ToLower().Contains("class3"))
{
data.To = address3;
}
else
{
data.To = address4;
}
data.From = MailMS.MailAddress;
data.TextBody = oldmail.TextBody;
data.HtmlBody = oldmail.HtmlBody;
//附件
data.Files = null;
Hashtable Mail = new Hashtable();
Mail.Add("Attachments", oldmail.Attachments);
//发送邮件
EmailHelper.SendEmailWait(data, Mail, account);
//等待5秒,避免服务器认为是攻击
await Task.Delay(5000);
//发送完毕
WriteStatus("邮件“" + subject + "”转移完毕");
//将此邮件标记为已读
client.Inbox.AddFlags(uid, MessageFlags.Seen, true);
size++;
}
if (!IsMove)
{
WriteStatus("强制停止转移,邮件转移完毕,总共处理了" + size + "封邮件");
}
else
{
WriteStatus("邮件转移完毕,总共处理了" + size + "封邮件");
}
//smtpClient.Disconnect(true);
client.Disconnect(true);
发邮件:
核心代码:
smtp:
/// <summary>
/// 带了本地的文件和转发的文件
/// </summary>
/// <param name="data"></param>
/// <param name="mail"></param>
public static async void SendEmail(EmailData email, Hashtable mail, AccountInfo account)
{
try
{
// 创建一个新的 MIME 消息对象
var message = new MimeMessage();
// 设置发件人
message.From.Add(MailboxAddress.Parse(email.From));
// 设置收件人
message.To.Add(MailboxAddress.Parse(email.To));
// 设置主题
message.Subject = email.Subject;
// 创建邮件正文
var builder = new BodyBuilder();
builder.TextBody = email.TextBody;
builder.HtmlBody = email.HtmlBody;
// 添加附件
if (email.Files != null && email.Files.Count > 0)
{
for (int i = 0; i < email.Files.Count; i++)
{
using (var stream = new FileStream(email.Files[i].ToString(), FileMode.Open))
{
builder.Attachments.Add(email.Files[i].ToString(), stream);
}
}
}
//如果转发的邮件有附件,把附件加上
if (mail != null)
{
IEnumerable<MimeEntity> list = (IEnumerable<MimeEntity>)mail["Attachments"];
foreach (MimeEntity item in list)
{
builder.Attachments.Add(item);
}
}
// 设置正文
message.Body = builder.ToMessageBody();
// 使用 SMTP 客户端发送邮件
using (var client = new SmtpClient())
{
//await client.ConnectAsync("smtp.qq.com", 465, true);
await client.ConnectAsync(account.SmtpName, account.SmtpPort, true);
// 注:用户名和密码应妥善保管,不要硬编码到源码中
//await client.AuthenticateAsync("33072340@qq.com", "lctzfpbaxgdpbhih");
await client.AuthenticateAsync(account.MailAddress, account.PassWd);
// 发送邮件
await client.SendAsync(message);
// 断开与服务器的连接
await client.DisconnectAsync(true);
}
//Console.WriteLine("邮件已成功发送!");
}
catch (Exception ex)
{
throw ex;
//Console.WriteLine($"邮件发送失败:{ex.Message}");
}
}
完整代码下载: