【问题标题】:How can I send e-mail in C?如何在 C 中发送电子邮件?
【发布时间】:2021-08-13 20:05:46
【问题描述】:

我只是想知道如何使用 C 发送电子邮件?我用谷歌搜索了一下,但找不到任何合适的东西。

【问题讨论】:

标签: c email


【解决方案1】:

在类 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,为什么“请不要使用system(3)”?
  • @EnriqueRené 因为这是一个巨大的安全漏洞。阅读手册页底部。
【解决方案2】:

使用libcurl。它支持 SMTP 和 TLS,以防您需要验证发送。 他们提供了一些example C code

【讨论】:

    【解决方案3】:

    更便携的方法是使用根据 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);
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        最明显的选择:

        1. 使用system() 调用现有的命令行工具来发送邮件。不太便携(需要具有给定调用语法的外部工具等),但很容易实现。
        2. 使用一些库。
        3. 自己实现SMTP,并直接与邮件服务器对话。很多工作。

        【讨论】:

        • 确实,我想学习如何自己实现 SMTP,正如您在第三个选项中提到的那样。你知道任何相关的教程、文章或源代码吗?
        • 以后尽量不要推荐 system() 而是推荐 exec() 系列函数。
        • @rogue:谢谢。但 system() 更便携, exec*() 仅适用于 Unix。
        • @unwind:这通常是无关紧要的,因为您要执行的命令已经比您用来执行它的函数的可移植性差。例如,坚持system("/usr/sbin/sendmail whatever"); 没有多大意义,因为任何没有exec* 的系统也不会有/usr/sbin/sendmail。但是,如果该命令是用户可配置的,那么您就有机会使系统正常工作。
        • 我指的是我们不使用具有 set-user-ID 或 set-group-ID 权限的程序中的 system() ,因为可能会使用某些环境变量的奇怪值破坏系统完整性。
        【解决方案6】:

        您也可以使用 mail 命令。

        在 C 程序中使用 mail 命令和系统函数可以将邮件发送给用户。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-22
          • 2015-04-01
          • 2020-03-03
          • 2012-05-17
          • 2016-04-17
          • 1970-01-01
          相关资源
          最近更新 更多