发送邮件编程原理

来源:互联网 发布:面试软件开发岗位 编辑:程序博客网 时间:2024/05/17 00:11

一、用telnet发送邮件

邮件系统使用esmtp协议,按照协议规定的格式,我们就可以不用启动邮件客户端来发邮件.

esmtp是smtp协议的进化版,主要是为了防止垃圾邮件的泛滥.esmtp比smtp协议添加了验证用户身份等.


打开cmd.
1. 输入       telnet smtp.qq.com 25    回车
我试验了好几个邮箱服务器,大都有严厉的反垃圾邮件系统,导致邮件发不出去,幸好qq的邮箱竟然可以.TX威武呀.smtp的协议端口为25.
2. 输入       helo smtp.qq.com   回车
我搜集的一些资料中既有使用helo又有使用ehlo的,结果还使我纠结了好久,后来又google才知道,原来都可以.这句应该是与服务器打招呼.如果返回250表示服务器准备就绪,可以进行下一步了.
3. 输入       auth login    回车
这是指定登录的模式,这句应该是一般模式.返回334就可以进行下一步了.
4. 输入       经过base64加密的你的账户名,比如你的qq号是123456,就去百度下 base64加密,然后找个地方将你的q号加密,copy到命令行回车
返回334,下一步是输入经过base64加密过的你的密码
5. 输入       你的base64加密过的密码,方法同上
然后服务器返回235,表示验证通过,可以进行下一步了.
6. 输入       mail from:<****@qq.com>         这里写你的qq邮箱
服务器返回250.
7. 输入       rcpt to:<****@qq.com>             这里写你要发送给的qq邮箱,貌似其他邮箱不可以
服务器返回250,下一步
8. 输入       data
表示开始传送数据,服务器返回354
9. 输入       subject:你的主题
此处服务器无回显
10. 输入        此处什么也不用写,直接回车换行,作为主题与正文的分界
此处服务器无回显
11. 输入         在这里写你的正文就可以了
此处服务器也无回显
12. 输入         .
对,就是一个英文句号,表示数据传送完毕,服务器返回250
13. 输入        quit

服务器返回221,就安了,完成了,看看邮件收到了没

来自:http://hi.baidu.com/hygf99/blog/item/80dedec396862428e4dd3bf5.html


二、QT发送邮件编程测试(源码修改)

[cpp] view plaincopy
  1. #include <QApplication>  
  2. #include <QTcpSocket>  
  3. #include <QThread>  
  4. #include <QDebug>  
  5.   
  6. #include <stdio.h>  
  7. #include <iostream>  
  8.   
  9. using namespace std;  
  10.   
  11. static void communication(QTcpSocket & socket, const char *msg)  
  12. {  
  13.         char data[1024];  
  14.   
  15.         if (socket.write(msg, qstrlen(msg)) == -1)  
  16.                 qDebug() << "@@@@@@@@@@@@@@ socket.write failed";  
  17.         socket.flush();  
  18.   
  19.         if (socket.waitForReadyRead(-1) == true)  
  20.         {  
  21.             memset(data, '\0'sizeof(data));  
  22.             socket.readLine(data, 1024);  
  23.             qDebug() << data;  
  24.         }  
  25. }  
  26.   
  27. static void smtpCommunication(QTcpSocket & socket)  
  28. {  
  29.         communication(socket, "helo sina.com\r\n");  
  30.         communication(socket, "auth login\r\n");  
  31.         communication(socket, QByteArray("xxx@sina.com").toBase64()+"\r\n");  
  32.         communication(socket, QByteArray("xxx").toBase64()+"\r\n");  
  33.         communication(socket, "mail from: <xxx@sina.com>\r\n");  
  34.         communication(socket, "rcpt to: <xxx@qq.com>\r\n");  
  35.         communication(socket, "data\r\n");  
  36.         communication(socket, "From: xxx@sina.com\r\nTo: xxx@qq.com\r\n"  
  37.                               "Subject: QT EMAIL\r\n\r\n"  
  38.                               "QT EMail Test!"  
  39.                               "\r\n.\r\n");  
  40.         communication(socket, "quit\r\n");  
  41.   
  42.         qDebug() << "send email ok." << endl;  
  43. }  
  44.   
  45. static void readWelcome(QTcpSocket & socket)  
  46. {  
  47.         char data[1024];  
  48.         int len;  
  49.   
  50.         if (socket.waitForReadyRead(-1) == true)  
  51.         {  
  52.             memset(data, '\0'sizeof(data));  
  53.             len = socket.readLine(data, 1024);  
  54.             qDebug() << data << endl;;  
  55.         }  
  56. }  
  57.   
  58. int main(int argc, char* argv[])  
  59. {  
  60.         QTcpSocket socket;  
  61.   
  62.         socket.connectToHost("smtp.sina.com", 25);  
  63.   
  64.         if (socket.waitForConnected(2000))  
  65.         {  
  66.                 qDebug() << "smtp server connected success.";  
  67.                 readWelcome(socket);  
  68.                 smtpCommunication(socket);  
  69.                 socket.close();  
  70.         }  
  71.         else  
  72.                 qDebug() << "connection failed.";  
  73.   
  74.         return 0;  
  75. }  

来自:http://blog.chinaunix.net/uid-7210505-id-146366.html
其他:http://blog.csdn.net/zhangmiaoping23/article/details/6130080
0 0