0

C ++で簡単な送信メールアプリケーションを持っていますが、実行するとリンクエラーが発生します。何が問題ですか?別の質問ですが、エラーはホスト名引数に関連していますか? 「smtp.google.com」に設定しましたか?

 #include "io.h"
 #include "winsock2.h"      /* WSAGetLastError, WSAStartUp  */
 #include <iostream>
 using namespace std;
 #define snprintf _snprintf


 static void sendmail_write(
            const int  sock,
            const char *str,
            const char *arg
        ) {
 char buf[4096];

 if (arg != NULL)
    snprintf(buf, sizeof(buf), str, arg);
 else
    snprintf(buf, sizeof(buf), str);

 send(sock, buf, strlen(buf), 0);
}

static int sendmail(
            const char *from,
            const char *to,
            const char *subject,
            const char *body,
            const char *hostname,
            const int   port
        ) {

struct hostent *host;
struct sockaddr_in saddr_in;
int sock = 0;


WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    return -1;
}


  sock = socket(AF_INET, SOCK_STREAM, 0);
host = gethostbyname(hostname);

saddr_in.sin_family      = AF_INET;
saddr_in.sin_port        = htons((u_short)port);
saddr_in.sin_addr.s_addr = 0;

memcpy((char*)&(saddr_in.sin_addr), host->h_addr, host->h_length);

if (connect(sock, (struct sockaddr*)&saddr_in, sizeof(saddr_in)) == -1) {
    return -2;
}

 sendmail_write(sock, "HELO %s\n",       from);    // greeting
 sendmail_write(sock, "MAIL FROM: %s\n", from);    // from
 sendmail_write(sock, "RCPT TO: %s\n",   to);      // to
 sendmail_write(sock, "DATA\n",          NULL);    // begin data

 // next comes mail headers
 sendmail_write(sock, "From: %s\n",      from);
 sendmail_write(sock, "To: %s\n",        to);
 sendmail_write(sock, "Subject: %s\n",   subject);

 sendmail_write(sock, "\n",              NULL);

 sendmail_write(sock, "%s\n",            body);    // data

 sendmail_write(sock, ".\n",             NULL);    // end data
 sendmail_write(sock, "QUIT\n",          NULL);    // terminate

 close(sock);

 return 0;
}


int main(int argc, char *argv[]) {

int ret = sendmail(
    "someone@gmail.com",  // from
    "someone@gmail.com", // to
    "Subject",
    "body",
    "smtp.google.com",
    25
);

if (ret != 0)
    cout<< "Failed to send mail (code: %i).\n";
else
    cout<<"Mail successfully sent.\n";

return ret;
}

私のエラーはこれです:

エラー LNK2019: 関数 "int __cdecl sendmail(char const *,char const *,char const *,char const *,char const *,int)" で参照されている未解決の外部シンボル __imp__connect@12 (?sendmail@@YAHPBD0000H@Z)


「smtp.gmail.com」を試してみましたが、例外はありませんが、「メールは正常に送信されました」と表示されますが、受信トレイにはメールがありません。何か案が?

4

1 に答える 1

1

Windowsソケットライブラリをリンクしていることを確認してください。

#pragma comment(lib, "ws2_32.lib")

ws2_32.libまたは、プロジェクトリンク設定に追加されます。

WS2_32.libをリンクする方法を参照してください

于 2013-02-04T07:29:17.573 に答える