利用SMTP发送Mail详解(一)

【计算机网络】【自顶向下课后习题-2】 更重要的是,每过30s,我的主机也要随机地选择另一个邻居(假设叫A)并向其发送块,如果我的主机同发送过块,成为了A之际的前4位上载者,A也会开始向我的主机发送块,这样A的主机也可能成为了我的主机的前4位上载者。相同的,如果web缓存器里没有请求对象,那就向初始服务器请求该对象,由于上一步就解决了一大批请求,初始服务器链路的流量竞争也缓解了许多。HTTP不能使用SMTP使用的方法,因为HTTP消息可以是二进制数据如图片、视频等,不能以符号“.”结束,而在SMTP中,消息主体必须是7位的ASCLL格式。 阅读详情

在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单。最近这段时间因工作需要在C++ 中使用发送mail 的功能,上网搜了一大堆资料,终于得以实现,总结自己开发过程中碰到的一些问题,希望对需的人有所帮助, 由于能力有限, 文中不免有些误解之处, 望大家能指正!!

其实,使用C++ 发送mail 也是很简的事, 只需要了解一点SMTP 协议和socket 编程就OK 了, 网络上也有很多高人写好的mail 类源码,有兴趣的朋友可以下载看看.

 

1.     SMTP 常用命令简介

1). SMTP 常用命令

HELO/EHLO 向服务器标识用户身份

MAIL 初始化邮件传输

mail from:

RCPT 标识单个的邮件接收人;常在MAIL 命令后面

可有多个rcpt to:

DATA 在单个或多个RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以. 结束。

VRFY 用于验证指定的用户/ 邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用

HELP 查询服务器支持什么命令

NOOP 无操作,服务器应响应OK

QUIT 结束会话

RSET 重置会话,当前传输被取消

 

如你对SMTP 命令不了解,可以用telnet 命令登陆到smtp 服务器用help 命令进行查看:

220 tdcsw.maintek.corpnet.asus ESMTP Sendmail 8.13.8/8.13.8; Sat, 9 Jan 2010 10:
45:09 +0800
help
214-2.0.0 This is sendmail
214-2.0.0 Topics:
214-2.0.0       HELO    EHLO    MAIL    RCPT    DATA
214-2.0.0       RSET    NOOP    QUIT    HELP    VRFY
214-2.0.0       EXPN    VERB    ETRN    DSN     AUTH
214-2.0.0       STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation see
214-2.0.0       http://www.sendmail.org/email-addresses.html
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info


2).SMTP 返回码含义

  *   邮件服务返回代码含义 

  *   500   格式错误,命令不可识别(此错误也包括命令行过长) 

  *   501   参数格式错误 

  *   502   命令不可实现 

  *   503   错误的命令序列 

  *   504   命令参数不可实现 

  *   211    系统状态或系统帮助响应 

  *   214   帮助信息 

  *   220     服务就绪 

  *   221     服务关闭传输信道 

  *   421     服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应) 

  *   250   要求的邮件操作完成 

  *   251   用户非本地,将转发向 

  *   450   要求的邮件操作未完成,邮箱不可用(例如,邮箱忙) 

  *   550   要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问) 

  *   451   放弃要求的操作;处理过程中出错 

  *   551   用户非本地,请尝试 

  *   452   系统存储不足,要求的操作未执行 

  *   552   过量的存储分配,要求的操作未执行 

  *   553   邮箱名不可用,要求的操作未执行(例如邮箱格式错误) 

  *   354   开始邮件输入,以. 结束 

  *   554   操作失败 

  *   535   用户验证失败 

  *   235   用户验证成功 

  *   334   等待用户输入验证信息 for next connection>;

 

3) SMTP 命令应用

我们下需使用telnet 命令实现smtp 邮件的发送,具体操作如下:

220 tdcsw.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 23 Dec 2009 18
:18:18 +0800
HELO tdcsw
250 tdcsw.com Hello x-128-101-1-240.ahc.umn.edu [128.101.1.240], pleased to meet you
MAIL FROM:lily@tdcsw.com
250 2.1.0 lily@tdcsw.com... Sender ok
RCPR TO:sam@163.com
250 2.1.5 carven@tdcsw.pegatroncorp.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
SUBJECT:HELLO
HI:
HAR are you?
.
250 2.0.0 nBNAIIG4000507 Message accepted for delivery
quit
221 2.0.0 tdcsw.maintek.corpnet.asus closing connection
Connection to host lost.

 

2.     用C++ 实现Mail 发送

为了便于理解, 在此就不封装Mail 类了, 而是以过程式函数方式给出.

1). 首先需要建立TCP 套接字, 连接端口依服务器而定,SMTP 服务默认端口为25, 我们以 默认端口为例

WSADATA wsaData;

int  SockFD;

WSAStartup(MAKEWORD(2,2), &wsaData);

SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

ServAddr.sin_family = AF_INET;

ServAddr.sin_addr.s_addr = inet_addr (“192.168.1.1”);             //192.168.1.1 为服务器地址

ServAddr.sin_port = htons(25);

connect(SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr));

2). 发送SMTP 命令及数据

const char HEADER[] = "HELO smtpSrv/r/n"

  "MAIL FROM: sender@126.com/r/n"

  "RCPT TO: recv@gmail.com/r/n"

  "DATA/r/n"

  "FROM: sender@126.com/r/n"

  "TO: recv@gmail.com/r/n"

  "SUBJECT: this is a test/r/n"

  "Date: Fri, 8 Jan 2010 16:12:30/r/n"

"X-Mailer: shadowstar's mailer/r/n"

  "MIME-Version: 1.0/r/n"

  "Content-type: text/plain/r/n/r/n";

//send HEADER

send(SockFD, HEADER, strlen(HEADER), 0);

 

const char CONTENT[]="this is content./r/n";

//send CONTENT

send(SockFD, CONTENT, strlen(CONTENT), 0);

 

send(SockFD, "./r/n", strlen("./r/n"), 0);   //end

send(SockFD, "QUIT/r/n", strlen("QUIT/r/n"), 0); //quit

 

mail 发送的功能基本上就完成了, 当然, 如果是应用的话还是需要很多改动的地方的, 比如说添加附件等.

3). 附件功能

要使用SMTP 发送附件, 需要对SMTP 头信息进行说明, 改变Content-type 及为每一段正文添加BOUNDARY 名, 示例如下:

"DATA/r/n"

  "FROM: sender@126.com/r/n"

  "TO: recv@gmail.com/r/n"

  "SUBJECT: this is a test/r/n"

  "Date: Fri, 8 Jan 2010 16:12:30/r/n"

"X-Mailer: shadowstar's mailer/r/n"

  "MIME-Version: 1.0/r/n"

  "Content-type: multipart/mixed; boundary=/"#BOUNDARY#/"/r/n/r/n";

 

// 正文

"--#BOUNDARY#/r/n"

  "Content-Type: text/plain; charset=gb2312/r/n"

  "Content-Transfer-Encoding: quoted-printable/r/n"

邮件正文……….

 

// 附件

"/r/n--#BOUNDARY#/r/n"

  "Content-Type: application/octet-stream; name=att.txt/r/n"

  "Content-Disposition: attachment; filename=att.txt/r/n"

  "Content-Transfer-Encoding: base64/r/n"

  "/r/n"

附件正信息(base64 编码)…..

 

Base64 编码函数在网络上很容易找到, 这里就不给出源码了, 如需要支持HTML 格式而又不知道如何写这些头信息, 可以用outlook 或foxmail 写一封支持HTML 格式的mail, 查看其原文信息, 依照相同的格式发送就行了.

 

4). 实现抄送及密送

在SMTP 命令集中并没有RCPT CC 或RCPT BCC 相关命令, 那要如何来实现抄送和密送功能呢?

在网络上找到这样一句话: “ 所有的接收者协商都通过RCPT TO 命令来实现,如果是BCC ,则协商发送后在对方接收时被删掉信封接收者”, 开始一直不明白这句话是什么意思? 后来通看查看foxmail 的邮件原文发现:

Date: Wed, 6 Jan 2010 12:11:48 +0800

From: "carven_li" < carven_li @smtp.com>

To: "carven" <carven@smtp.com>

Cc: "sam" <sam@smtp.com>,

  "yoyo" <yoyo@smtp.com>

BCC: "clara" <clara@tsmtp.com>

Subject: t

X-mailer: Foxmail 5.0 [cn]

Mime-Version: 1.0

Content-Type: multipart/mixed;

    boundary="=====001_Dragon237244850520_====="

才恍然大悟, 所谓的” 协商” 应该就是指发送方在Data 中指定哪些为CC, 哪些为BCC, 默认情况下什么都不写, 只发送第一个RCPT TO 的mail, 其他的都被过滤掉.

Flask-Mail邮件的配置以及发送附件的方法 在学习flask-mail来发送电子邮件的时候遇到了一些问题,其实都是些小问题,现在记录下来以便于以后查看。 一、首先flask-mail的安装:pip install flask-mail二、flask-mail,载入和初始化:from flask.ext.mail import Mail mail = Mail(app)三、flask-mail SMTP邮箱服务器配置1、配置hotmail邮箱 阅读详情

相关推荐

【flask扩展】使用Flask-Mail发送邮件

在开发过程中,很多应用程序都需要通过邮件提醒用户, Flask 的扩展包 Flask - Mail 通过包装了 Python 内置的smtplib包,可以用在 Flask 程序中发送邮件。

阿牛的博客 1844

邮件smtp协议 mail

邮件协议只要有POP3/SMTP和IMAP: 主要介绍SMTP: 1. SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议...

phone1126的专栏 8981

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1034

Java发送邮件

 在使用此功能之前需要两个jar包:activation.jar  和   mail.jar import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import jav...

qq_33327680的博客 284

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

【深度学习】tensorboard中的图片放到论文中

1. 利用tensorboard中的导出数据功能 选中左上角的标签,然后选择csv格式的数据下载即可。 左边的smoothing 数值不影响导出数据的大小。 2.tensorboard 图下标签介绍: 放大 Toggle y-axis log scale:将y轴对数化 Fit domain to data:如果拖动了图片等,再重新回到原始位置 Download Current Chart as SVG 3.用下载下来的csv数据来画图 第一幅图片:训练的平均长度 fig, ax1 = plt.sub

gaocui883的博客 1万+

邮箱系统原理——SMTP协议

SMTP协议是一个基于TCP/IP的应用层协议,SMTP服务器的默认的网络监听端口号为25 SMTP协议中一共定义了18条命令:其中比较发送一封邮件的过程通常需要的有以下6条命令 ehlo命令:SMTP邮件发送程序与SMTP接收程序建立连接后必须发送的第一条SMTP命令,后面通常加本主机名 auth命令:认证命令,如auth login,然后输入用户名和密码(必须是BASE64编码后的)

Jackson Zhang 2323

【XAI】透视深度学习:CNN与Transformer的可解释性方法

深度学习模型的可解释性方法解析:本文探讨了CNN和Transformer两类主流模型的可解释性技术。针对CNN,介绍了显著性图、类激活图(CAM/Grad-CAM)和基于扰动的方法,通过可视化重要像素区域揭示决策依据。对于Transformer,重点分析了注意力机制可视化及其在文本处理中的应用,并介绍了积分梯度等归因方法。文章包含详细的Python实现示例(使用Captum库),涵盖从MNIST图像显著性分析到BERT文本注意力可视化,为初学者提供了可操作的技术指南。这些方法有助于增强模型透明度,提升AI系

u012133341的博客 381

使用Flask-Mail和qq邮箱SMTP服务发送邮件

开启qq邮箱SMTP服务 安装Flask-Mail 配置Flask-Mail 发送邮件 大量邮件 附件 完整例子项目中不可避免需要使用邮箱认证,如果使用flask则可以利用Flask-Mail来实现。 Flask-Mail 扩展提供了一个简单的接口,可以在 Flask 应用中设置 SMTP 使得可以在视图以及脚本中发送邮件信息。 开启qq邮箱SMTP服务这里我利用的qq邮箱的SMTP服务,所以首

wbin233的博客 2万+

【教程4>第6章>第15节】 基于I+jQ复数信号的LS信道估计和均衡实现1——matlab仿真分析,QPSK为例

在基于QPSK调制的通信系统中,LS信道估计和均衡是用于补偿信道失真、提高信号传输质量的重要技术。以下将详细介绍基于I+jQ复数信号的 LS 信道估计和均衡的实现原理与过程。可以看到,通过线性插值之后,QPSK信号的星座图可以模糊的看到四个星座点(图2),通过非线性插值之后,可以清晰的看到QPSK的四个星座点(图3)。可以看到,信道均衡显著提高了通信系统的可靠性和有效性。

FPGA/MATLAB学习教程/源码/项目合作开发 657

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1436

WP Mail 邮件发送:WordPress Mail SMTP设置

在运营WordPress网站时,顺畅的邮件沟通至关重要。不少站长都被邮件发送问题折磨得焦头烂额,比如邮件无法送达、被归到垃圾邮件箱。别着急!《WP Mail邮件发送:WordPress Mail SMTP设置》这篇文章,就是你的救星。它将手把手教你进行WordPress Mail SMTP的相关设置,助你解决邮件发送难题,搭建高效的网站邮件沟通体系 。

探索无代码WordPress建站与AI工具实战,轻松打造高效网站!适合新手和技术爱好者的实用指南。 2041

【论文复现】——基于NDT与ICP结合的点云配准算法(matlab版)

基于NDT与ICP结合的点云配准算法matlab版

点云侠的博客 490

配置mail使用SMTP发送邮件

转载请注明文章出处:https://tlanyan.me/config-mai... 前文“PHP回顾之发送邮件”介绍了邮件中的一些基本概念,今天分享在Linux上使用mail命令通过SMTP对外发送邮件。 mail、mailx和sendmail 先看一下三者的关系:mail是mailx的别名,最初叫nail(与arch linux目前...

weixin_34054931的博客 2181

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux下利用mail命令发送邮件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、环境二、方法1.安装mail程序2.关闭其他邮件工具3.开启SMTP并获得授权码4.获取数字证书总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、环境 Linux下Centos 7 [root@localhost /]# cat /etc/red

qq_41900340的博客 2121

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail

虽然Drupal自带发送email功能,但是很多服务器需要SMTP验证,这个时候就需要安装 SMTP 模块。 激活 SMTP 模块进入配置 admin/config/system/smtp在 Turn this module on or off  选择 on填写 SMTP SERVER SETTINGS 中相关信息 (如果你的服务器在godaddy,只要在 SMTP server 填写

sevenfish的专栏 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

flask_mail发送邮件(使用SMTP协议)

flask_mail发送邮件 本文介绍使用flask_mail发送邮件 0.获取邮箱的授权码(这里以163邮箱为例) 登录邮箱点击设置中的POP3/SMTP/IMAP获取授权码 1.安装flask_mail pip install flask_mail 2.导包 from flask import Flask,render_template,request from flask_mail import Mail,Message from flask_wtf import FlaskForm from

CYS_zxcvbnm的博客 3395

Linux使用mail配合smtp发送邮件

由于工作需要结合shell脚本需要发送邮件通知,linux自带的mail可以实现外部smtp发邮件。不需要本地配置postfix,sendmail邮件服务器。 本文教程包含25端口发送邮件和mail使用465端口加密发邮件,mail基本命令发送邮件三个知识点,测试系统是centos7 安装工具 # yum -y install mailx # yum -y install sendmail centos6 # /etc/init.d/sendmail start # chkconfig sendma

星哥玩云 1万+

linux--mail设置smtp发送邮件

日期:20171104邮件,或许在win中不怎么用到。(因为我们大多数用QQ、微信即时聊天,软件自动推送新闻) 但在linux中,如果经常逛论坛(外国),或者源码官网,都会发现有“订阅邮件列表”的功能。 (邮件列表是什么?我也不太了解,应该相当于订阅新闻之类的东东。我订阅过一个网站,然后每次一有新消息,就会发来我邮箱)不管邮件列表是什么,在linux中,想通信,发邮件是个好方法send配置复杂,

iPenX的博客 2万+

利用SMTP发送Mail详解(二)

3. SMTP身份认证SMTP身份认证方式有很多种, 每种认证方式验证发送的信息都有点细微的差别, 这里我主要介绍下LOGIN,PLAIN及NTLM三种简单的认证方式, 附带CRAM-MD5和DIGEST-MD5方式(验证没通过, 不知道问题出在哪了? 有待高人帮忙解决!).要进行身份认证, 先要知道当前SMTP服务器支持哪些认证方式, 在ESMTP中有个与HELO命令相同功能的命

study_live的专栏 6906

linux中mail/mailx使用外部smtp发送邮件

一、LINUX下的mail \ mailx为什么无法使用外部SMTP发邮件? from:http://blog.csdn.net/islandstar/article/details/7868916   有时为了达到某种需求统一使用某一SMTP服务器作为发送邮件报告。 通常的做法都是,关闭本机的sendmail服务,修改/etc/mail.rc,增加一下类似两行,指定外部的smtp服务器地

爱肯的专栏 4733

利用SMTP发送Mail详解(三)

5). DIGEST-MD5认证方式DIGEST-MD5认证也是Challenge/Response的方式, 与CRAM-MD5相比, 它的Challenge信息更多, 其Response计算方式也非常复杂, 我在测试时也是以认证失败而告终, 只是将在网上找到的资料整理于此, 能为后来研究的人多提供点资料, 或者有兴趣的朋友们可以和我一起讨论下.我们先看下DIGEST-MD5认证发送响

study_live的专栏 6432

php mail函数详解,php中mail()函数用法和SMTP工作原理详解

一个发送E-MAIL的脚本也许是你能够在Web 站点上找到的最普通的脚本之一了,虽然它很简单,一个邮件脚本有时会令程序员非常沮丧.PHP中有一个叫做mail()的函数,它只需要知道接收方的地址 和信件主体就可以发送邮件,但是要让mail()按你的意思运行你还需要解决一些棘手的问题.要使mail()能够运行,你必须有一 个SMTP服务器以便PHP能够连接上去.不管这个服务器对邮件程序多么重要,大多数...

weixin_42512842的博客 1553
上一篇: Sendmail提示身份验证失败问题解决
下一篇: 利用SMTP发送Mail详解(二)
study_live
博客等级 码龄19年 20粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值