C#使用GMAIL群发带附件邮件的例子
说明:
ID,
姓名,
邮箱
三列,多个邮箱间用“;”间隔开。
对于不同附件的文件名必须包含ID。
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Net.Mail;
using System.Net;
using System.IO;
namespace Ferry
{
public partial class MassSendMail : Form
{
public MassSendMail()
{
InitializeComponent();
}
private void MassSendMail_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 统一的附件
/// </summary>
private void btnSameAttach_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
txtSameAttach.Text = ofd.FileName;
}
/// <summary>
/// 不同的附件,需要指定不同附件所在的统一目录
/// </summary>
private void btnDiffAttach_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowDialog();
txtDiffAttach.Text = fbd.SelectedPath;
}
private void btnMassSendList_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel文件(*.xlsx;*.xls)|*.xlsx;*.xls";
ofd.ShowDialog();
txtMassSendList.Text = ofd.FileName;
}
private void MassSendMail_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("确定要退出吗?退出将丢失窗口中所有信息!", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
== DialogResult.No)
{
e.Cancel = true;
}
}
private void btnQuit_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnSend_Click(object sender, EventArgs e)
{
SendMail();
}
private void SendMail()
{
this.btnSend.Enabled = false;
#region 读取设置的信息
//邮件主题
String strMailSubject = txtMailSubject.Text.Trim();
//邮件内容
String strMailBody = txtMailBody.Text.Trim();
//统一附件文件目录
String strSameFilePath = txtSameAttach.Text.Trim();
//不同附件目录
String strDiffFoderPath = txtDiffAttach.Text.Trim();
//群发列表文件路径
String strMassSendList = txtMassSendList.Text.Trim();
//邮箱
String strMail = txtYourMail.Text.Trim();
//邮箱密码
String strPassword = txtYourMailPassword.Text.Trim();
//显示姓名
String strDisplayName = txtDisplayName.Text.Trim();
#endregion
#region 验证必填信息
if (strMailSubject.Length == 0)
{
MessageBox.Show("请输入邮件主题!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btnSend.Enabled = true;
return;
}
if (strMailBody.Length == 0)
{
MessageBox.Show("请输入邮件内容!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btnSend.Enabled = true;
return;
}
if (strMassSendList.Length == 0)
{
MessageBox.Show("请选择群发邮件列表Excel文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btnSend.Enabled = true;
return;
}
if (strMail.Length == 0)
{
MessageBox.Show("请输入邮箱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btnSend.Enabled = true;
return;
}
if (strPassword.Length == 0)
{
MessageBox.Show("请输入邮箱密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btnSend.Enabled = true;
return;
}
#endregion
#region 读取群发邮件列表
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;Persist Security Info=False", strMassSendList);
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [MailList$]", connectionString);
DataTable dt = new DataTable();
try
{
da.Fill(dt);
}
catch (Exception err)
{
MessageBox.Show("从Excel中获取数据失败:" + err.Message);
return;
}
DataRow[] emptyRows = dt.Select("ID = '' OR ID IS NULL OR ID = 'ID'");
foreach (DataRow row in emptyRows)
{
dt.Rows.Remove(row);
}
dt.AcceptChanges();
dt.PrimaryKey = new DataColumn[] { dt.Columns["ID"] };
#endregion
foreach (DataRow dr in dt.Rows)
{
MailMessage mess = new MailMessage();
if (strDisplayName.Length != 0)
{
mess.From = new MailAddress(strDisplayName + "<" + strMail + ">");
}
else
{
mess.From = new MailAddress(strMail);
}
#region 设置邮件
mess.Subject = strMailSubject.Replace("{Name}", dr["姓名"].ToString());
mess.Body = strMailBody.Replace("{Name}", dr["姓名"].ToString());
mess.IsBodyHtml = true;
String[] strMailAddr = dr["邮箱"].ToString().Trim().Split(';');
for (Int32 i = 0; i < strMailAddr.Length; i++)
{
if (strMailAddr[i].Trim().Length != 0)
{
mess.To.Add(strMailAddr[i]);
}
}
#endregion
#region 添加附件
if (strSameFilePath.Length != 0)
{
mess.Attachments.Add(new Attachment(strSameFilePath));
}
if (strDiffFoderPath.Length != 0)
{
String[] files = Directory.GetFiles(strDiffFoderPath);
for (Int32 j = 0; j < files.Length; j++)
{
if (files[j].ToUpper().Trim().IndexOf(dr["ID"].ToString().Trim().ToUpper()) > 0)
{
mess.Attachments.Add(new Attachment(files[j]));
}
}
}
#endregion
#region
SmtpClient sc = new SmtpClient();
sc.Host = "smtp.gmail.com";
sc.Port = 587;
sc.Credentials = new NetworkCredential(strMail + "@gmail.com", strPassword);
sc.DeliveryMethod = SmtpDeliveryMethod.Network;
sc.EnableSsl = true;
try
{
sc.Send(mess);
this.txtSendMessage.Text += dr["姓名"].ToString() + "......成功\r\n";
}
catch
{
this.txtSendMessage.Text += dr["姓名"].ToString() + "......失败\r\n";
}
#endregion
}
this.btnSend.Enabled = true;
MessageBox.Show("邮件群发已完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void menuQuit_Click(object sender, EventArgs e)
{
this.Close();
}
private void menuSaveMessage_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "文本文件(*.txt)|*.txt";
DialogResult r = sfd.ShowDialog();
String filePath = sfd.FileName.Trim();
if (r != DialogResult.Cancel)
{
FileStream fs;
if (File.Exists(filePath))
{
fs = File.Open(filePath, FileMode.Append);
}
else
{
fs = File.Open(filePath, FileMode.Create);
}
StreamWriter sw = new StreamWriter(fs);
sw.Write(this.txtSendMessage.Text);
sw.Close();
fs.Close();
GC.Collect();
MessageBox.Show("发送记录已保存!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void menuHelp_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("邮件群发工具使用说明.docx");
}
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.WindowState != FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
}
else
{
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = true;
}
}
private void contextMenuQuit_Click(object sender, EventArgs e)
{
this.Close();
}
}
}