終於有了一個晚上安靜的寫寫程序,最近一直忙着公司商務上的事情,一直想用QT實現一個調用最底層socket通信來實現的郵件發送程序,以前用C#寫過,微軟都封裝好的,不知道底層是如何實現的,只知道調用方法,這次用C++實現了下,參考了很多網上的例子。
其實說白了,無非就是smtp協議的使用,這個是國際通用的標准,所以QQ郵箱和163郵箱都可以用,都可以互發,來自百度百科的解釋:SMTP目前已是事實上的在Internet傳輸E-Mail的標准,是一個相對簡單的基於文本的協議。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被確定是存在的),然后消息文本就傳輸了。可以參見http://baike.baidu.com/link?url=UAahhbpfOatRRHfUpG6jUyrgYgF3Kj7ll2WkJ6104RiAETv-jh-f-Xm1fwWMotrP
項目名稱:郵件發送工具
開發環境:XP+QT4.7+QT CREATOR2.8+MINGW
已編譯通過測試平台:XP、Win7、ubuntu、tiny210、TE6410
技術實現:通過socket通信實現smtp協議,根據應答解析協議並作出處理發送郵件
基本功能:
1:支持主流郵箱例如163郵箱QQ郵箱的發送。
2:支持富文本發送,可以發送帶有HTML格式的文本。
3:支持多個附件發送,附件可以是圖片。
說明:163郵箱和126郵箱,發送端口都是25,不使用SSL協議,而QQ郵箱必須使用SSL協議,端口為465。如果是QQ郵箱發送的話,前提要在QQ郵箱設置中將smtp協議開通,否則發送不成功,我就困在這里半個小時,結果收到QQ郵箱發過來的一封郵件,內容如下:
你妹啊,默認QQ郵箱沒有開啟SMTP服務。
運行截圖:
粗略步驟:
第一步:布局好界面,控件命名好,建議用pascal命名法。
第二步:准備好sendemailapi文件夾,里面存放的公開的第三方的支持發送附件和富文本的MIME協議文件。添加到項目中。
第三步:實例化郵件發送對象
SmtpClient smtp(ui->cboxServer->currentText(),
ui->cboxPort->currentText().toInt(),
ui->ckSSL->isChecked()?SmtpClient::SslConnection:SmtpClient::TcpConnection);
smtp.setUser(ui->txtSender->text());
smtp.setPassword(ui->txtSenderPwd->text());
第四步:構建郵件主題,包含發件人收件人附件等
MimeMessage message;
message.setSender(new EmailAddress(ui->txtSenderAddr->text()));
//逐個添加收件人
QStringList receiver = ui->txtReceiverAddr->text().split(';');
for (int i = 0; i < receiver.size(); i++){
message.addRecipient(new EmailAddress(receiver.at(i)));
}
//構建郵件標題
message.setSubject(ui->txtTitle->text());
//構建郵件正文
MimeHtml text;
text.setHtml(ui->txtContent->toHtml());
// //如果直接發送簡單文本,使用以下方法
// MimeText text;
// text.setText("測試簡單文本發送!");
message.addPart(&text);
//構建附件
QString atta=ui->txtAtta->text();
if (atta!=""){
QStringList attas=atta.split(";");
foreach (QString tempAtta, attas) {
QFile *file=new QFile(tempAtta);
if (file->exists()){
message.addPart(new MimeAttachment(file));
}
}
}
第五步:登錄服務器發送郵件
if (!smtp.connectToHost()){
QMessageBox::critical(this,"錯誤","服務器連接失敗!");
return;
}
if (!smtp.login()){
QMessageBox::critical(this,"錯誤","用戶登錄失敗!");
return;
}
if (!smtp.sendMail(message)){
QMessageBox::critical(this,"錯誤","郵件發送失敗!");
return;
}else{
QMessageBox::information(this,"錯誤","郵件發送成功!");
}
smtp.quit();
CSDN下載地址:
源碼下載:http://download.csdn.net/detail/feiyangqingyun/7030449
可執行文件下載:http://download.csdn.net/detail/feiyangqingyun/7030459