使用C发送电子邮件

时间:2012-02-02 10:55:01

标签: c sockets smtp winsock send

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

要点:

  1. 我学会了初始化winsock。 SMTP端口(25)。成功创建和连接套接字。我现在应该怎么做?!!! (我被困在这里)
  2. 我不想要一个准备工作的代码。我想学。因此,需要任何书籍,文档,教程或文章建议。
  3. 我知道C本身对网络一无所知,这是否意味着我必须下载一些库? (我使用的是VS2010,Windows 7)
  4. 以下是我目前阅读的网页链接:

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

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

    我了解了类型(WSADATAaddrinfo structuresockaddrSOCKET)和函数(WSAStartup()WSACleanup(),{ {1}},getaddrinfo()Shutdown()WSAGetLastError(),...)

    我刚刚开始阅读有关socket() http://www.faqs.org/rfcs/rfc821.html

    的这篇文章

    这是我到现在所写的内容:

    SMTP
    我离开了吗?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

你应该看看some examples on smtp via telnet:)

基本上你需要用明文输入这样的东西:

HELO local.domain.name 
MAIL FROM: mail@domain.ext
RCPT TO: mail@otherdomain.ext
DATA
...
根据{{​​3}}

编辑,您的代码应为:

// 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

答案 2 :(得分:2)

我会推荐你​​这篇文章:

SMTP Client - CodeProject

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

答案 3 :(得分:0)

RFC 5321是基本SMTP协议的官方规范。

RFC 2822是基本电子邮件格式的官方规范。

请注意,有许多其他RFC可以扩展基本规则。例如,RFC 1651扩展了SMTP,因此可以实现其他功能,例如通过AUTH extension进行安全身份验证。和MIME(RFC 20452046204720482049)通常用于现代电子邮件系统,以允许附件,HTML / RTF,等

转到IETF's website查看大多数Interpet协议使用的所有可用RFC规范。

答案 4 :(得分:0)

bytes_to_receive = sizeof(packet)

received_bytes = 0; 做{     received_bytes + = recv(buffer + received_bytes,bytes_to_receive - received_bytes) } while(received_bytes!= bytes_to_receive)