Qt + CURL + mimetic 发送邮件(带附件)
使用了大名鼎鼎的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 发送邮件(带附件)的更多相关文章
- Java发送邮件(带附件)
实现java发送邮件的过程大体有以下几步: 准备一个properties文件,该文件中存放SMTP服务器地址等参数. 利用properties创建一个Session对象 利用Session创建Mess ...
- centos 使用mutt发送邮件带附件
1.安装mutt工具 yum install -y mutt 2.使用mutt发邮件并带附件echo "统计日志" | /usr/bin/mutt -s "统计日志&qu ...
- 使用System.Net.Mail中的SMTP发送邮件(带附件)
System.Net.Mail 使用简单邮件传输协议SMTP异步发送邮件 想要实现SMTP发送邮件,你需要了解这些类 SmtpClient :使用配置文件设置来初始化 SmtpClient类的新实例. ...
- python 发送邮件 带附件
# coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/5/26' # __Desc__ = 实现发送带有各种附件类型的邮件 ...
- java发送邮件带附件
package com.smtp; import java.util.Vector; public class MailBean { private String to; // 收件人 private ...
- Python发送邮件(带附件的)
有时候做自动化测试任务,任务完成后,需要将结果自动发送一封邮件,这里用到smtplib模块,直接导入就行,这里以163邮箱为例,需要用到授权码,我用类写一下: 如果是发送qq邮箱,要将smtp 改成s ...
- python3.7发送邮件带附件
代码: 1 # -*- coding: utf-8 -*- 2 3 import smtplib, ssl 4 from email.mime.text import MIMEText 5 from ...
- VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)
之前写过一篇博文,通过MAPI实现调用邮箱客户端发送邮件带附件,当时对ShellExecute研究不深,以为ShellExecute不能带附件,因为项目需求原因(MAPI只能调用Foxmail和O ...
- php中PHPMailer发送带附件的电子邮件方法
摘要: 本文讲的是php中PHPMailer发送带附件的电子邮件方法, .首先到http://phpmailer.worxware.com/ 下载最新版本的程序包 2.下载完成后,找到class.ph ...
随机推荐
- LA 3135 (优先队列) Argus
将多个有序表合并成一个有序表就是多路归并问题,可用优先队列来解决. #include <cstdio> #include <queue> using namespace std ...
- UVa 10868 (物理) Bungee Jumping
题意: 有个人在蹦极,给出悬崖的高度,绳子的长度,弹簧绳的胡克系数 以及 人的质量. 判断人是否能够着地,能的话是否能安全着地.所谓安全着地就是到达地面的速度不超过10m/s. 分析: 学过一点高中物 ...
- Windows SDK 实现不规则窗口介绍
不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...
- 最受Web前端开发者欢迎的五大开发工具
工其事,必利于器.好的开发工具毋容置疑会帮助Web前端开发者事半功倍,51CTO在上期主办的技术沙龙<大型网站PHP开发之道> 对现场的百余位Web开发者做了问卷调查,后经51CTO调研小 ...
- Shell中取时间格式方法
Shell中取时间格式方法2007-09-13 15:35常用date的显示格式: date +%F //2007-03-06date +%Y%m%d//20070306 date +%T //23: ...
- 【转】android:layout_gravity和android:gravity的区别
1.首先来看看android:layout_gravity和android:gravity的使用区别. android:gravity: 这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置 ...
- Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset
原文 Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset DataSet相当你用的数据库: DataTable相当于你的表.一个 DataSet 可以包含多个 DataTab ...
- web自动化框架之四测试报告的搭建
现状: 看过前面的文章,楼主用的是python,所以在搭建测试报告这块的时候使用的是unittest+htmlTestRunner:然后发现生成出来的报告,总是有那么不完美的地方,比如想增加图片,比如 ...
- Config配置文件详解
(默认的配置设置)以下所有的代码都应该位于 <configuration> <system.web> 和 </system.web> </configurat ...
- sensor_HAL分析
http://blog.csdn.net/new_abc/article/details/8971807 http://blog.csdn.net/cs_lht/article/details/817 ...