如何使用C语言发送电子邮件?

12

我想知道如何使用C语言发送电子邮件?我在谷歌上搜索了一下,但没有找到合适的内容。


1
可能是在Linux中从C/C++程序发送电子邮件的重复问题。 - rogerdpack
6个回答

13

在类Unix系统中,您可以按以下方式使用systemsendmail

#include <stdio.h>
#include <string.h>

int main() {

        char cmd[100];  // to hold the command.
        char to[] = "sample@example.com"; // email id of the recepient.
        char body[] = "SO rocks";    // email body.
        char tempFile[100];     // name of tempfile.

        strcpy(tempFile,tempnam("/tmp","sendmail")); // generate temp file name.

        FILE *fp = fopen(tempFile,"w"); // open it for writing.
        fprintf(fp,"%s\n",body);        // write body to it.
        fclose(fp);             // close it.

        sprintf(cmd,"sendmail %s < %s",to,tempFile); // prepare command.
        system(cmd);     // execute it.

        return 0;
}

我知道这很丑陋,而且有几种更好的方法可以做到...但它能工作 :)


请不要使用 system(3) - ScumCoder
@ScumCoder,为什么要说“请不要使用system(3)”? - Enrique René
@EnriqueRené 因为这是一个巨大的安全漏洞。请阅读 man 页面底部。 - ScumCoder

11
使用libcurl。它支持SMTP和TLS,以防需要身份验证才能发送邮件。他们提供了一些示例C代码

6
更加便携的方法是使用在GPL许可下的libquickmail (http://sf.net/p/libquickmail),它甚至支持发送附件。
示例代码:
  quickmail_initialize();
  quickmail mailobj = quickmail_create(FROM, "libquickmail test e-mail");
  quickmail_set_body(mailobj, "This is a test e-mail.\nThis mail was sent using libquickmail.");
  quickmail_add_attachment_file(mailobj, "attachment.zip", NULL);
  const char* errmsg;
  if ((errmsg = quickmail_send(mailobj, SMTPSERVER, SMTPPORT, SMTPUSER, SMTPPASS)) != NULL)
    fprintf(stderr, "Error sending e-mail: %s\n", errmsg);
  quickmail_destroy(mailobj);

2

在类Unix系统上运行sendmail并将电子邮件传递给其标准输入,或使用某些SMTP客户端库连接到SMTP邮件服务器。


2
最明显的选择:
  1. 使用system()调用现有的命令行工具发送邮件。这种方法不太便携(需要一个带有给定调用语法的外部工具等),但非常易于实现。
  2. 使用某个库。
  3. 自己实现SMTP,并直接与邮件服务器通信。这是一项繁重的工作。

我确实想学习如何像你在第三个选项中提到的那样自己实现SMTP。你知道有什么相关的教程、文章或源代码吗? - mehmet6parmak
4
未来,请尽量不要推荐使用system(),而是使用exec()函数族。 - user1831086
1
@rogue:谢谢。但是system()更具可移植性,而exec*()仅适用于Unix系统。 - unwind
1
@unwind:通常来说,这并不重要,因为您想要执行的命令已经比您用于执行它的函数更不可移植。例如,坚持使用system("/usr/sbin/sendmail whatever");没有太多意义,因为任何没有exec*的系统也不会有/usr/sbin/sendmail。但是,如果命令是用户可配置的,那么使用system可能有机会实现。 - Steve Jessop
1
我指的是我们不会在具有设置用户ID或设置组ID特权的程序中使用system(),因为某些环境变量的奇怪值可能会被用来破坏系统完整性。 - user1831086

2

您也可以使用邮件命令。

在C程序中,使用邮件命令和系统函数,您可以向用户发送电子邮件。

 system("mail -s subject  address < filename")

  Example
 system ("mail -s test hello@gmail.com < filename")

注意:该文件应存在。如果您想输入内容,可以在文件内输入内容,然后将该文件发送给接收者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接