• 締切済み

perlでSocketを使いたいけど、、、

利用しているプロバイダーに問い合わせたら「Socketは使えるがサポートはしない」と回答がありました。  でも require 'sys/socket.ph'として動いてくれません。 やろうとしていることはソケットを使ってSMTPを呼び出しメールを送ろうとしています。

noname#36584
noname#36584
  • CGI
  • 回答数2
  • ありがとう数7

みんなの回答

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.2

sendmail とかは使えないんですかね? 単純にメールを送るのであればこれでいけると思うんですけど・・・ 実際私が使っているCGIでは動いています。

noname#36584
質問者

お礼

sendmailは使えます。 しかしもともとのスクリプトはフリーで手に入れたもので、メールを送るのにちょっと複雑なことをしているため私の力量ではこれをsendmailに書き換えられない^_^;  トライはしたのですが動かない。  なんとかsocketのままでと思っています。

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.1

私もsocket.phは動いた試しが無いので使ったことがありません。 そもそも見当らないし(爆)。そんなもの使わずに自分で書いた って大した事ではないのではないでしょうか?

noname#36584
質問者

お礼

実は私はスクリプトを書けません。^_^;  フリーのCGIを自分のページにコピーしてるだけ、、  自分で書くのは「大した事」なんです。 考えられることはsocket.phが存在しない、送り先のSMTPサーバーが受信を拒否などを疑っていますが確かめる術を知らないものでここで質問させていただきました。

関連するQ&A

  • Socketモジュール互換の plライブラリ?

    ニフティでメール送信を行いたいのですが、sendmailが使えないので、最悪SMTPのプロトコルでPerlを使って通信をしたいのですが、ニフティではモジュールも使えないので、困っています。デコードメールは、制限が多く使いたくありません。Socketモジュール互換のライブラリなどあるのでしょうか? あと@niftyではPHPは使えるのでしょうか?

    • ベストアンサー
    • CGI
  • PerlでSMTP-AUTH認証をする

    現在、さくらのレンタルサーバにてperlスクリプトを稼動しています。 今回、さくらのレンタルサーバのメール認証がPOP before SMTPからSMTP認証(SMTP-AUTH)に変更になりましたので、perlスクリプト内で自動メール送信させるのにNet::SMTP::TLSモジュールを利用することにしました。そこで (1)SMTPサーバー名、ポート番号、ユーザー名、パスワードを設定する (2)宛先などの必要な設定をする (3)メール内容を設定する (4)メールヘッダを設定する (5)メールを送信する という流れで現在perlスクリプトを以下のように記述しました。 #!/usr/bin/perl use CGI::Carp qw(fatalsToBrowser); use Net::SMTP::TLS; use Authen::SASL; my $smtp = Net::SMTP::TLS->new($mailhost, Port => $mailport, User => $mail_username, Password => $mail_password ); $smtp->mail($from_mail); $smtp->to($tomail); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; 変数の値は割愛していますが、 上記のスクリプトは、POP before SMTPの時は問題なくメール送信できたのですが、サーバのメール認証がSMTP認証(SMTP-AUTH)に変更になってからは以下のようなエラーが出ます。 invalid SSL_version specified at /usr/local/perl/5.8/lib/perl5/site_perl/5.8/IO/Socket/SSL.pm line 418 何か間違いであるとか、他に必要な設定がありますでしょうか? 宜しくご教授お願いいたします。

    • ベストアンサー
    • Perl
  • Linuxのsocket接続でacceptできない

    Ubuntu 10.10 + gcc4.4 + eclipse で C言語プログラミングをしています。 ソケットを使用したプログラムを試していたのですが、思うように動作しません。 作成したプログラムは以下のようなものです。 ・ローカルマシン上で、サーバプログラム、クライアントプログラムを用意する ・サーバ側はソケット作成後、クライアントが接続するまで listen する ・クライアントはサーバに接続したら、接続した旨を表示する という初歩的なものです。 問題は、サーバ側が accept したときに戻り値 -1 を返却して終了してしまうことです。 以下が作成したソースです。 ■■■▼ サーバ側ここから ▼■■■ #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un srv; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: mksock <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* srv 初期化 */ memset(&srv, 0, sizeof(srv)); srv.sun_family = AF_UNIX; strncpy(srv.sun_path, argv[1], sizeof(srv.sun_path)); /* バインド */ if((bind(sockfd, (struct sockaddr *)&srv, SUN_LEN(&srv))) < 0){ exit(EXIT_FAILURE); } /* クライアントからの接続待ち */ if((listen(sockfd, 5)) < 0) { exit(EXIT_FAILURE); } printf("socket available: %s, sockfd=%d\n", srv.sun_path, sockfd); /* 接続がある限りくりかえす */ int sockResult; while(1) { sockResult = accept(sockfd, (struct sockaddr *)&srv, &socklen); printf("sockResult = %d, sun_path=%s\n", sockResult, srv.sun_path); if (sockResult < 0) break; puts("new connection granted"); } puts("mksock end"); exit(EXIT_SUCCESS); } ■■■▲ サーバ側ここまで ▲■■■ ●●●▼ クライアント側ここから ▼●●● #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un cli; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: sockconn <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* クライアント設定 */ memset(&cli, 0, sizeof(cli)); cli.sun_family = AF_UNIX; strncpy(cli.sun_path, argv[1], sizeof(cli.sun_path)); /* サーバへ接続 */ socklen = SUN_LEN(&cli); if(connect(sockfd, (struct sockaddr *)&cli, socklen)) { exit(EXIT_FAILURE); } printf("connected to socket %s\n", cli.sun_path); exit(EXIT_SUCCESS); } ●●●▲ クライアント側ここまで ▲●●● これから作成されたバイナリを同一フォルダに置いて、作成ユーザで、カレントディレクトリで実行しました。 以下が実行時の入出力です(カッコ内は実行順序)。 ■▼ サーバ側ここから ▼■ $ ./mksock jjj1…(1) $ socket available: jjj1, sockfd=3 $ sockResult = -1, sun_path=jjj1 $ mksock end ■▲ サーバ側ここから ▲■ ●▼ クライアント側ここから ▼● $ ./sockconn jjj1…(2) $ connected to socket jjj1 ●▲ クライアント側ここから ▲● 上記のように、サーバ側が accept 時に -1 を返却しています。 パーミッションについては以下になっています。 srwxr-xr-x 1 hoge hoge 0 2011-09-04 21:36 jjj1 -rwxr--r-- 1 hoge hoge 86870 2011-09-04 21:36 mksock -rwxr--r-- 1 hoge hoge 86775 2011-09-04 21:36 sockconn パーミッションを見る限り、ソケットファイルにはアクセスできているかと。 おそらく環境周りではないかと思いますが、考えつきません。 linux プログラミングに詳しいかた、よろしくお願いいたします。

  • androidのsocketエラー

    androidのソケット通信プログラムを作成しています。 何度もソケットの接続・切断を繰り返していると、以下のエラーが発生します。 Socket.connect メソッド(接続)で発生しています。 socketは毎回.closeメソッドで切断しています。 このようになると、端末を再起動しない限りソケット接続を再度行なうことはできない模様です。このエラーの発生理由がわかりません。お詳しい方おられましたら何卒よろしくお願いします。 ちなみに利用しているandroid端末はKYL21(京セラ androidバージョン4.0.4)です。 01-09 09:06:46.418: W/System.err(29936): java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available) 01-09 09:06:46.418: W/System.err(29936): at libcore.io.IoBridge.connect(IoBridge.java:114) 01-09 09:06:46.418: W/System.err(29936): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 01-09 09:06:46.418: W/System.err(29936): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460) 01-09 09:06:46.418: W/System.err(29936): at java.net.Socket.connect(Socket.java:838) 01-09 09:06:46.418: W/System.err(29936): at java.net.Socket.connect(Socket.java:791) 01-09 09:06:46.418: W/System.err(29936): at com.example.simple_test.Wifi_Service.Socket_Connect(Wifi_Service.java:2033) 01-09 09:06:46.428: W/System.err(29936): at com.example.simple_test.Wifi_Service$10.run(Wifi_Service.java:1938) 01-09 09:06:46.428: W/System.err(29936): Caused by: libcore.io.ErrnoException: connect failed: ENOBUFS (No buffer space available) 01-09 09:06:46.428: W/System.err(29936): at libcore.io.Posix.connect(Native Method) 01-09 09:06:46.428: W/System.err(29936): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 01-09 09:06:46.428: W/System.err(29936): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 01-09 09:06:46.428: W/System.err(29936): at libcore.io.IoBridge.connect(IoBridge.java:112) 01-09 09:06:46.428: W/System.err(29936): ... 6 more

  • 独自ドメインを取得して、メールサーバを構築してSMTP送信する場合、

    独自ドメインを取得して、メールサーバを構築してSMTP送信する場合、 大手のドメインでないので、はねられる可能性があります。 その際にプロバイダのSMTPを利用することが多いと思いますが、 プロバイダのSMTPがサービスとして提供されていなかった場合、 そのようにしてメールを送信したらいいのでしょうか? ほかの(無料で?)SMTPサービスを提供しているサーバを利用するしかないのでしょうか? [探しましたが、ないような気がしています]

  • ruby(cgi)からメールが送信できない

    require "nkf" require "net/smtp" sendmail('local', 'title', output, 'admin@hoge.co.jp', "hoge@hoge.co.jp") とすると、正常にメールがhoge@hoge.co.jp宛に送信されます。 require "nkf" require "net/smtp" sendmail('local', 'title', output, 'admin@hoge.co.jp', $mail) ※$mailには"hoge@hoge.co.jp"が格納されています。 こうするとメールが送られて来ません。 問題はどこにあるのでしょうか?

  • メール送信が出来ない(Eudora)

    今まで、Eudora Pro 4.2.2-Jを使用しておりましたが、機会があり、6Jにバージョンアップしました。ところが、メールの受信はしたものの、肝心の送信が出来ずに困っております。プロバイダではSMTPサーバーに異常はなく、ウエブメールからの送信は可能でありました。ユーザー登録もしておりますので、利用制限がかかっていると言うこともありません。バージョンアップした途端に送信が不可能になってしまいましたがどうしてでしょうか。一応、SMTPサーバードメインもチェックしたのですが、特に問題はありませんでした。 プロバイダはso-netです。 livedoorのサポートも土日はやっておりませんので、正直困っております。 どなたか助けてください!

    • 締切済み
    • Mac
  • 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もやってみました。(結果同じ)

  • メール送信できません。

    Windows Vista のWindowsメールが再セットアップ後受信はできて送信のみできなくなりました。 プロバイダはYafooでサイトを参考に設定しましたが、 「 ホスト 'SMTP' が見つかりません。 サーバー名が正しいことを確認してください。 件名 '送信', アカウント: 'pop3', サーバー: 'SMTP', プロトコル: SMTP, ポート: 587, セキュリティ (SSL): あり, ソケット エラー: 11001, エラー番号: 0x800CCC0D 」 ポートは既定の25を入力してもだめでした。また、ヤフーメールを利用したり送信メールサーバーもいろいろ試しましたが同じでした。 数ヶ月前もサイセットアップした時はすんなりできたのに今回はなにが違うのかわからずに困っています、なにか思い当たることがある方教えてください、よろしくお願いいたします。

  • Socket通信の0バイト受信について

    現在、仕事でソケット通信によるファイル転送処理をJavaで実装しています。 単体テスト、結合テストと転送先のサーバを変えて行っているうちに結合テスト用のサーバにファイル転送するタイミングで、0バイト受信をしてしまうことがわかりました。 (※サイズが小さいファイルに起きやすいのかもしれません。。。なぜ・・・) プログラム内容は単体、結合とも同様です。 サーバは両方ともSolaris8です。 両者ともWeblogicを使用しています。 最初はプログラムでソケットが開きっぱなしなのでは?と疑いを持って、確認していましたが、単体環境で成功しているのに、結合環境で失敗するのを見ていると、転送先のサーバの設定やWeblogicに問題があるのでは?と思っています。 いろいろ調べてみたところ、下記サイトでそれっぽいことが書かれていましたが、実際にどの環境をどう直せば良いのかまでは至りませんでしたので、同じような経験がおありでしたら、是非ともアドバイスを頂きたく、質問させて頂きました。 ■UNIXソケットプログラミング http://hp.vector.co.jp/authors/VA003991/kouza/senior/kouza_socket.html お手数ですが、回答お待ちしております。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう