天天看點

QT開發-郵件發送工具

作者:QT教程

一直想用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服務。

QT開發-郵件發送工具

運作截圖:

QT開發-郵件發送工具
QT開發-郵件發送工具

粗略步驟:

第一步:布局好界面,控件命名好,建議用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();
           

【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】

點選這裡:「連結」