C# - VS2019WinFrm程序通过SMTP方式实现邮件发送
前言
本篇主要记录:VS2019 WinFrm桌面应用程序通过SMTP方式实现邮件发送。作为Delphi转C#的关键一步,接下来将逐步实现Delphi中常用到的功能。
准备工作
搭建WinFrm前台界面
添加必要的控件,这里主要应用到GroupBox、Label、TextBox和Button,如下图

发件邮箱账户配置
准备一个邮箱,开启SMTP服务,并开启客户端授权密码(此处需要注意)。

核心代码构造SendEMail类
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks; namespace SendMail
{
/// <summary>
/// SMTP方式发送邮件
/// 特别注意:这里的密码为客户端授权码,不是发送邮箱的密码
/// </summary>
class SendEMail
{
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="userEmailAddress">发件人地址</param>
/// <param name="userName">发件人姓名(可为空)</param>
/// <param name="password">密码</param>
/// <param name="host">邮件服务器地址</param>
/// <param name="port"></param>
/// <param name="sendToList">收件人(多个电子邮件地址之间必须用逗号字符(“,”)分隔)</param>
/// <param name="sendCCList">抄送人(多个电子邮件地址之间必须用逗号字符(“,”)分隔)</param>
/// <param name="subject">主题</param>
/// <param name="body">内容</param>
/// <param name="attachmentsPath">附件路径</param>
/// <param name="errorMessage">错误信息</param>
public static bool SendMessage(string userEmailAddress, string userName, string password, string host, int port,
string[] sendToList, string[] sendCCList, string subject, string body, string[] attachmentsPath, out string errorMessage)
{
errorMessage = string.Empty;
SmtpClient client = new SmtpClient();
client.UseDefaultCredentials = true;
client.Credentials = new System.Net.NetworkCredential(userEmailAddress, password);//用户名、客户端授权码*******特别注意:此处需要的是客户端授权码,不是邮箱密码*******
client.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
client.Host = host;//邮件服务器
client.Port = port;//端口号 非SSL方式,默认端口号为:25
MailMessage msg = new MailMessage();
//加发件人
foreach (string send in sendToList)
{
msg.To.Add(send);
}
//加抄送
foreach (string cc in sendCCList)
{
msg.CC.Add(cc);
}
//在有附件的情况下添加附件
if (attachmentsPath != null && attachmentsPath.Length > )
{
foreach (string path in attachmentsPath)
{
var attachFile = new Attachment(path);
msg.Attachments.Add(attachFile);
}
}
msg.From = new MailAddress(userEmailAddress, userName);//发件人地址
msg.Subject = subject;//邮件标题
msg.Body = body;//邮件内容
msg.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码
msg.IsBodyHtml = true;//是否是HTML邮件
msg.Priority = MailPriority.High;//邮件优先级
try
{
client.Send(msg);
return true;
}
catch (System.Net.Mail.SmtpException ex)
{
errorMessage = ex.Message;
return false;
}
}
}
}
实现效果

作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C# - VS2019WinFrm程序通过SMTP方式实现邮件发送的更多相关文章
- Laravel5.5 邮件驱动使用 SMTP 驱动实现邮件发送
laravel5.5 邮件驱动 Laravel 支持多种邮件驱动,包括 smtp.Mailgun.Maildrill.Amazon SES.mail 和 sendmail.Mailgun . Mail ...
- C# 通过smtp服务器进行邮件发送 MailHelper
C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...
- 用WP SMTP插件实现邮件发送功能
WordPress本身是采用mail()函数发邮件的,但是这样发出的邮件很容易被放入垃圾箱,很多主机商(特别是Windows主机)为了避免用户滥发邮件直接禁用了mail()函数,还有些云计算平台(比如 ...
- smtp ssl模式邮件发送与附件添加
#!/usr/bin/python3 import os import smtplib from email.mime.text import MIMEText from email.mime.mul ...
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) ...
- 结合ABP源码实现邮件发送功能
1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...
- JavaMail如何保证邮件发送成功
使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是Java ...
- .NET开发邮件发送功能
.NET开发邮件发送功能 今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知 ...
- SpringBoot集成邮件发送
一:简述 在日常中的工作中难免会遇到程序集成邮件发送功能.接收功能:此篇文章我将使用SpringBoot集成邮件发送功能和接收功能:若对邮件一些基本协议和发送流程不懂的请务必参考我之前写的博客或者浏览 ...
随机推荐
- Linux下载——下载文件的命令
Linux下载——获取网络文件的命令 摘抄:本文主要学习了在Linux系统中如何下载文件的命令. wget命令 wget命令是一个用来下载文件的命令,可以在后台运行,在用户退出之后仍能继续下载,支持代 ...
- 关于spring,IOC和AOP的解析原理和举例
引用自:https://blog.csdn.net/paincupid/article/details/43152397 IOC:就是DAO接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(比 ...
- css精灵图&字体图标
精灵图 为什么需要精灵图 为了有效的减少服务器接收和发送请求的次数,提高页面的加载速度.出现了CSS精灵技术 精灵图(sprites)的使用 精灵技术主要针对背景图片.就是把多个小背景图片整合到一张大 ...
- layui 集成第三方和自定义组件到模块规范
1.新建一个layui.extend.js文件,页面调用时这个文件放到layui.js后面. 2.基础的配置卸载config中,扩展的组件写入extend,组件的路径是相对于config下base的路 ...
- QML::常用属性
Item 属性: Item 类型比较特殊,因为它是所有其他可视化类型的基类型. Qt Quick中所有可视化类型都基于 Item. Item 对象本身没有一个可视化的外观,但是它定义了可视化项目中所有 ...
- MYSQL 复制整个数据库
同一个服务器 mysqldump old -u root -p123456 | mysql new -u root -p123456 不同服务器(在源数据库服务器上执行) mysqldump old ...
- PHP代码篇(三)--常用方法
模块下不间断更新,PHP常用方法,欢迎留言! 一.递归删除指定目录下所有文件及文件夹 /** * 递归删除指定目录下所有文件及文件夹 * @param unknown $path,删除路径 */ fu ...
- jQuery—自定义HTTP请求
Ajax设置自定义请求头的两种方法 $.ajax({ url: 'http://www.baidu.com', type: 'get', data: JSON.stringify({"nam ...
- Python函数基础和函数参数
函数的定义和函数的调用 return的作用 三种参数的定义 常用的内置函数 len() 函数基础 函数的定义 def 函数名(参数): pass return 表达式 pass在这里表示什么都没有,不 ...
- Centos7 环境安装初始化
安装系统 默认分区 磁盘分配(以20G为例): Boot分区:引导分区系统启动的必要核心文件,建议1G Var分区:存放log文件,不分则在/下,建议1G Home分区:存放用户数据,一般都比较大,建 ...