使用了大名鼎鼎的CURL 开源库,以及mimetic开源库。

CURL支持N多协议。功能超强,但是不能直接发邮件附件,需要自己拼mime。太麻烦,于是乎~~

mimetic主要用于构造邮件mimetic格式数据。

CURL:http://curl.haxx.se/

mimetic:http://www.codesink.org/mimetic_mime_library.html

源码:http://download.csdn.net/detail/kfbyj/6566431

	m_Email.SetUserInfo("你的邮箱帐号", "你的邮箱密码");
m_Email.SetHost("smtp://smtp.163.com"); //你的邮箱smtp服务器地址
m_Email.AddReceiver("<XXXX@163.com>"); //添加一个接受邮件者
m_Email.AddAttach("附件绝对路径"); //添加一个附件
m_Email.SetSend("邮件主题", "邮件内容", "联系方式");
m_Email.start(); //开始发送,,线程
/************************************************************************/
/* author : 狂风暴雨
* date : 2013年11月14日 14:11:49
* desc : 一份邮件的线程
* */
/************************************************************************/ #ifndef EMAIL_H
#define EMAIL_H #include "third_party/curl/curl.h" #include <QStringList>
#include <QObject>
#include <QThread> class Email : public QThread
{
Q_OBJECT public:
Email(QObject *parent);
~Email(); //发送一封右键
void run(); void SetSend(const QString& subject, const QString& content, const QString& contact); //设置服务器地址
void SetHost(const QString& host) { m_smtpServer = host;}
QString Host() {return m_smtpServer;} //设置用户密码
void SetUserName(const QString& name);
QString UserName() { return m_userName;} void SetPassword(const QString& password);
QString Password() { return m_passWord;} void SetUserInfo(const QString& name, const QString& password); //添加收信人,返回收信人数目
int AddReceiver(const QString& receiver);
QStringList Receiver() { return m_receiverList;} //附件
int AddAttach(const QString& attachPath);
QStringList Attachs() { return m_attachsList;}
void RemoveAttach(int index); int Result() {return m_res;} //重置
void Reset();
signals:
void signalSendResult(int); private:
CURLcode m_res; //主题
QString m_subject;
QString m_content;
QString m_contact; //用户密码
QString m_userName;
QString m_passWord; //stmp 服务器
QString m_smtpServer; //接受人列表
QStringList m_receiverList; //附件列表
QStringList m_attachsList; static int ReadData(void* ptr, size_t size, size_t nmemb, void* userp);
}; #endif // EMAIL_H

==============================================================================================================================
==============================================================================================================================


#include "email.h"
#include "third_party/mimetic/mimetic.h"
#include "utils/utils.h" struct UserData
{
std::stringstream ss;
size_t total;
UserData() : total(0),
ss()
{}
}; Email::Email(QObject *parent)
: QThread(parent)
{
m_receiverList.clear();
m_attachsList.clear();
} Email::~Email()
{ } void Email::run()
{
mimetic::MultipartMixed head;
head.header().from(utils::QStringToUtf8String(m_userName));
head.header().subject(utils::QStringToUtf8String(m_subject));
head.header().push_back(mimetic::Field("Mime-Version","1.0"));
struct curl_slist *slist = NULL;
for (int i = 0; i < m_receiverList.size(); ++i)
{
slist = curl_slist_append(slist, utils::QStringToUtf8String(m_receiverList.at(i)).c_str());
head.header().to(utils::QStringToUtf8String(m_receiverList.at(i)).c_str());
} //添加邮件内容
mimetic::MimeEntity* pMeContent = new mimetic::MimeEntity;
pMeContent->body().assign(utils::QStringToUtf8String(m_content + tr("\nContact Info:") + m_contact));
head.body().parts().push_back(pMeContent); //如果有附件添加附件
for (int i = 0; i < m_attachsList.size(); ++i)
{
mimetic::MimeEntity* pMe = new mimetic::MimeEntity;
pMe->header().push_back(mimetic::Field("Content-Transfer-Encoding","base64"));
FILE *pfile = fopen(utils::QStringToUtf8String(m_attachsList.at(i)).c_str(), "rb");
char buffer[4096];
uint32_t totalreadbytes = 0;
while (!feof(pfile))
{
uint32_t readbytes = fread(buffer, 1, 4096, pfile);
if (ferror(pfile) || readbytes == 0)
break; totalreadbytes += readbytes;
mimetic::Base64::Encoder b64;
std::stringstream temp;
std::ostreambuf_iterator<char> out(temp);
//转为BASE64编码,目标存放至std::stringstream中
mimetic::code(buffer, buffer + readbytes, b64, out);
std::string str = temp.str();
std::cout<<str;
pMe->load(str.begin(), str.end(), mimetic::imNone);
}
fclose(pfile);
QString fileName = utils::PathFindFileName(m_attachsList.at(i));
pMe->header().push_back(mimetic::Field(
utils::QStringToUtf8String("Content-Type: application/octet-stream; name=" +
fileName)));
pMe->header().push_back(mimetic::Field(utils::QStringToUtf8String("Content-Disposition : attachment; filename=" +
fileName)));
head.body().parts().push_back(pMe);
} struct UserData ud;
ud.ss<<head;
ud.ss.seekg(0, std::ios::end);
ud.total = ud.ss.tellg();
ud.ss.seekg(0, std::ios::beg); CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, utils::QStringToUtf8String(m_smtpServer).c_str());
curl_easy_setopt(curl, CURLOPT_USERNAME, utils::QStringToUtf8String(m_userName).c_str());
curl_easy_setopt(curl, CURLOPT_PASSWORD, utils::QStringToUtf8String(m_passWord).c_str());
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, utils::QStringToUtf8String(m_userName).c_str()); //发送者
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, slist);
curl_easy_setopt(curl, CURLOPT_READDATA, &ud);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, ReadData);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
} m_res = curl_easy_perform(curl);
curl_slist_free_all(slist);
curl_easy_cleanup(curl);
} void Email::SetSend(const QString& subject, const QString& content, const QString& contact)
{
m_subject = subject;
m_contact = contact;
m_content = content;
} void Email::Reset()
{
m_userName.clear();
m_passWord.clear();
m_smtpServer.clear();
m_receiverList.clear();
m_attachsList.clear();
} void Email::SetUserName(const QString& name)
{
m_userName = name;
} void Email::SetPassword(const QString& password)
{
m_passWord = password;
} void Email::SetUserInfo(const QString& name, const QString& password)
{
m_userName = name;
m_passWord = password;
} int Email::AddReceiver(const QString& receiver)
{
m_receiverList.append(receiver);
return m_receiverList.size();
} int Email::AddAttach(const QString& attachPath)
{
m_attachsList.append(attachPath);
return m_attachsList.size();
} void Email::RemoveAttach(int index)
{
m_attachsList.removeAt(index);
} int Email::ReadData(void* ptr, size_t size, size_t nmemb, void* userp)
{
struct UserData * pstream = static_cast<struct UserData *>(userp);
if (pstream->ss.eof())
return 0; size_t before = pstream->ss.tellg();
pstream->ss.read((char*)ptr, size*nmemb);
size_t after = pstream->ss.tellg();
if (pstream->ss.eof())
return pstream->total - before;
return after - before;
}

Qt + CURL + mimetic 发送邮件(带附件)的更多相关文章

  1. Java发送邮件(带附件)

    实现java发送邮件的过程大体有以下几步: 准备一个properties文件,该文件中存放SMTP服务器地址等参数. 利用properties创建一个Session对象 利用Session创建Mess ...

  2. centos 使用mutt发送邮件带附件

    1.安装mutt工具 yum install -y mutt 2.使用mutt发邮件并带附件echo "统计日志" | /usr/bin/mutt -s "统计日志&qu ...

  3. 使用System.Net.Mail中的SMTP发送邮件(带附件)

    System.Net.Mail 使用简单邮件传输协议SMTP异步发送邮件 想要实现SMTP发送邮件,你需要了解这些类 SmtpClient :使用配置文件设置来初始化 SmtpClient类的新实例. ...

  4. python 发送邮件 带附件

    # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/5/26' # __Desc__ = 实现发送带有各种附件类型的邮件 ...

  5. java发送邮件带附件

    package com.smtp; import java.util.Vector; public class MailBean { private String to; // 收件人 private ...

  6. Python发送邮件(带附件的)

    有时候做自动化测试任务,任务完成后,需要将结果自动发送一封邮件,这里用到smtplib模块,直接导入就行,这里以163邮箱为例,需要用到授权码,我用类写一下: 如果是发送qq邮箱,要将smtp 改成s ...

  7. python3.7发送邮件带附件

    代码: 1 # -*- coding: utf-8 -*- 2 3 import smtplib, ssl 4 from email.mime.text import MIMEText 5 from ...

  8. VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)

      之前写过一篇博文,通过MAPI实现调用邮箱客户端发送邮件带附件,当时对ShellExecute研究不深,以为ShellExecute不能带附件,因为项目需求原因(MAPI只能调用Foxmail和O ...

  9. php中PHPMailer发送带附件的电子邮件方法

    摘要: 本文讲的是php中PHPMailer发送带附件的电子邮件方法, .首先到http://phpmailer.worxware.com/ 下载最新版本的程序包 2.下载完成后,找到class.ph ...

随机推荐

  1. HTTPS通信机制

    概述 使用HTTP协议进行通信时,由于传输的是明文所以很容易遭到窃听,就算是加密过的信息也容易在传输中遭受到篡改,因此需要在HTTP协议基础上添加加密处理,认证处理等,有了这些处理机制的HTTP成为H ...

  2. UVa 10735 (混合图的欧拉回路) Euler Circuit

    题意: 给出一个图,有的边是有向边,有的是无向边.试找出一条欧拉回路. 分析: 按照往常的思维,遇到混合图,我们一般会把无向边拆成两条方向相反的有向边. 但是在这里却行不通了,因为拆成两条有向边的话, ...

  3. Java Web编程的主要组件技术——JSP

    参考书籍:<J2EE开源编程精要15讲> JSP(Java Server Page)页面由HTML代码和嵌入其中的Java代码组成. 简单的JSP页面如: <html> < ...

  4. UVA 11374 Airport Express(最短路)

    最短路. 把题目抽象一下:已知一张图,边上的权值表示长度.现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小. 当加上一条边a->b,如果这条边更新了最短路,那么起点st- ...

  5. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

  6. OK335xS psplash Screen 移植

    /*********************************************************************** * OK335xS psplash Screen 移植 ...

  7. 【Mysql】安装 mysql-5.7.5 指南

    因为同学需要安装mysql,安装过程,一路百度,在这里记录一下步奏.以后还会用到. 1.mysql-5.7.5-m15-winx64.zip下载 官方网站下载地址:http://cdn.mysql.c ...

  8. 【转】Android Studio -修改LogCat的颜色*美爆了*

    原文网址:http://www.2cto.com/kf/201505/400357.html 一. 先看效果 二.设置 File->Settings 或Ctrl + Alt +S 找到 Edit ...

  9. 给IT新男的15点建议:苦逼程序员的辛酸反省与总结

    很多人表面上看着老实巴交的,实际上内心比谁都好强.自负.虚荣.甚至阴险.工作中见的多了,也就习惯了. 有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌.但是他们所表现的又未必不是真性情. 我 ...

  10. IIS部署网站