/* 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. Silverlight 2学习笔记二:三个基本布局控件(Canvas、StackPanel、Grid )

    这篇文章主要是翻译了ScottGu博客的文章:Silverlight Tutorial Part 2: Using Layout Management.虽然是翻译,但通过笔记记录,我发现对这三个布局控 ...

  2. Codeforces--633D--Fibonacci-ish (map+去重)(twice)

     Fibonacci-ish Time Limit: 3000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u Su ...

  3. 【RAID在数据库存储上的应用 】

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  4. HTTP缓存控制 总结

    一.HTTP响应头.请求头中与缓存控制的相关字段 二.一个页面访问缓存的流程 三.三种刷新的实际操作 四.如何设置缓存 一.HTTP响应头.请求头中与缓存控制的相关字段 浏览器向服务器发起请求后,服务 ...

  5. [Swift通天遁地]八、媒体与动画-(7)实现多个动画的顺序播放效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Akka源码分析-Persistence-AtLeastOnceDelivery

    使用过akka的应该都知道,默认情况下,消息是按照最多一次发送的,也就是tell函数会尽量把消息发送出去,如果发送失败,不会重发.但有些业务场景,消息的发送需要满足最少一次,也就是至少要成功发送一次. ...

  7. python网络爬虫之图片链家在技术.seleninum和PhantonJS

    一.什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...

  8. mysql数据的操作

    一.插入数据记录 1.插入完整数据记录 INSERT INTO table_name VALUES(value1,value2......valuen); 2.插入数据记录的一部分 INSERT IN ...

  9. RESTful 设计理论

    RESTful 设计: 1.协议通信协议:https 2.域名部署在API专用域名下,除非API很简单(https://www.example.com/api)https://api.example. ...

  10. 将class类对象转化成json的数据格式

    直接上代码: JSONObject的的使用需要导入json-lib-2.4-jdk15.jar包,下载地址:http://mvnrepository.com/artifact/net.sf.json- ...