/* base64编码 */
static const char* base64_enc_map = \
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int base64_encode( char* dst, size_t* dlen, const unsigned char* src, size_t slen )
{
size_t i, n;
int C1, C2, C3;
char* p; if ( slen == )
{
return ;
} n = ( slen << ) / ; switch ( ( slen << ) - ( n * ) )
{
case :
n += ;
break;
case :
n += ;
break;
default:
break;
} if ( *dlen < n + )
{
*dlen = n + ;
return -;
} n = ( slen / ) * ;
for ( i = , p = dst; i < n; i += )
{
C1 = *src++;
C2 = *src++;
C3 = *src++;
*p++ = base64_enc_map[( C1 >> ) & 0x3F];
*p++ = base64_enc_map[( ( ( C1 & ) << ) + ( C2 >> ) ) & 0x3F];
*p++ = base64_enc_map[( ( ( C2 & ) << ) + ( C3 >> ) ) & 0x3F];
*p++ = base64_enc_map[C3 & 0x3F];
} if ( i < slen )
{
C1 = *src++;
C2 = ( ( i + ) < slen ) ? *src++ : ;
*p++ = base64_enc_map[( C1 >> ) & 0x3F];
*p++ = base64_enc_map[( ( ( C1 & ) << ) + ( C2 >> ) ) & 0x3F];
( i + ) < slen ? ( *p++ = base64_enc_map[( ( C2 & ) << ) & 0x3F] ) : ( *p++ = '=' );
*p++ = '=';
} *dlen = p - dst;
*p = ; return ;
} /* 主动连接 */
static SOCKET tcp_connect( const char* host, unsigned short port = , int msec = )
{
int ret;
SOCKET fd;
struct sockaddr_in sin;
struct hostent* h;
unsigned long ul;
struct timeval tv;
struct linger lg;
int nodelay;
fd_set fdset; /* 填充服务器地址 */
memset( &sin, , sizeof( sin ) );
sin.sin_family = AF_INET;
if ( ( h = gethostbyname( host ) ) == NULL || h->h_addrtype != AF_INET )
{
return INVALID_SOCKET;
}
memcpy( &sin.sin_addr.S_un.S_addr, h->h_addr, h->h_length );
sin.sin_port = htons( port ); /* 建socket */
if ( ( fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET )
{
return INVALID_SOCKET;
} /* 设置非阻塞 */
ul = ;
if ( ioctlsocket( fd, FIONBIO, &ul ) != )
{
closesocket( fd );
return INVALID_SOCKET;
} /* 主动连接 */
if ( connect( fd, ( const struct sockaddr* ) &sin, sizeof( sin ) ) != )
{
FD_ZERO( &fdset );
FD_SET( fd, &fdset ); memset( &tv, , sizeof( tv ) );
tv.tv_sec = msec / ;
tv.tv_usec = ( msec % ) * ; /* 超时或报错 */
if ( select( fd + , , &fdset, , &tv ) != )
{
closesocket( fd );
return INVALID_SOCKET;
}
} /* 置为阻塞 */
ul = ;
ret = ioctlsocket( fd, FIONBIO, &ul );
assert( ret == ); /*消除滞留*/
memset( &lg, , sizeof( lg ) );
ret = setsockopt( fd, SOL_SOCKET, SO_LINGER, ( const char* ) &lg, sizeof( lg ) );
assert( ret == ); /*禁用合并*/
nodelay = ;
ret = setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, ( const char* ) &nodelay, sizeof( nodelay ) );
assert( ret == ); return fd;
} #define RECV(fd, buff, suc) do { \
if (recv( (fd), (buff), sizeof( (buff) ), ) <= || \
memcmp((buff), (suc), )) \
{ \
closesocket((fd)); \
return -; \
} \
}while() #define SEND(fd, buff, len) do { \
register size_t i = (len); \
if (send( (fd), (buff), i, ) < (int)i) \
{ \
closesocket((fd)); \
return -; \
} \
}while() /* 发邮件 */
int send_mail( const char* server,
const char* user, const char* pwd, \
const char* sender, const char* receiver, \
const char* str, const unsigned char* data, size_t datalen )
{
SOCKET fd;
char buff[];
size_t len;
size_t pos; /* 连接SMTP服务器 */
fd = tcp_connect( server );
if ( fd == INVALID_SOCKET )
{
::MessageBox( NULL, "无法连接服务器,请检查网络设备!", "错误", MB_OK );
return -;
} /* 邮件问答 */
RECV( fd, buff, "" ); sprintf( buff, "HELO %s\r\n", server );
SEND( fd, buff, strlen( buff ) );
RECV( fd, buff, "" ); /* 登录过程 */
SEND( fd, "AUTH LOGIN\r\n", ); /* 请求登录 */
RECV( fd, buff, "" ); len = sizeof( buff );
base64_encode( buff, &len, ( const unsigned char* )user, strlen( user ) );
strcat( buff, "\r\n" );
SEND( fd, buff, len + ); /* 用户名 */
RECV( fd, buff, "" ); len = sizeof( buff );
base64_encode( buff, &len, ( const unsigned char* )pwd, strlen( pwd ) );
strcat( buff, "\r\n" );
SEND( fd, buff, len + ); /* 密码 */
RECV( fd, buff, "" ); /* 邮件头 */
sprintf( buff, "MAIL FROM:<%s>\r\n", sender );
SEND( fd, buff, strlen( buff ) ); /* 发送者 */
RECV( fd, buff, "" ); /* 250 Ok... */ sprintf( buff, "RCPT TO:<%s>\r\n", receiver );
SEND( fd, buff, strlen( buff ) ); /* 接收者 */
RECV( fd, buff, "" ); SEND( fd, "DATA\r\n", ); /* 请求发送数据 */
RECV( fd, buff, "" ); sprintf( buff, "From:\"javadotest\"<%s>\r\n"
"To:\"javado\"<%s>\r\n"
"Subject:邮件标题\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: multipart/mixed; boundary=\"o0o0o0o0o\"\r\n\r\n", \
sender, receiver );
SEND( fd, buff, strlen( buff ) ); /* 发送邮件内容 */
sprintf( buff, "--o0o0o0o0o\r\n"
"Content-Type: text/plain; charset=\"gb2312\"\r\n\r\n"
"%s\r\n\r\n", str );
SEND( fd, buff, strlen( buff ) ); /* 发送附件 */
strcpy( buff, "--o0o0o0o0o\r\n"
"Content-Type: application/octet-stream; name=\"附件.doc\"\r\n"
"Content-Transfer-Encoding: base64\r\n"
"Content-Disposition: attachment; filename=\"附件.doc\"\r\n\r\n" );
SEND( fd, buff, strlen( buff ) );
if ( datalen > )
{
for ( pos = ; pos < datalen; )
{
len = sizeof( buff );
memset( buff, , sizeof( buff ) ); if ( datalen - pos >= )
{
base64_encode( buff, &len, data + pos, );
strcat( buff, "\r\n" );
SEND( fd, buff, );
pos += ;
}
else
{
base64_encode( buff, &len, data + pos, datalen - pos );
strcat( buff, "\r\n" );
SEND( fd, buff, strlen( buff ) );
break;
}
}
} /* 完成发送 */
SEND( fd, "--o0o0o0o0o--\r\n.\r\nQUIT\r\n", ); /* 请求退出 */
RECV( fd, buff, "" ); /* 250 Ok */ closesocket( fd );
return ;
}

c发邮件的更多相关文章

  1. # PHP - 使用PHPMailer发邮件

    PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...

  2. Linux发邮件之mail命令

    一.mail命令 1.配置 vim /etc/mail.rc 文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com" set ...

  3. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  4. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  5. 学习linux之用mail命令发邮件

    背景 这两天工作比较闲,网上各种冲浪(这个词暴露我的网龄了).看到一位大神的文章更闲 <>.端详一番,原来是用R语言拼接字符串后用shell命令发出去.发现shell命令既然还能直接发邮件 ...

  6. linux mail利用外部邮箱地址发邮件

    mail命令发送邮件需要sendmail或postfix服务 三种常用格式发信 mail -s "标题" xxx@xxx.xxx #第一种方法,你可以把当前shell当成编辑器来用 ...

  7. 打电话,发短信,发邮件,app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739 ...

  8. iOS中如何切换到发短信、打电话、发邮件

    我们在做APP的时候,难免会遇到需要调用短信,电话等程序的时候.如美团. 当然,这些都只是一些简单的方法就可以实现,但是时间久了也会淡忘,所以想写这边博客.一是为了再捡起来复习一下,另一个相当于留个备 ...

  9. 发邮件 和 excel导出中文文件名

    /** * 发邮件 * @param email * @param subject * @param body * @throws UnsupportedEncodingException */ pu ...

  10. 【知识积累】JavaMail实现发邮件功能

    一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...

随机推荐

  1. Ip获取请求ip

    public class IPAdress { public static bool isIP(string str1) { || str1.Length > ) return false; s ...

  2. WebSocket握手总结

    网址:http://blog.csdn.net/edwingu/article/details/44040961 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器 ...

  3. Access restriction:The type JPEGCodec is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar 报错

    报错: Access restriction:The type JPEGCodec is not accessible due to restriction on required library C ...

  4. yum -y --downloadonly --downloaddir=/root/ruiy update

    依赖关系解决 ============================================================================================= ...

  5. 【WIP】Ruby CSV文件操作

    创建: 2017/09/30                                                                                       ...

  6. Akka源码分析-Router

    akak中还有一个比较重要的概念,那就是Router(路由).路由的概念,相信大家都不陌生,在akka中,它就是其他actors的一个代理,会把消息按照路由规则,分发给指定的actor.我一般喜欢把R ...

  7. quill支持json吗

    RT quill目前的驱动(2.4.2版本)不支持json,等待作者更新版本吧

  8. VUE修改每个页面title

    //index.js routes: [ { name:'home', path: '/home/:openname', component: Home, meta: { title: '首页' } ...

  9. 最容易理解的CSS的position教程——十步图解CSS的position

    CSS的positon,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行.今天在Learn CSS Positioning in ...

  10. 软件架构自学笔记-- 转载“虎牙在全球 DNS 秒级生效上的实践”

    虎牙在全球 DNS 秒级生效上的实践 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下 5 各部分: 背景介绍: 方案设计和对比: 高可用: 具体实践和落地: ...