本人剛開始學習C++,用的是Qt5.5的IED,經過了兩天的學習和查找資料,終於成功發了第一封郵件。以163郵箱為例,簡單總結一下。
1、設置郵箱
這一步比較關鍵,要開通smtp服務,在開通的過程中會讓你輸入一個郵箱客戶端授權碼,這個才是你后面要用到的密碼,而不是你登陸郵箱的密碼;
2、找代碼
也許你會問我,為什么不自己寫呢?還是不太懂smtp,先看看別人的怎么寫。
先了解了一下郵件是怎么被發出去的。
telnet命令發送郵件
打開cmd.
1. 輸入 telnet smtp.163.com 25 回車
我試驗了好幾個郵箱服務器,大都有嚴厲的反垃圾郵件系統,導致郵件發不出去,幸好163的郵箱竟然可以.TX威武呀.smtp的協議端口為25.
2. 輸入 HELO smtp.163.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,就安了,完成了,看看郵件收到了沒.
3、如果你發成功了,就可以考慮如何用代碼實現這個發郵件的過程。
網上找了一個比較靠譜的發郵件的工具類,可以拿來用,叫 sendemailapi (http://messyink.cn/download/sendemailapi.zip)。
當然有些代碼還是需要寫的~
//實例化發送郵件對象
SmtpClient smtp("smtp.163.com", 25, SmtpClient::TcpConnection); smtp.setUser("******@163.com"); smtp.setPassword("******"); //構建郵件主題,包含發件人收件人附件等.
MimeMessage message; message.setSender(new EmailAddress("******@163.com")); //逐個添加收件人
message.addRecipient(new EmailAddress("******@163.com")); //構建郵件標題
message.setSubject(QStringLiteral("系統檢測")); //構建郵件正文
MimeText text; text.setText(QStringLiteral("測試簡單文本發送!")); message.addPart(&text); if (!smtp.connectToHost()){ qDebug() << QStringLiteral("服務器連接失敗!"); } if (!smtp.login()){ qDebug() << QStringLiteral("用戶登錄失敗!"); } if (!smtp.sendMail(message)){ qDebug() << QStringLiteral("郵件發送失敗!"); }else{ qDebug() << QStringLiteral("郵件發送成功!"); } smtp.quit();
4、到了這一步,確實是把郵件發出來了。但是一看郵件頓時驚呆了。竟然全都是亂碼,最后通過朋友的幫助,在所有的漢字上加上了QStringLiteral(),結果才算好了。
參考:
http://blog.csdn.net/etwdone/article/details/52995496
http://www.qtcn.org/bbs/read-htm-tid-56050.html