首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C发送电子邮件

使用C发送电子邮件
EN

Stack Overflow用户
提问于 2012-02-02 10:55:00
回答 5查看 17.4K关注 0票数 11

我刚刚开始学习socket编程,学习了winsock,并取得了一些进展。我的问题基本上是:我想发电子邮件,我该怎么办?

应提及的要点:

  1. 我学会了初始化winsock。SMTP端口(25)。成功创建并连接到套接字。我现在该怎么办?!!(我被困在这里)
  2. 我不想要现成的工作密码。我想学习。因此,任何书籍、文档、教程或文章推荐都是必要的。
  3. 我知道C本身对网络一无所知,这是否意味着我必须下载一些库?(我使用的是VS2010,Windows 7)

以下是到目前为止我所读过的几页的链接:

基本winsock指南:http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx

我阅读了beej指南的前14页(不能发布链接,新用户最多只能发布两个超链接)

我了解了类型( WSADATAaddrinfo structuresockaddrSOCKET )和函数( WSAStartup()WSACleanup()getaddrinfo()Shutdown()WSAGetLastError()socket()、.)

我刚开始读这篇关于SMTP http://www.faqs.org/rfcs/rfc821.html的文章

到目前为止,我写的是:

代码语言:javascript
复制
#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>

#pragma comment(lib, "Ws2_32.lib") // Applications that use Winsock must be linked with the Ws2_32.lib library file.

#define HTTP_PORT "80"
#define SMTP_PORT "25"
#define HOSTNAME_PORT "101"

/*
All ports and web services names ( which are string aliases of the ports

 can be found here:
 %WINDIR%\system32\drivers\etc\services

 */

int main(void)
{
    WSADATA wsdata;
    int iresult, retval; //iresult : instant result
    SOCKET connect_socket;
    struct addrinfo *result, *ptr, hints;

    iresult = WSAStartup(MAKEWORD(2, 2), &wsdata);
    if(iresult != 0) printf("Initiation of Winsock succeeded.\n");
    else
    {
        printf("WinSock initialization failed..\n");
        WSACleanup();
        return 0;
    }

    if(LOBYTE(wsdata.wVersion) == 2 && HIBYTE(wsdata.wVersion) == 2) printf("winsock.dll is found.\n");
    else
    {
        printf("Can not find the required winsock.dll file.\n");
        WSACleanup();
        return 0;
    }

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC; // IPv4 or IPv6
    hints.ai_protocol = IPPROTO_TCP; // TCP connection ( full duplex )
    hints.ai_socktype = SOCK_STREAM; // Provides sequenced, reliable, two-way, connection-based byte streams

    connect_socket = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol);
    if(connect_socket == INVALID_SOCKET)
    {
        printf("Socket Creation failed..\n");
        WSACleanup();
        return 0;
    }
    else printf("Socket Creation Succeeded ..\n");
    WSACleanup();
    return 1;
}

我偏离航线了吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-02 10:58:15

你应该看看关于smtp通过telnet的一些例子 :)

基本上,您需要输入类似于以下内容的明文:

代码语言:javascript
复制
HELO local.domain.name 
MAIL FROM: mail@domain.ext
RCPT TO: mail@otherdomain.ext
DATA
...

根据这个例子编辑,您的代码应该是:

代码语言:javascript
复制
// Not sure about this one, maybe just "\n"
#define  SEPARATOR "\n\r"

int sendData( Socket *socket, const char *data) {
    int iResult;
    iResult = send(socket, data, (int) strlen(data), 0);
    if(iResult == SOCKET_ERROR){
      // Do error handling as you like
    }
    return iResult;
}

sendData( socket, "HELO local.doman.name" SEPARATOR);
sendData( socket, "MAIL FROM: mail@domain.ext" SEPARATOR);
sendData( socket, "RCPT TO: mail@otherdomain.ext" SEPARATOR);
sendData( socket, "DATA" SEPARATOR);
sendData( socket, "This is subject of my mail" SEPARATOR SEPARATOR);
sendData( socket, "And this is text" SEPARATOR);
sendData( socket, "." SEPARATOR); // Send mail
票数 5
EN

Stack Overflow用户

发布于 2012-02-02 10:58:19

您应该阅读如何在telnet上使用smtp。在此之后,您可以轻松地实现它。

票数 4
EN

Stack Overflow用户

发布于 2012-02-02 12:23:01

我推荐你这篇文章:

SMTP客户机- CodeProject

您也可以在linux和Windows下编译它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9111096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档