C# 实现邮件发送源码(支持附件)

C#邮件发送,支持发送带附件的邮件

源码

csharp 复制代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Text;

namespace EmailSenderApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===== C# 邮件发送程序 =====");
            Console.WriteLine("支持文本/HTML内容和附件发送\n");

            try
            {
                // 1. 获取用户输入
                var emailConfig = GetEmailConfiguration();
                var recipients = GetRecipients();
                var subject = GetInput("邮件主题: ");
                var body = GetInput("邮件内容 (HTML格式请注明): ");
                bool isHtml = body.Contains("<html>") || body.Contains("<body>") || 
                             body.Contains("<div>") || body.ToLower().Contains("html");
                
                var attachments = GetAttachments();

                // 2. 发送邮件
                SendEmail(emailConfig, recipients, subject, body, isHtml, attachments);
                
                Console.WriteLine("\n邮件发送成功!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"\n错误: {ex.Message}");
                Console.WriteLine($"详细信息: {ex.InnerException?.Message}");
            }
            finally
            {
                Console.WriteLine("\n按任意键退出...");
                Console.ReadKey();
            }
        }

        /// <summary>
        /// 获取邮件配置信息
        /// </summary>
        static EmailConfig GetEmailConfiguration()
        {
            Console.WriteLine("===== 发件人配置 =====");
            return new EmailConfig
            {
                SenderEmail = GetInput("发件人邮箱: "),
                SenderName = GetInput("发件人名称: ", "发件人"),
                Password = GetPassword("发件人密码: "),
                SmtpServer = GetInput("SMTP服务器 (如: smtp.qq.com): "),
                Port = int.Parse(GetInput("SMTP端口 (如: 587): ", "587")),
                EnableSsl = bool.Parse(GetInput("启用SSL (true/false): ", "true"))
            };
        }

        /// <summary>
        /// 获取收件人列表
        /// </summary>
        static List<string> GetRecipients()
        {
            Console.WriteLine("\n===== 收件人配置 =====");
            var recipients = new List<string>();
            string input;
            do
            {
                input = GetInput("收件人邮箱 (输入空行结束): ");
                if (!string.IsNullOrWhiteSpace(input))
                {
                    try
                    {
                        var addr = new System.Net.Mail.MailAddress(input);
                        recipients.Add(addr.Address);
                    }
                    catch
                    {
                        Console.WriteLine("无效的邮箱格式,请重新输入");
                    }
                }
            } while (!string.IsNullOrWhiteSpace(input));

            if (recipients.Count == 0)
            {
                throw new ArgumentException("至少需要一个收件人");
            }

            return recipients;
        }

        /// <summary>
        /// 获取附件列表
        /// </summary>
        static List<string> GetAttachments()
        {
            Console.WriteLine("\n===== 附件配置 (可选) =====");
            var attachments = new List<string>();
            string input;
            do
            {
                input = GetInput("附件路径 (输入空行结束): ");
                if (!string.IsNullOrWhiteSpace(input))
                {
                    if (File.Exists(input))
                    {
                        attachments.Add(input);
                    }
                    else
                    {
                        Console.WriteLine("文件不存在,请重新输入");
                    }
                }
            } while (!string.IsNullOrWhiteSpace(input));

            return attachments;
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        static void SendEmail(EmailConfig config, List<string> recipients, 
                            string subject, string body, bool isHtml, 
                            List<string> attachments)
        {
            using (var message = new MailMessage())
            {
                // 设置发件人
                message.From = new MailAddress(config.SenderEmail, config.SenderName);
                
                // 添加收件人
                foreach (var recipient in recipients)
                {
                    message.To.Add(recipient);
                }
                
                // 设置邮件内容
                message.Subject = subject;
                message.Body = body;
                message.IsBodyHtml = isHtml;
                
                // 添加附件
                foreach (var file in attachments)
                {
                    var attachment = new Attachment(file);
                    message.Attachments.Add(attachment);
                }
                
                // 配置SMTP客户端
                using (var smtp = new SmtpClient(config.SmtpServer, config.Port))
                {
                    smtp.Credentials = new NetworkCredential(config.SenderEmail, config.Password);
                    smtp.EnableSsl = config.EnableSsl;
                    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                    smtp.Timeout = 10000; // 10秒超时
                    
                    // 发送邮件
                    Console.WriteLine("\n正在发送邮件...");
                    smtp.Send(message);
                }
            }
        }

        // 辅助方法:获取用户输入
        static string GetInput(string prompt, string defaultValue = "")
        {
            Console.Write(prompt);
            if (!string.IsNullOrEmpty(defaultValue))
            {
                Console.Write($" (默认: {defaultValue}): ");
            }
            else
            {
                Console.Write(": ");
            }
            
            var input = Console.ReadLine();
            return string.IsNullOrWhiteSpace(input) ? defaultValue : input;
        }

        // 辅助方法:安全获取密码
        static string GetPassword(string prompt)
        {
            Console.Write(prompt);
            var password = new StringBuilder();
            ConsoleKeyInfo key;
            
            do
            {
                key = Console.ReadKey(true);
                
                // 退格键处理
                if (key.Key == ConsoleKey.Backspace && password.Length > 0)
                {
                    password.Remove(password.Length - 1, 1);
                    Console.Write("\b \b");
                }
                // 回车键结束输入
                else if (key.Key == ConsoleKey.Enter)
                {
                    Console.WriteLine();
                    break;
                }
                // 只接受可打印字符
                else if (key.KeyChar >= 32 && key.KeyChar <= 126)
                {
                    password.Append(key.KeyChar);
                    Console.Write("*");
                }
            } while (true);
            
            return password.ToString();
        }
    }

    /// <summary>
    /// 邮件配置类
    /// </summary>
    class EmailConfig
    {
        public string SenderEmail { get; set; }
        public string SenderName { get; set; }
        public string Password { get; set; }
        public string SmtpServer { get; set; }
        public int Port { get; set; }
        public bool EnableSsl { get; set; }
    }
}

使用说明

1. 基本功能

  • 支持发送纯文本或HTML格式邮件

  • 支持添加多个附件

  • 支持多个收件人

  • 安全密码输入(显示为星号)

  • 详细的错误提示

2. 使用步骤

  1. 运行程序

  2. 输入发件人邮箱、名称、密码

  3. 输入SMTP服务器地址和端口

  4. 选择是否启用SSL

  5. 输入收件人邮箱(多个收件人分行输入)

  6. 输入邮件主题和内容

  7. 添加附件(可选)

  8. 程序自动发送邮件

3. 常见邮箱配置

邮箱服务 SMTP服务器 端口 SSL
QQ邮箱 smtp.qq.com 587
163邮箱 smtp.163.com 25
Gmail smtp.gmail.com 587
Outlook smtp-mail.outlook.com 587
企业邮箱 咨询管理员 25/587 是/否

4. 常见问题解决

问题1:认证失败

  • 检查邮箱地址和密码是否正确

  • 对于QQ邮箱:使用授权码而非登录密码

  • 对于Gmail:启用"允许不够安全的应用"或使用应用专用密码

问题2:连接超时

  • 检查网络连接

  • 尝试更换端口(25/465/587)

  • 检查防火墙设置

问题3:附件过大

  • 压缩大文件

  • 分割多个邮件发送

  • 使用云存储分享链接

高级功能扩展

1. 添加密送(Bcc)功能

csharp 复制代码
// 在SendEmail方法中添加
foreach (var bcc in bccList)
{
    message.Bcc.Add(bcc);
}

2. 添加邮件模板

csharp 复制代码
// 使用HTML模板
string template = File.ReadAllText("template.html");
string body = template.Replace("{content}", userContent);

3. 异步发送

csharp 复制代码
// 使用async/await
public async Task SendEmailAsync(...)
{
    await smtp.SendMailAsync(message);
}

4. 添加邮件日志

csharp 复制代码
// 记录发送日志
File.AppendAllText("email_log.txt", 
    $"{DateTime.Now}: 发送邮件至 {string.Join(",", recipients)}\n");

参考代码 C# 邮件发送 源码下载(可带附件) www.youwenfan.com/contentcss/116200.html

安全注意事项

  1. 不要硬编码密码:实际应用中应从安全存储获取

  2. 使用加密连接:始终启用SSL/TLS

  3. 限制发送频率:避免被识别为垃圾邮件

  4. 验证收件人:防止邮件注入攻击

  5. 处理敏感数据:邮件内容加密

项目结构

csharp 复制代码
EmailSender/
├── Program.cs         # 主程序
├── EmailConfig.cs     # 配置类
├── App.config         # 配置文件(可选)
└── attachments/       # 附件目录(可选)

此代码可直接复制到Visual Studio中使用,需要添加System.Net.Mail引用(在.NET Framework中默认包含,.NET Core需安装NuGet包System.Net.Mail)。

相关推荐
Highcharts.js6 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC6 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
头发还在的女程序员7 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
爱写代码的小朋友9 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华9 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.10 小时前
C++:语句和作用域
开发语言·c++
wanderist.11 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
kyriewen11 小时前
我review了一份Vibe Coding写的前端代码——能跑,但5个地方迟早要命
前端·javascript·ai编程
海天鹰11 小时前
PHP上传文件
android·开发语言·php
Yeauty13 小时前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频