发送电子邮件的程序实例
邮件发送流程

邮件发送流程邮件作为现代社会最常用的沟通工具之一,其发送流程显得尤为重要。
正确的发送流程不仅可以提高工作效率,还可以避免一些不必要的麻烦。
下面我将为大家介绍一下邮件发送的详细流程。
首先,我们需要准备好发送邮件的内容。
在准备邮件内容时,我们应该尽量简洁明了,避免过长的篇幅和复杂的句子,确保对方能够快速地理解邮件的主旨。
同时,我们还需要注意邮件的格式,包括标题、正文和附件等,确保整个邮件看起来整洁美观。
接下来,我们需要登录邮箱账号。
在登录邮箱时,我们需要确保账号和密码的准确性,以免因为输入错误而导致登录失败。
另外,我们还需要确保网络连接的稳定性,避免在发送邮件的过程中出现网络中断的情况。
然后,我们需要点击“写邮件”或“新建邮件”按钮,进入邮件编辑页面。
在编辑页面中,我们需要填写收件人的邮箱地址,确保地址的准确性,避免因为输入错误而导致邮件发送失败。
在填写完收件人地址后,我们还需要填写邮件的主题,确保主题简洁明了,能够准确地表达邮件的内容。
在填写完收件人地址和主题后,我们需要开始编写邮件的正文。
在编写正文时,我们需要注意语言的得体性和礼貌性,避免使用不当的词语和表达方式,确保邮件内容能够给收件人留下良好的印象。
最后,我们需要点击“发送”按钮,将邮件发送出去。
在点击发送按钮之前,我们需要再次确认邮件的内容和格式是否准确无误,避免发送错误或不完整的邮件。
另外,我们还需要确保网络连接的稳定性,避免在发送邮件的过程中出现意外情况。
总的来说,邮件发送流程包括准备邮件内容、登录邮箱账号、填写邮件信息、编写邮件正文和发送邮件等几个步骤。
只有在每个步骤都做到准确、细致和周到,才能保证整个邮件发送流程的顺利进行。
希望以上内容能够对大家有所帮助,谢谢!。
发邮件格式范文(必备3篇)

发邮件格式范文第1篇1、电子邮件的发送和接收电子邮件在Internet上发送和接收的原理可以很形象地用我们日常生活中邮寄包裹来形容:当我们要寄一个包裹时,我们首先要找到任何一个有这项业务的邮局,在填写完收件人姓名、地址等等之后包裹就寄出而到了收件人所在地的邮局,那么对方取包裹的时候就必须去这个邮局才能取出。
同样的,当我们发送电子邮件时,这封邮件是由邮件发送服务器(任何一个都可以)发出,并根据收信人的地址判断对方的邮件接收服务器而将这封信发送到该服务器上,收信人要收取邮件也只能访问这个服务器才能完成。
2、电子邮件地址的构成电子邮件地址的格式由三部分组成。
第一部分“USER”代表用户信箱的帐号,对于同一个邮件接收服务器来说,这个帐号必须是唯一的;第二部分“@”是分隔符;第三部分是用户信箱的邮件接收服务器域名,用以标志其所在的位置。
对于世界上第一封电子邮件(e-mail),根据资料,现在有两种说法:第一种说法1969年 10月世界上的第一封电子邮件是由计算机科学家LeonardK.教授发给他的同事的一条简短消息。
发邮件格式范文第2篇电子邮件格式范文电子邮件伴随着电子计算机的普及,成为当今时代人际交流的重要的文书样式。
它既可用于处理公务,还可用于私人交往。
起着沟通信息、交流感情的作用。
使用电子邮件进行对外联络,不仅安全保密,节省时间,不受篇幅的限制,传输速度快,能够跨越时空,而且还可以大大地降低通信费用,它为信息时代人们的快节奏、高效率信息传递提供了便利与可能。
(二)电子邮件的撰写1.电子邮件的.结构与内容电子邮件由邮件头和正文结构而成。
邮件头包括收件人、抄送人地址、主题(邮件名称)、发件人地址等内容。
正文包括三部分内容。
(1)信头。
第一行顶格写对收信人的称呼。
(2)信体。
开门见山、直接人题,告知事宜,传递信息,分享情绪,可自由发挥。
(3)信尾。
写明发邮件人姓名、发邮件日期。
2.电子邮件的撰写要求(1)主题要明确。
如何使用邮件代码发送邮件

如何使用邮件代码发送邮件使用编程语言发送邮件需要使用到相应的库或模块。
以下是不同编程语言中的示例代码。
1. Python:Python中最常用的库是smtplib和email。
下面是一个使用python 发送邮件的示例代码:```pythonimport smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddrdef send_email(sender_email, sender_password,recipient_email, subject, message):try:msg = MIMEText(message, 'plain') # 创建邮件正文msg['Subject'] = subject # 邮件主题server.starttls( # 启用TLS加密server.sendmail(sender_email, [recipient_email],msg.as_string() # 发送邮件server.quit( # 退出服务器print("邮件发送成功")except Exception as e:print("邮件发送失败:", str(e))#使用示例sender_password = "password"subject = "Example Subject"message = "This is the content of the email."send_email(sender_email, sender_password, recipient_email, subject, message)```2. Java:Java中可以使用JavaMail API来发送邮件。
发送电子邮件的操作流程

发送电子邮件的操作流程在现代信息化的时代,电子邮件成为了人们日常生活和工作中必不可少的沟通工具。
通过电子邮件,我们可以快速、方便地向他人发送信息和文件。
本文将为您介绍发送电子邮件的详细操作流程。
一、准备工作在发送电子邮件之前,我们需要进行一些准备工作。
1. 登录邮箱首先,我们需要登录自己的邮箱账号。
打开电子邮件客户端或者网页,输入正确的用户名和密码,完成登录。
2. 编写邮件接下来,我们需要准备要发送的邮件内容。
在“撰写”或“写信”等按钮下,打开新的邮件编辑页面。
二、填写邮件信息在新的邮件编辑页面中,我们需要填写一些必要的邮件信息。
1. 收件人在“收件人”或“To”栏目中,填写您要发送邮件的目标收件人的邮箱地址。
如果有多个收件人,可以使用逗号或分号进行分隔。
2. 抄送和密送(可选)如果需要将邮件同时抄送给其他人,可以在“抄送”或“Cc”栏目中填写相应的邮箱地址。
而如果希望将邮件抄送给某些人但不让其他收件人知道,可以填写在“密送”或“Bcc”栏目中。
3. 主题在“主题”或“Subject”栏目中,填写简洁明了的邮件主题。
主题应该能够准确概括邮件内容,方便收件人阅读和归类。
三、编辑邮件内容完成邮件信息的填写后,接下来是编辑邮件的具体内容。
1. 问候语在邮件的正文部分,可以先写上适当的问候语,例如“亲爱的”、“尊敬的”等。
这样可以让邮件更加礼貌和亲切。
2. 正文在正文部分,详细地写出您要传达的信息。
可以使用段落分隔不同的内容,使得邮件更加清晰易读。
在邮件中插入相关图片、链接或附件等,以增加信息的完整性。
3. 结尾语在邮件的结尾处,可以写上结束语和自己的署名。
常用的结束语有“祝好”、“谢谢”等,署名一般包括姓名、职务、联系方式等。
四、发送邮件完成邮件内容的编辑后,我们可以进行最后的操作,即发送邮件。
1. 预览在点击“发送”按钮前,可以先预览整封邮件。
仔细检查邮件的内容、格式和附件等,确保没有错误和遗漏。
2. 发送确认邮件内容无误后,点击“发送”按钮即可将邮件发送给收件人。
5分钟!教你用C语言发送邮件:附送源码+教学!

5分钟!教你⽤C语⾔发送邮件:附送源码+教学!前⾔相信⼤家都有过被C语⾔⽹络编程所⽀配的恐惧吧?其实,⼩编在刚刚学习这⽅⾯的知识的时候也有这样的感受,并且所有的资料都是从⽹络寻找的,但是,现在你们不同了,因为这篇⽂章将会带你们⼀步步地,写出你们第⼀个使⽤SMTP协议来发送邮件的C语⾔程序,这个和⼩编刚学习的时候可不同呀!⽂章末尾有总结,这是精髓哦⾔归正传,代码写起来!⾸先,这篇⽂章不是讲理论的⽂章,⽽是让你们动⼿实践的⽂章,⽬的在于让各位看官能动⼿写出能编译成功、能成功运⾏、能成功发送邮件的C语⾔程序,这篇⽂章不会涉及太多的理论知识,并且代码也没有经过特别的封装,旨在让各位看官能编写出这个程序,所以看官跟着⽂章动⼿做就可以了。
第⼀步⾸先,引⽤stdio.h、winsock2.h、windows.h(可有可⽆,下⽂讲到),注意,这⾥有⼀个地⽅有很多⼈会出错,如果你要引⽤windows.h的话,就得在引⽤winsock2.h之后才能引⽤windows.h,否则会出现“未定义标识符”的情况,如下图↓这是正确写法错误写法按照错误写法进⾏调试的话,会出现以下错误提⽰↓错误提⽰然后我们再声明⼀个变量和两个函数,变量是⽤来储存服务器返回的数据的,两个函数分别是⽤来创建套接字(socket)和接收服务器返回数据的,这⾥我们声明了⼀个字符型数组,数组⼤⼩我们⽤BUFSIZ代替,这⾥有⼈就会问了:“为什么⽤BUFSIZ作为数组⼤⼩呢?”,答案是:“减轻系统负担”,不理解?没关系,先把代码运⾏起来,然后再慢慢研究。
除了以上步骤,我们还需要写⼊以下两⾏代码,加⼊两个库⽂件,其中User32.lib是可有可⽆的,加⼊User32.lib只是为了能够调⽤MessageBox()函数⽽已。
到这⾥,我们的第⼀步完成了!接下来是第⼆步第⼆步初始化前期的准备⼯作做好了,我们现在开始编写我们要⽤到的函数——socket_connect_server(void),从字⾯的意思上来看,⼤家都应该明⽩这个函数是⼲嘛的吧?没错,它是⽤来创建套接字并连接SMTP服务器的。
golang实现通过smtp发送电子邮件的方法

golang实现通过smtp发送电子邮件的方法Go是一种强大的编程语言,具有广泛的应用领域。
在Go中,可以使用内置的"net/smtp"包来实现通过SMTP协议发送电子邮件。
下面是一个示例代码,演示了如何使用Go来发送电子邮件。
首先,您需要导入"net/smtp"和"fmt"包:```gopackage mainimport"fmt""net/smtp"```接下来,您需要设置SMTP服务器的主机和端口:```goconstSMTPPort = "587"```然后,定义电子邮件的主题、发件人、收件人和邮件内容:```goconstSubject = "Test email"Body = "This is a test email."```接下来,使用smtp.PlainAuth(函数创建一个Auth类型的值,用于身份验证:```go```在这个函数中,第一个参数为空字符串,将使用默认的身份验证机制。
第二个参数是发件人的电子邮件地址,第三个参数是发件人的密码,第四个参数是SMTP服务器的主机。
然后,通过调用smtp.SendMail(函数来发送电子邮件:```goerr := smtp.SendMail(SMTPServer+":"+SMTPPort, auth, From,[]string{To}, []byte(Subject+"\r\n\r\n"+Body))if err != nilfmt.Println("Failed to send email:", err)return```在这个函数中,第一个参数是完整的SMTP服务器地址和端口,第二个参数是身份验证的值,第三个参数是发件人的电子邮件地址,第四个参数是一个字符串切片,包含所有收件人的电子邮件地址,第五个参数是要发送的电子邮件的内容。
电子邮件发送具体过程

MailSSLSocketFactory mailSSLSocketFactory=new MailSSLSocketFactory();
mailSSLSocketFactory.setTrustAllHosts(true);
//信任所有主机
properties.setProperty("mail.smtp.ssl.enable", "true");
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.host", "");
//指定发送主机为qq邮件服务器
//QQ邮箱需要设置SSL加密
MailSSLSocketFactory mailSSLSocketFactory=new MailSSLSocketFactory();
//创建一个邮件回话,并给出用户名和密码,供系统登录qq服务器
Session session=Session.getDefaultInstance(properties,new Authenticator() {
public PasswordAuthentication getPasswordAuthentication(){
properties.put("mail.smtp.ssl.socketFactory",mailSSLSocketFactory);
3、 链 接
mailSSLSocketFactory.setTrustAllHosts(true);
//信任所有主机34;mail.smtp.ssl.enable", "true");
邮件发送的操作流程

邮件发送的操作流程一、准备发送邮件在进行邮件发送之前,需要进行一些准备工作:1. 确定发送人和接收人:明确需要发送邮件的对象和接收邮件的人员。
2. 登录邮箱账号:使用自己的邮箱账号和密码,登录到邮箱的邮件管理界面。
3. 创建新邮件:打开邮件管理界面后,点击"新建邮件"或类似的按钮,开始编写新邮件。
二、填写邮件信息在创建新邮件后,需要填写邮件的各项信息:1. 收件人:填写接收邮件的人员的邮箱地址,可以是一个或多个人。
2. 主题:写明邮件的主题,简短明了地概括邮件的内容。
3. 抄送和密送:如果需要抄送或密送其他人员,可以填写他们的邮箱地址。
4. 附件:如果邮件需要附带文件或照片等附件,可以添加附件。
5. 正文:在邮件的正文部分,详细写明发送的内容和需要传达的信息。
三、编辑邮件正文在填写邮件信息之后,需要认真编辑邮件的正文部分:1. 语言和格式:使用规范的语言表达,注意语法和拼写的正确性。
同时可以适当使用格式化工具,如加粗、斜体、引用等,来突出重点和增加可读性。
2. 分段落:将邮件的内容分为合理的段落,每个段落表达一个完整的意思,便于读者理解。
3. 简洁明了:尽量使用简练的语句和词汇,清晰地传达信息,避免冗长或复杂的表达方式。
四、校对和发送邮件在编辑完成邮件正文后,需要进行最后的校对工作:1. 校对语法和拼写:仔细检查邮件中可能存在的语法错误和拼写错误,确保邮件的整体质量。
2. 邮件格式:检查邮件的格式是否整齐美观,每个段落之间是否有适当的空行分隔。
3. 附件和链接:如果有附件或链接,确保它们的有效性和正确性。
最后,点击邮件发送按钮,将邮件发送给收件人。
五、关于邮件的注意事项在进行邮件发送的过程中,还需要注意以下几点:1. 敏感信息:注意在邮件中不要透露敏感的个人或机密信息,保护个人隐私和公司机密。
2. 保持礼貌:用礼貌和尊重的语言表达邮件内容,避免过于直接或冒犯性的措辞。
3. 回复和转发:如果需要回复或转发某封邮件,注意选择合适的方式,并在邮件中注明相关的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
发送电子邮件的程序一、程序界面设计smtp电子邮件发送程序的用户界面填入smtp服务器地址、邮箱用户名和口令,端口号是25,并填入发信人,发信地址填入你在该网站的免费邮箱地址。
在对话框的右面填入发送电子邮件的相关信息,选择一个附件,然后点击“发送”按钮,程序会与服务器建立TCP连接,然后按照ESMTP协议发送ELHO命令,然后发送用户名和口令,经过验证,进入SMTP会话。
通过命令交互,将邮件和附件发送出去,然后断开连接。
在此过程中,右下方的多文本列表框(RichTextBox)会显示全部的会话信息。
现在的SMTP服务器与以前不一样,一般都要经过验证身份后,才为你提供传输邮件的服务,验证的方法有很多种,这里只实现了一种,仅仅为了说明问题。
程序实现的技术要点是:1.运用Windows的消息驱动机制2.通过状态转换来控制会话命令的发布顺序3.实现了base64编码和译码。
二、创建应用程序的过程1.使用MFC AppWizard创建应用程序框架工程名是Smtp,应用程序的类型是基于对话框的,对话框的标题是“电子邮件发送客户端程序”,需要Windows Sockets的支持,其它部分接受系统的默认设置就可以。
向导自动为应用程序创建了两个类:应用程序类:CSmtpApp,基类是CWinApp,对应的文件是Smtp.h和Smtp.cpp。
对话框类:CSmtpDlg,基类是CDialog,对应的文件是SmtpDlg.h和SmtpDlg.cpp。
2.为对话框添加控件在程序的主对话框界面中添加相应的控件对象,并按照下表修改控件的属性。
3.定义控件的成员变量为对话框中的控件对象定义相应的成员变量。
4.为控件对象添加事件响应函数5.Base64编码和解码创建一个普通的类,用来实现base64编码和解码。
6.创建CMySocket类为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。
Class Type选择MFC Class,类名为CMySocket,基类是CAsyncSocket类,创建后对应的文件是MySocket.h和MySocket.cpp。
在利用类向导为CMySocket类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。
可参看下一小节的程序代码。
7.手工添加包含语句以及事件函数和成员函数的代码8.分阶段编译执行,进行测试三、程序清单1.CSmtpApp应用程序类Smtp.hSmtp.cpp//CSmtpApp::InitInstance()添加一句初始化多文本框控件的函数。
BOOL CSmtpApp::InitInstance(){if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer(); //MFC自动创建的代码AfxInitRichEdit(); //用户自己添加的...............}2.CSmtpDlg对话框类SmtpDlg.h.................#include "MySocket.h" //自己添加的包含语句#include "Base64.h" //自己添加的包含语句...............class CSmtpDlg : public CDialog{// Constructionpublic:void Display(LONG flag); //显示信息void GetHeader(); //创建电子邮件的头部CMySocket smtpSocket; //套接字类对象CSmtpDlg(CWnd* pParent = NULL); // standard constructor//类向导自动产生的窗口控件变量的声明// Dialog Data//{{AFX_DATA(CSmtpDlg)enum { IDD = IDD_SMTP_DIALOG };CString m_strAddr; //发信地址CString m_strAttach; //附件CString m_strBCC; //暗送CString m_strCC; //抄送CString m_strLetter; //信件内容CString m_strSender; //发信人CString m_strPassword; //口令UINT m_nServPort; //端口CString m_strReceiver; //收信CString m_strServName; // SMTP服务器CString m_strTitle; //主题CString m_strUserName; //用户名CString m_strInfo; //会话状态信息//}}AFX_DATA .....................//类向导自动生成的消息映射函数声明//{{AFX_MSG(CSmtpDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonView(); //点击“浏览”按钮时执行virtual void OnOK(); //点击“发送“按钮时执行//}}AFX_MSGDECLARE_MESSAGE_MAP()private:CBase64 coder; //进行Base64编码的变量BOOL GetBody(LPSTR& pszBody, int& nBodySize);//构造邮件体};..............SmtpDlg.cpp#include "stdafx.h"#include "smtp.h"#include "smtpDlg.h"#include "MySocket.h" //自己添加的包含语句#include "Base64.h" //自己添加的包含语句#define SMTP_MAXLINE 76 .....................// CSmtpDlg dialog//CSmtpDlg::CSmtpDlg()CSmtpDlg::CSmtpDlg(CWnd* pParent /*=NULL*/): CDialog(CSmtpDlg::IDD, pParent){//{{AFX_DATA_INIT(CSmtpDlg)m_strAddr = _T(""); //这一部分是由类向导自动添加的变量初始化代码m_strAttach = _T("");m_strBCC = _T("");m_strCC = _T("");m_strLetter = _T("");m_strSender = _T("");m_strPassword = _T("");m_nServPort = 0;m_strReceiver = _T("");m_strServName = _T("");m_strTitle = _T("");m_strUserName = _T("");m_strInfo = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}//类向导自动添加的窗口控件与相应控件变量的映射关系//CSmtpDlg::DoDataExchange()void CSmtpDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSmtpDlg)DDX_Text(pDX, IDC_EDIT_ADDRESS, m_strAddr);DDX_Text(pDX, IDC_EDIT_ATTACH, m_strAttach);DDX_Text(pDX, IDC_EDIT_BCC, m_strBCC);DDX_Text(pDX, IDC_EDIT_CC, m_strCC);DDX_Text(pDX, IDC_EDIT_LETTER, m_strLetter);DDX_Text(pDX, IDC_EDIT_SENDER, m_strSender);DDX_Text(pDX, IDC_EDIT_PASSWORD, m_strPassword);DDX_Text(pDX, IDC_EDIT_SERVPORT, m_nServPort);DDX_Text(pDX, IDC_EDIT_RECEIVER, m_strReceiver);DDX_Text(pDX, IDC_EDIT_SERVNAME, m_strServName);DDX_Text(pDX, IDC_EDIT_TITLE, m_strTitle);DDX_Text(pDX, IDC_EDIT_USERNAME, m_strUserName);DDX_Text(pDX, IDC_RICH_LIST, m_strInfo);//}}AFX_DATA_MAP}//类向导自动添加的消息映射BEGIN_MESSAGE_MAP(CSmtpDlg, CDialog)//{{AFX_MSG_MAP(CSmtpDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_VIEW, OnButtonView)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CSmtpDlg message handlers//CSmtpDlg::OnInitDialog()BOOL CSmtpDlg::OnInitDialog(){......................//手工添加的初始化代码// TODO: Add extra initialization herem_strSender = _T("wang"); //发信人m_strAddr=_T("***********");//发信地址m_strServName = _T(""); //smtp服务器m_nServPort = 25; //smtp的保留端口m_strUserName = _T("EXAMPLE"); //用户名m_strPassword = _T("123456"); //口令m_strReceiver=_T("***********");//收信人地址m_strTitle = _T(""); //主题m_strCC = _T(""); //抄送m_strBCC = _T(""); //暗送m_strLetter = _T(""); //信件内容m_strAttach = _T(""); //附件UpdateData(FALSE); //更新用户界面return TRUE; // return TRUE unless you set the focus to a control }................//以下函数的代码都要手工添加//当用户点击“发送”按钮时,执行此函数//CSmtpDlg::OnOK()void CSmtpDlg::OnOK(){//设定smtp类的变量,使之指向本对话框,以便传递信息smtpSocket.SetParent(this);UpdateData(TRUE); //取来用户在对话框中输入的数据smtpSocket.Create(); //创建套接字对象的底层套接字smtpSocket.Connect((LPCSTR)m_strServName,m_nServPort); //连接pop3服务器//列表框清空//while (m_listInfo.GetCount()!=0)// m_listInfo.DeleteString(0);UpdateData(FALSE); //更新用户界面}//当用户点击“浏览”按钮,寻找附件时,执行此函数//CSmtpDlg::OnButtonView()void CSmtpDlg::OnButtonView(){UpdateData(TRUE);CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All Files (*.*)|*.*||"));if (dlg.DoModal() == IDOK){CString sNewFile = dlg.GetPathName();if (m_strAttach.GetLength()){m_strAttach += _T(", ");m_strAttach += sNewFile;} else m_strAttach = sNewFile;UpdateData(FALSE);}LPSTR pszBody = NULL;int nBodySize = 0;if (!GetBody(pszBody, nBodySize)){TRACE(_T("Failed in call to send body parts body, GetLastError returns: %d\n"), GetLastError());}CString s;s = pszBody;m_strInfo += s;UpdateData(FALSE);}//根据不同的情况,向用户显示不同的信息//CSmtpDlg::Display()void CSmtpDlg::Display(LONG flag){CString s;switch(flag){case S_CONNECT: //已连接到服务器,显示信息s = "已经连接到"+m_strServName+"服务器\r\n";m_strInfo += s;break;case S_RECEIVE: //收到服务器发来的数据,显示该数据m_strInfo += stMsg;break;case S_CLOSE: //显示关闭连接的信息m_strInfo += smtpSocket.error;s = "连接已经关闭\r\n";m_strInfo += s;break;}UpdateData(FALSE); //更新用户界面}//创建电子邮件的头部//CSmtpDlg::GetHeader()void CSmtpDlg::GetHeader(){UpdateData(TRUE);CString sepa;CString sReply;sReply = _T("");//创建"Date:" 标题行内容CTime now(CTime::GetCurrentTime());CString sDate(now.Format(_T("%a, %d %b %Y %H:%M:%S ")));sDate +="+0800 (CST)";CString sBuf(sReply);if (m_strAttach.GetLength()){sReply.Format(_T("MIME-Version: 1.0\r\n"));sBuf += sReply;}//添加From 和to 字段,From字段进行了编码coder.Encode(m_strAddr);sReply.Format(_T("From: =?gb2312?B?%s?=\r\n"), coder.EncodedMessage());sBuf += sReply;sReply.Format(_T("To: %s\r\n"),m_strReceiver);sBuf += sReply;//添加Date字段sReply.Format(_T("Date: %s\r\n"),sDate);sBuf += sReply;//添加subject字段,进行了编码//Subject: =?GB2312?B?XXXXXX=?= // 主题,进行了编码coder.Encode(m_strTitle);sReply.Format(_T("Subject:=?gb2312?B?%s?=\r\n"),coder.EncodedMessage());sBuf += sReply;//如果有,添加Cc 字段if (m_strCC.GetLength()){sReply.Format(_T("Cc: %s\r\n"), m_strCC);sBuf += sReply;}//如果有,添加Bcc 字段if (m_strBCC.GetLength()){sReply.Format(_T("Bcc: %s\r\n"), m_strBCC);sBuf += sReply;}//如果需要,添加Mime 字段//MIME-Version: 1.0 // MIME版本//Content-type: multipart/mixed; // 内容类型是多部分/混合型//boundary = "NextPart_000_00A" // 指定一级边界特征字符串sepa= _T("Boundary-=_HfNFaIwtPvzJDUQrvChaEKIMklNx");if (m_strAttach.GetLength()){sReply.Format(_T("MIME-Version: 1.0\r\n"));sBuf += sReply;sReply.Format("Content-Type:Multipart/mixed;boundary=%s\r\n", sepa);sBuf += sReply;sBuf += _T("\r\n");} else {sBuf += _T("\r\n");sReply.Format(_T(" %s\r\n"), m_strLetter);sBuf += sReply;sReply.Format(_T("%c%c.%c%c"),13,10,13,10);sBuf += sReply;}smtpSocket.Send((LPCSTR)sBuf,sBuf.GetLength());m_strInfo+=sBuf;if (m_strAttach.GetLength()){sReply.Format(_T("--%s\r\n"),sepa);sBuf = sReply;sBuf += _T("Content-Type: text/plain; charset='gb2312'\r\n");sBuf += _T("Content-Transfer-Encoding: base64\r\n");sBuf += _T("\r\n");coder.Encode(m_strLetter);sReply.Format(_T("%s\r\n"),coder.EncodedMessage());sBuf += sReply;sReply.Format(_T("--%s\r\n"), sepa);sBuf += sReply;sBuf += _T("Content-Type: text/plain; charset='gb2312'\r\n");sBuf += _T("Content-Transfer-Encoding: base64\r\n");sBuf += _T("\r\n");//add LetterLPSTR pszBody = NULL;int nBodySize = 0;if (!GetBody(pszBody, nBodySize)){TRACE(_T("Failed in call to send body parts body, GetLastError returns: %d\n"), GetLastError());}sReply = pszBody;sBuf += sReply;sReply.Format(_T("--%s\r\n"), sepa);sBuf += sReply;sReply.Format(_T("%c%c.%c%c"),13,10,13,10);sBuf += sReply;smtpSocket.Send((LPCSTR)sBuf,sBuf.GetLength());m_strInfo+=sBuf;}UpdateData(FALSE);}//构造电子邮件的体部//CSmtpDlg::GetBody()BOOL CSmtpDlg::GetBody(LPSTR& pszBody, int& nBodySize){BOOL bSuccess = FALSE;//打开附件文件CFile infile;if (infile.Open(m_strAttach, CFile::modeRead | CFile::shareDenyWrite)){DWORD dwSize = infile.GetLength();if (dwSize){//读入数据BYTE* pszIn = new BYTE[dwSize];try{infile.Read(pszIn, dwSize);bSuccess = TRUE;}catch(CFileException* pEx){bSuccess = FALSE;pEx->Delete();}if (bSuccess){coder.Encode(pszIn, dwSize); //编码delete [] pszIn; //删除了输入缓冲区infile.Close(); //关闭输入文件//形成编码后的发送内容LPSTR pszEncoded = coder.EncodedMessage();int nEncodedSize = coder.EncodedMessageSize();nBodySize = nEncodedSize+(((nEncodedSize/76)+1)*2)+1;pszBody = new char[nBodySize];--nBodySize;int nInPos = 0;int nOutPos = 0;while (nInPos < nEncodedSize){int nThisLineSize = min(nEncodedSize - nInPos, SMTP_MAXLINE);CopyMemory(&pszBody[nOutPos],&pszEncoded[nInPos], nThisLineSize);nOutPos += nThisLineSize;CopyMemory(&pszBody[nOutPos], "\r\n", 2);nOutPos += 2;nInPos += nThisLineSize;}pszBody[nOutPos] = '\0'; //以空字符串结束}} else {bSuccess = TRUE;pszBody = NULL;nBodySize = 0;}} elseTRACE(_T("No bodypart body text or filename specified!\n"));return bSuccess;}3.CMySocket套接字类MySocket.h..................#include "Base64.h" //自己添加的包含语句#include <vector>#include <strstream>#include <string>using namespace std;class CSmtpDlg;//表示显示信息的标志#define S_CLOSE 1#define S_CONNECT 2#define S_RECEIVE 3#define S_GETNUMMSGS 4#define S_GETSIZEMSGS 5#define S_ENDRETR 6//表示smtp会话状态的枚举类型typedef enum {FIRST=0,EHLO,AUTH,USER,PASS,MAIL,RCPT,DATA,QUIT} STATE;//自己的套接字类定义class CMySocket : public CAsyncSocket{// Attributespublic:CString lastMsg;CString error;// Operationspublic:void Close(); //退出服务器void SetParent(CSmtpDlg * pDlg);CMySocket();virtual ~CMySocket();// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMySocket)public:virtual void OnConnect(int nErrorCode);virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CMySocket)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:private:void AnalyzeMsg(); //分析从服务器发来的数据,做出响应的响应CSmtpDlg* m_pDlg; //指向主对话框的指针STATE state; //smtp会话的状态CBase64 coder; //进行Base64编码的变量};..................MySocket.cpp ..................#include "smtpDlg.h" //自己添加的包含语句#include "Base64.h"................#define MAX_BUFF 20000//CMySocket::CMySocket()CMySocket::CMySocket(){m_pDlg = NULL;state=FIRST;error="连接不上服务器\r\n";}//CMySocket::~CMySocket()CMySocket::~CMySocket(){m_pDlg = NULL;}.................// CMySocket member functions//当套接字收到FD_CONNECT消息时,执行此函数,表明连接已建立//CMySocket::OnConnect()void CMySocket::OnConnect(int nErrorCode){if(nErrorCode==0) m_pDlg->Display(S_CONNECT);}//当套接字收到服务器发来的数据时,执行此函数//CMySocket::OnReceive()void CMySocket::OnReceive(int nErrorCode){if(nErrorCode==0){char buff[MAX_BUFF]; //接收缓冲区int rec=Receive(buff,MAX_BUFF); //接收服务器发来的数据buff[rec]=NULL; //结尾置为NULL。