socketでgoogle経由メール送信ができない

このQ&Aのポイント
  • Raspberry Piでsocketを使ったC言語プログラムで、googleのsmtpサーバーを利用してメールを送信したいが、接続できない。
  • 「ssmtp」を利用した「sendmailコマンド」によるgoogleのsmtpサーバー経由メール送信はできた。
  • ユーザー認証が関係しているかどうかや、ユーザ認証をどのようにすべきかが分からない。参考ページを探している。
回答を見る
  • ベストアンサー

socketでgoogle経由メール送信ができない

linuxも通信(socketも)もほぼ素人です。よろしくお願いします。  Raspberry Piでsocketを使ったC言語プログラムで、googleのsmtpサーバー(smtp.gmail.com)を利用してメールを送信したいのですが、「connect」のところで「Network is unreachable(errno=101)」で接続できないのですが、解決方法をご教授ください。  ちなみに「ssmtp」を利用した「sendmailコマンド」によるgoogleのsmtpサーバー経由メール送信は、どうにかできました。 その時もポート番号587(TLS)と二段階認証「アプリケーションに固有のパスワード」では、苦労させられました。  今回も、この段階でユーザー認証が関係あるのでしょうか? というよりも、この先、どこでユーザ認証をどのようにすれば良いかもわからないのですが、C言語でsocket利用した、googleのsmtpサーバー二段階認証に対応した参考ページがありましたら、あわせてご紹介ください。 <環境> ハード:Raspberry Pi Type-B OS:Raspbian GNU/Linux 7 \n \l コンパイラ:gcc version 4.6.3 (Debian 4.6.3-14+rpi1) 通信経路:Raspberry Pi:無線LAN(DHCP) - スマホWi-Fiテザリング <プログラム> int main(void) { int sockfd ; int len , i ; struct sockaddr_in address ; int result ; char mesg[100] ; //** (1)socketの作成 *************************** sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd < 0) { perror("socket"); printf("%d\n", errno); exit(1); } //** (2)サーバに接続 ************************** address.sin_family = AF_INET ; address.sin_addr.s_addr = inet_addr("smtp.gmail.com"); // メールサーバーのIP address.sin_port = htons(587); // TLS:587ポート番号 len = sizeof(address); result = connect(sockfd , (struct sockaddr *)&address , len); if ( result == -1 ) { perror("connect"); printf("%d\n", errno); exit(1); } //------------------------------------------------------------------------ /* 接続した時のサーバーからの合図を受信 */ GetRes(sockfd); /* HELO を送る */ strcpy(mesg,"HELO raspi.ina.co.jp\n\0") ; // 送り手のホスト。ドメイン名 i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); /* MAIL FROM:*****@gmail.com を送る */ strcpy(mesg,"MAIL FROM:*****@gmail.com\n\0"); i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); /* RCPT TO:*****@gmail.com を送る */ strcpy(mesg,"RCPT TO:*****@****.com\n\0"); i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); /* DATA を送る */ strcpy(mesg,"DATA\n\0") ; i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); /* 内容を送る */ strcpy(mesg,"test message\n\0") ; i = strlen(mesg); SendData(sockfd , i , mesg); /* 内容の終了を意味するピリオドを送る */ strcpy(mesg,".\n\0") ; i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); /* quit を送る */ strcpy(mesg,"QUIT\n\0") ; i = strlen(mesg); SendData(sockfd , i , mesg); GetRes(sockfd); close(sockfd); return (0); } // GetRes()関数 <-- recv() // SendData()関数 <-- send() // は、省略 <確認したこと> (1)pingは、通ります。 $ ping smtp.gmail.com PING gmail-smtp-msa.l.google.com (173.194.**.***) 56(84) bytes of data. 64 bytes from pb-in-f108.1e100.net (173.194.**.***): icmp_req=1 ttl=45 time=714 ms (2)DNSの設定(よさそうなんですけど) $ route カーネルIP経路テーブル 受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース default 192.168.**.1 0.0.0.0 UG 0 0 0 wlan0 192.168.**.0 * 255.255.255.0 U 0 0 0 wlan0 /etc/resolv.conf 192.168.**.1 (3)ポート番号は、25,465もやってみました。(結果同じ)

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1620/5655)
回答No.1

inet_addr()の仕様を調べてみてください。

mossan2010
質問者

お礼

早々のご回答ありがとうございます >inet_addr()の仕様を調べてみてください。 分かりました。 「ドット付き10進表記」にしないといけないんですね。 これで、一歩前進できます。 本当にありがとうございました。

関連するQ&A

  • socket経由でHTMLを表示

    するために test.pl: #!/usr/local/bin/perl use Socket; $addr=(gethostbyname("www.ndl.go.jp"))[4]; $name=pack("S n a4 x8",2,80,$addr); socket(S,PF_INET,SOCK_STREAM,0); connect(S,$name); binmode(S); select(S);$|=1;select(stdout); print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; print "Content-type: text/html\n\n"; while(<S>){print;} close(S); をPerlが実行できるプロバイダのスペースにアップして Meのie6ブラウザからtest.plを表示させるとエラーになります どうしたらエラーを回避して "http://www.ndl.go.jp/index.html"(国立国会図書館) を表示することができるでしょうか?

    • ベストアンサー
    • Perl
  • objective-c iphoneからUDP送信

    iphoneからUDPで192.168.0.3、3054ポートに0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05の13バイトのバイナリデータを送信したいのですが、以下のソースで実行可能でしょうか?ご教授お願いします。 #import <CoreFoundation/CoreFoundation.h> #import <sys/socket.h> #import <netinet/in.h> CFSocketRef socket = CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketNoCallBack, NULL, NULL); struct sockaddr_in addr; addr.sin_len = sizeof(struct sockaddr_in); addr.sin_family = AF_INET; addr.sin_addr.s_addr = addr.sin_addr.s_addr = inet_addr(”192.168.0.3); addr.sin_port = htons(3054); CFDataRef address = CFDataCreate(NULL, (UInt8*)&addr, sizeof(struct sockaddr_in)); char* message = "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5"; CFDataRef data = CFDataCreate(NULL, (UInt8*)message, strlen(message)); CFSocketSendData(socket, address, data, 3); CFRelease(socket); CFRelease(address); CFRelease(data); char*messageはおかしいですかね…。宜しくお願いします。

  • SOCKETで入手したデータを抜き出したい

    他サーバのHTMLから部分的に抜き出したいと思っています。 他サーバのHTMLを表示する所までは出来たのですが、抜き出す所が出来ずに困っています。 私が抜き出そうと、表示のwhile文内を下記に変えた所、何も表示されなくなりました。  if( $_ =~ m/抜き出したい頭のキーワード/ ){ $flag = 1;}  if( $_ =~ m/表示したい尾のキーワード/ ){ $flag = 0;}  if( $flag eq 1){ print $_;} このwhile文内には変数に代入するとどうもNGのようです。 教えてGooの過去ログにも同様の質問があったのですが、 解決に至っていませんでした。ご教示願います。 ↓現在のソースコード ---------------------------- #!/usr/local/bin/perl -w use strict; use Socket; # Socket モジュールを使う # 接続先ホスト名 my $host = 'www.xxxx.co.jp'; # HTTP プロトコルを使う my $port = getservbyname('http', 'tcp'); # ホスト名を、IP アドレスの構造体に変換 my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 my $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$host のポート $portに接続できません。\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWW サーバに HTTP リクエストを送る print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; # ヘッダ部分を受け取る while (<SOCKET>){ # 改行のみの行ならループを抜ける m/^\r\n$/ and last; } # ボディ部分を受け取り、表示 while (<SOCKET>){ print $_; }

    • ベストアンサー
    • Perl
  • UDPでのブロードキャスト送信

    Linuxで下記UDPブロードキャスト送信プログラムを作ったのですが、sendto()関数の戻り値が-1となり エラーとなってしまうので送信できません。 何が悪いのでしょうか? ちなみにIPアドレスは192.168.0.1 サブネットマスクは255.255.0..0でやっています。 又、サブネットマスクを0.0.0.0で試してもみましたがダメでした。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> int main() { int sock; struct sockaddr_in addr; int yes = 1; sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("255.255.255.255"); setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof(yes)); if(sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr))!=5) printf("send error!!\n"); close(sock); return 0; }

  • ITです。早速ですがwinsockでURLを指定した接続確認をしたいの

    ITです。早速ですがwinsockでURLを指定した接続確認をしたいのですが、うまくいきません。 下記のソースで、URLを指定してinet_addr関数呼び出すと-1、 gethostbynameを呼び出すと0が却ってきてしまい、うまく接続出来ません。 IPアドレス(127.0.0.1)を指定すれば、上記の関数は成功するのですが。 URLからIPアドレスの変換方法が解りません。 どうか助けて下さい。 int main(int argc, char* argv[]) { WSADATA wsaData; sockaddr_in server; SOCKET sock; long err; hostent *host; char *url = "http://www.yahoo.co.jp"; // winsock2の初期化 err = WSAStartup(MAKEWORD(2,0), &wsaData); if (err != 0) { printf("WSAStartup error = %d\n", err); return(-1); } // ソケットの取得 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { printf("socket error = %d\n", WSAGetLastError()); return(-1); } // IPアドレスの取得 memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.S_un.S_addr = inet_addr(url); if (server.sin_addr.S_un.S_addr == -1) { host = gethostbyname(url); if (host == NULL) { printf("host not found host = %d\n", WSAGetLastError()); return(-1); } }

  • MacOSXでのネットワークプログラミング

    MacOSXでのネットワークプログラミング 現在、MacOSXでC言語を使用してネットワークプログラミングを勉強しています。 簡単なクライアントアプリケーションを作成して、サーバーに接続しようとするのですが、 connect関数のところで、エラーが発生して失敗してしまいます。 エラー関数を調べたところ、errno=13, 「Permission denied」がでています。 root権限で実行、ファイアウォールを無効にしても同じでした。 原因が分からないので、よろしくお願いします。 ◯サンプルソース int main() { struct sockaddr_in server; int sock, n; char buf[32]; sock = socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.s_addr = inet_addr("www.google.co.jp"); n = connect(sock, (struct sockaddr *) &server, sizeof (server)); if (n == -1) { printf("[ERROR](%d): %s\n", errno, strerror(errno)); } else { memset(buf, 0, sizeof (buf)); n = read(sock, buf, sizeof (buf)); printf("%d, %s\n", n, buf); } close(sock); return 0; } ◯開発環境 MacOSX 10.6 (64bit) Netbeans 6.8 gcc 4.2.1

  • GmailをMail Distributorで設定する。

    Mail Distributorに登録をしたのですが、エラーになってしまいます。正しい方法をどなたか教えていただけませんか?ちなみに設定は以下の通りです。 SMTPサーバー smtp.gmail.com ポート    465 SMTP送信元の名前サーバー ○○○○ SMTPoverSSLを利用するにチェック 送信用のメールアドレス ○○@gmail.com 受信用のメールアドレス ○○@gmail.com POPサーバー  pop.gmail.com ユーザー名  ○○@gmail.com パスワード  ○○○○○○○○ 宜しく願いします。

  • socket使用時の環境変数(REMOTE_ADDR)について

    色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • サーバ移転後、運営サイトからメールが送信できません!

    さくらのレンタルサーバを利用してましたが、 さくらの専用サーバ(OS:CentOS 5)に申し込み、 現在利用しております。 http://server.sakura.ad.jp/dedicated/os.html の標準構成を選んでおります。 下記を専用サーバ(OS:CentOS 5)に入れました。 Apache 2.2.× PHP 5.1.× SMTPサーバ Sendmail 8.13.× DB:MySQL 5.0.7× しかしながらメール送信が上手くいきません。 会員制サイトを運営しているのですが、 仮登録完了メールが送れず会員登録が出来ない状況なんです。 携帯アドレスも含め、色んなドメインのメールアドレスで 試してみましたが、やはりダメです。 逆引きの設定に関しましては、さくらインターネットに設定していただきました。 しかしながら逆引き設定完了の通知が来てから かなり時間が経ちましたが、未だにメールの送信不具合が解消されないんです。 また、Google Appsというwebメールツールも入れております。 google Appsを利用しますと、メールサーバーは下記のようになります。 POP: pop.gmail.com SMTP: smtp.gmail.com ドメインは abcdefghijk.net(仮名) で、メールの送信元アドレスも こちらのドメインからなんですが、やはりPOPとSMTPも abcdefghijk.net にしなければまずいでしょうか? (Google Appsも解約する) あるいは他に原因がありますでしょうか? なお、outlookのメーラーからは、 ~@abcdefghijk.net のアドレスからは、何故かちゃんと送信できました。 もちろん、POP・SMTPもGmailのものに設定しました。 POP: pop.gmail.com SMTP: smtp.gmail.com WEBサイトのシステムの問題かと思われるかもしれませんが、 レンタルサーバーのほうでは問題なくメールが送信できます。 よろしくお願いします。

  • PostPetV3でGmailを 受送信したいのですが

    メールチェック時 -------------------------------------------------- ネットワーク接続が切断されました。 補足: パスワード、ユーザ名、サーバー名などに誤りがある可能性があります。[環境設定]-[メール基本]内の設定項目を確認して下さい。 -------------------------------------------------- の、メッセージで、うまく動きません。 設定は SMTPサーバー  smtp.gmail.com POP サーバー pop.gmail.com ユーザー名 ***@gmail.com メールアドレス ***@gmail.com 名前 xxx パスワード xxxxxxxx SMTPポート番号 465 POP3ポート番号 995 認証方式 POP3 SMTPの認証  SMTPユーザー名 ***@gmail.com SMTPパスワード xxxxxxxx と、しているのですが…。  不備に気づかれた方、アドバイスお願いします。 Windows XP Home SP2

専門家に質問してみよう